You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:05:20