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

问题描述 投票:2回答:1

我创建了一个脚本,用于标识一组唯一的文件(来自大型列表),并将文件路径保存为唯一变量(例如$ 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

我在这里使用文件+ =,eval函数等尝试了一些不同的选项,并继续收到错误消息:-bash:vol0001.nii.gz:command not found。有没有解决的办法?文件名需要采用字符串格式,以便输入后续处理步骤。

谢谢,大卫

string bash shell loops unix
1个回答
2
投票

使用数组:

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[@]}"

注意:命令sed -n "$N p" file打印文件的第N行(与cat file | head -$N | tail -1相同)

© www.soinside.com 2019 - 2024. All rights reserved.