使用循环将带有文件名的变量列表串在一起

时间:2018-09-25 22:48:03

标签: string bash shell loops unix

我创建了一个脚本,该脚本可以识别一组唯一的文件(从一个很大的列表中),并将文件路径另存为唯一变量(例如$ vol1,$ vol2,$ vol3 ...参见下文)。

for volume in `seq 1 $num_ap_files` 
    do
    bindex=$(cat ../b0_volumes_tmp.txt | head -$volume | tail -1)
    eval 'vol'${volume}=$(cat ../all_volumes.txt | head -$bindex | tail -1)
    done

我想将变量连接到一个字符串变量中,以用作单独命令行程序的输入。由于卷的数量可能有所不同-创建具有以下性质的循环似乎最合适(???定义我遇到的问题):

??? files=$vol1
for i in `seq 2 $num_ap_files
do
??? eval files=${files}" $vol"${i) 
done

我在这里使用files + =,eval函数等尝试了一些不同的选项,并继续收到错误消息:-bash:vol0001.nii.gz:找不到命令。有没有解决的办法?文件名必须为字符串格式,以供后续处理步骤使用。

谢谢, 大卫

1 个答案:

答案 0 :(得分:2)

为此使用数组:

/StateDataSet/State[Name ='Washington' and not (State[Name='Washington'] = following-sibling::State[Name='Washington'])]/City

变量vol=() for ((volume = 1; volume <= num_ap_files; volume++)); do bindex=$(sed -n "$volume p" ../b0_volumes_tmp.txt) vol[$volume]=$(sed -n "$bindex p" ../all_volumes.txt) done files="${vol[*]}" 包含数组files的内容作为一个字符串。

如果您现在想使用vol的每个元素作为参数来调用命令,则无需使用vol这样的中间变量:

files

注意:命令my_next_command "${vol[@]}" 打印文件的第N行(与您的sed -n "$N p" file相同)