ZSH转BASH:AFNI命令3dTcat路径展开问题求助
ZSH中正常运行的AFNI命令在BASH中失效的解决办法
问题详情
原ZSH下可正常运行的AFNI命令:
3dTcat \ -prefix Temp.nii \ Zero_dataset.nii \ $directory_rois/{{$array1}.nii,{$array2}.nii,{$array3}.nii}
其中array1/array2/array3是1-1000之间的非重叠数字区间(比如array1=173..233),作用是合并所有数组内数字对应的.nii文件。
改成BASH格式后:
3dTcat \ -prefix Temp.nii \ Zero_dataset.nii \ $directory_rois/{"$array1".nii,"$array2".nii,"$array3".nii}
出现报错:FATAL ERROR: Can't open dataset $directory_rois/1..81.nii,原因是BASH没有把1..81展开成1.nii、2.nii…81.nii,而是直接把1..81.nii当成了单个文件名。
解决建议
原因说明
ZSH支持直接解析173..233这种区间语法,自动展开成连续数字序列;但BASH的大括号展开不会对变量替换后的内容做二次解析,所以$array1被替换成1..81后,只会被当作单一字符串处理,不会展开成多个文件名。
方法1:用循环生成文件名列表
先把所有需要的文件名拼接成一个变量,再传给3dTcat:
# 初始化存储文件名的变量 files="" # 处理array1区间 IFS='..' read start end <<< "$array1" for ((i=start; i<=end; i++)); do files+="$directory_rois/$i.nii " done # 处理array2区间 IFS='..' read start end <<< "$array2" for ((i=start; i<=end; i++)); do files+="$directory_rois/$i.nii " done # 处理array3区间 IFS='..' read start end <<< "$array3" for ((i=start; i<=end; i++)); do files+="$directory_rois/$i.nii " done # 执行AFNI命令 3dTcat \ -prefix Temp.nii \ Zero_dataset.nii \ $files
方法2:用seq命令快速生成序列
利用seq生成连续数字,再直接拼接成带路径的文件名,写法更简洁:
3dTcat \ -prefix Temp.nii \ Zero_dataset.nii \ $(seq -f "$directory_rois/%g.nii" ${array1//../ }) \ $(seq -f "$directory_rois/%g.nii" ${array2//../ }) \ $(seq -f "$directory_rois/%g.nii" ${array3//../ })
${array1//../ }:把array1里的..替换成空格,让seq能识别起始和结束数字seq -f "$directory_rois/%g.nii":指定输出格式,直接生成带路径的.nii文件名
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

