在BASH中使用嵌套for循环实现2×3×6变量遍历匹配ROI命名
问题修复方案
错误原因
你原本的三层嵌套循环会对「2个半球 * 3个ROI * 6个输入文件」做全量笛卡尔积遍历,没有绑定ROI编号和对应文件的映射规则,必然会出现ROI和文件不匹配的问题。
正确实现
仅需两层循环即可通过编号绑定映射关系,无需三层遍历:
for a in Left_hemi Right_hemi; do # 提取半球标识转大写,匹配你预设的变量后缀LEFT/RIGHT hemi_suffix=${a%%_*} hemi_suffix=${hemi_suffix^^} for roi_num in {1..3}; do # 动态拼接变量名,间接获取对应输入文件路径 file_varname="file${roi_num}_${hemi_suffix}" current_file=${!file_varname} roi_name="ROI${roi_num}" # 执行配准命令,已补全你遗漏的-o输出参数 antsApplyTransforms -d 3 -i "${current_file}" -o "${dir_out}/warped_atlas/${a}_${roi_name}_${subject}.nii.gz" echo "${a}_${roi_name}_${subject}.nii.gz" done done
单行压缩版
如果你需要把逻辑合并为一行执行,直接把换行替换为分号即可:
for a in Left_hemi Right_hemi; do hemi_suffix=${a%%_*}; hemi_suffix=${hemi_suffix^^}; for roi_num in {1..3}; do file_varname="file${roi_num}_${hemi_suffix}"; current_file=${!file_varname}; roi_name="ROI${roi_num}"; antsApplyTransforms -d 3 -i "${current_file}" -o "${dir_out}/warped_atlas/${a}_${roi_name}_${subject}.nii.gz"; echo "${a}_${roi_name}_${subject}.nii.gz"; done; done
注意事项
- 以上代码依赖Bash 4.0及以上版本的间接变量扩展、大小写转换语法
- 请自行补充
antsApplyTransforms命令中你省略的参考影像、变换场文件等其他必填参数
内容的提问来源于stack exchange,提问作者CanyonView
相关产品推荐
相关产品推荐

