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

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相同)

以上是关于使用循环将变量列表与文件名串在一起的主要内容,如果未能解决你的问题,请参考以下文章

变量子串在for循环内编辑/替换

java 循环变量

将由输入文件确定的多个相同字符串(星号)串在一起。 C++

如何将多个文件列表与 CMake 合并在一起?

常用python日期日志获取内容循环的代码片段

将片段与 GoogleMap 一起使用时应用程序崩溃