如何编写一个bash脚本来迭代创建新脚本

时间:2018-08-21 18:48:06

标签: bash

我如何编写一个遍历所有主题的脚本,并为每个主题创建一个新脚本?目的是创建一个脚本,该脚本在超级计算机上针对每个主题运行名为FreeSurfer的程序。超级计算机队列限制了每个脚本/作业将花费多长时间,因此我将让每个作业运行1个主题。最终,由于我不能同时提交所有作业,所以我想使作业提交过程自动化。在我的主题文件夹中,我有三个主题:3123、3315和3412。

我对MATLAB脚本很熟悉,所以我在想像这样的东西

for i=1:length(subjects)
    nano subjects(i).sh
        <contents of FreeSurfer script>
        input: /subjects(i)/scan_name.nii
        output: /output/subjects(i)/<FreeSurfer output folders>
end

我知道我混合了MATLAB和linux的各个方面,但希望目标是相对明确的。请让我知道是否有更好的方法。

这是给定主题的FreeSurfer脚本的示例

#!/bin/bash
#PBS -l walltime=25:00:00
#PBS -q long

export FREESURFER_HOME=/gpfs/software/freesurfer/6.0.0/freesurfer
source $FREESURFER_HOME/SetUpFreeSurfer.sh

export SUBJECTS_DIR=/gpfs/projects/Group/ppmi/freesurfer/subjects/

recon-all -i /gpfs/projects/Group/ppmi/all_anat/3105/Baseline/*.nii -s 
$SUBJECTS_DIR/freesurfer/subjects/3105 -autorecon-all

-i选项提供输入,-s选项提供输出。

1 个答案:

答案 0 :(得分:0)

更改脚本以接受主题作为参数,以便只有一个通用脚本。

#!/bin/bash
#PBS -l walltime=25:00:00
#PBS -q long

subject="$1"

export FREESURFER_HOME=/gpfs/software/freesurfer/6.0.0/freesurfer
source $FREESURFER_HOME/SetUpFreeSurfer.sh

export SUBJECTS_DIR=/gpfs/projects/Group/ppmi/freesurfer/subjects/

recon-all -i /gpfs/projects/Group/ppmi/all_anat/"$subject"/Baseline/*.nii -s 
$SUBJECTS_DIR/freesurfer/subjects/"$subject" -autorecon-all

您可以针对所有主题调用它

for s in 3123 3315 3412; 
do
   ./yourscriptnamehere.sh "$s"
done

根据需要添加错误处理。