Bash将变量值从for循环传递到嵌套的for循环

时间:2018-10-19 16:47:39

标签: bash shell

我有一个嵌套的for循环,外循环遍历目录列表(主题文件夹),这些目录将进入每个目录的子目录并查找特定文件。找到该文件后,该目录将备份一个文件,以便使内部循环位于正确的目录中才能正常工作。然后,内部循环在主题文件夹中查找特定的子目录,输入这些子目录,并查找3个特定的文件。文件名被分配给变量,然后将其传递给Matlab函数。

#!/usr/bin/env bash

for i in *; do #subject ID
    cd "/cygdrive/g/Data/2015_0197/$i/ASL_Data/T1_Processed" #enter into 
    specific directory
    ref_img="*smoothed*" #look for specific file1
    echo $ref_img
    cd .. #move out of directory

    for j in *ASL*; do #look for specific subdirectories
        cd "/cygdrive/g/Data/2015_0197/$i/ASL_Data/$j" #cd to each 
        subdirectory
        src_img=$i"_"$j".nii" #look for specific file2
        other_img1=$i"_"$j"_PDmap.nii" #look for specific file3
        other_img2=$i"_"$j"_ASL_fmap.nii" #look for specific file4

        echo "2nd instance---- $ref_img"
        echo $src_img
        echo $other_img1
        echo $other_img2

        #eventually call matlab function
        #matlab -nodesktop -nosplash -wait -r           
        #"coreg('$ref_img','$src_img','$other_img1','$other_img2'); exit;"
        cd ..
    done
done

在第7行,我获得了ref_img的正确文件名,但是它没有传递到嵌套的for循环中,因为第14行将简单地回显2nd instance---- *smoothed*。我怎样才能通过该文件名?我已经研究过管道,但是由于我对Bash的新手知识,所以我不知道如何实现,甚至不合适。

1 个答案:

答案 0 :(得分:1)

问题在于ref_img包含通配符并保留它们。因此,当您使用它时,它将使用那些通配符。这些文件不在新目录中。因此,请更换

ref_img="*smoothed*"

使用

ref_img=$( echo *smoothed* )