String 使用循环将具有文件名的变量列表串在一起
我创建了一个脚本,用于标识一组唯一的文件(从一个大列表中),并将文件路径保存为唯一变量(例如$vol1、$vol2、$vol3…见下文) 我想将变量连接成一个字符串变量,作为单独命令行程序的输入。由于卷的数量可能不同-似乎最适合创建以下性质的循环(?定义我遇到问题的地方): 我在这里使用files+=、eval函数等尝试了几个不同的选项,并继续得到一条错误消息:-bash:vol0001.nii.gz:command not found。有办法解决这个问题吗?文件名需要采用字符串格式,以便输入后续处理步骤 谢谢, David为此使用数组:String 使用循环将具有文件名的变量列表串在一起,string,bash,shell,loops,unix,String,Bash,Shell,Loops,Unix,我创建了一个脚本,用于标识一组唯一的文件(从一个大列表中),并将文件路径保存为唯一变量(例如$vol1、$vol2、$vol3…见下文) 我想将变量连接成一个字符串变量,作为单独命令行程序的输入。由于卷的数量可能不同-似乎最适合创建以下性质的循环(?定义我遇到问题的地方): 我在这里使用files+=、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[*]}"
注意:命令
sed-n“$np”文件
打印文件的第n行(与您的cat文件| head-$n | tail-1
相同)您考虑过改用数组吗?你不必乱搞编号的变量,你可以轻松地将它们一次全部传递给commandhmm,当我这么做的时候。。。文件=();a=1;而[“$a”-le“$subNum”];do eval files+=('$vol'${volume});((a++);完成。。。我得到以下错误。bash:[::需要整数表达式。我想,我做错了什么。仍在学习。请在您的问题中添加示例b0\u volumes\u tmp.txt
和all\u volumes.txt
文件,以便我们可以尝试您的代码并提出改进建议。工作!感谢您的帮助。files=“${vol[*]}”似乎是这里的关键。不知道为什么这对我来说如此困难。@DavidPaul在我看来,关键是首先使用数组。避免像瘟疫一样使用eval
。
??? files=$vol1
for i in `seq 2 $num_ap_files
do
??? eval files=${files}" $vol"${i)
done
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[*]}"
my_next_command "${vol[@]}"