使用循环将变量列表与文件名串在一起
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用循环将变量列表与文件名串在一起相关的知识,希望对你有一定的参考价值。
我创建了一个脚本,用于标识一组唯一的文件(来自大型列表),并将文件路径保存为唯一变量(例如$ 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。有没有解决的办法?文件名需要采用字符串格式,以便输入后续处理步骤。
谢谢,大卫
答案
使用数组:
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
相同)
以上是关于使用循环将变量列表与文件名串在一起的主要内容,如果未能解决你的问题,请参考以下文章