WSL Ubuntu下Bash脚本变量设置报错:no such variable
修正方案及原理说明
修正后的脚本
#!/bin/bash for id in $(seq 204 204) ; do subj="S$id" echo "===> Starting processing of $subj" echo cd "$subj" || exit # 同时替换硬编码的S201和Tcl变量格式的{$subj} sed -i -e "s/S201/${subj}/g" -e "s/\{\$subj\}/${subj}/g" design.fsf echo "===> Starting feat for run 1" feat design.fsf echo done
原理说明
问题根源:
- FSL的
feat命令用Tcl解释器解析design.fsf配置文件,文件里的{$subj}是Tcl的变量引用语法,和你Bash脚本中的subj变量属于不同运行环境,作用域完全隔离。 - 你之前的脚本只替换了文件中硬编码的
S201,但未处理{$subj}这部分Tcl变量引用,导致feat执行时Tcl找不到名为subj的变量,触发报错。
- FSL的
修正逻辑:
- 借助
sed的多表达式模式(-e参数),同时处理两种目标字符串:s/S201/${subj}/g:替换所有硬编码的S201为当前被试ID(如S204)s/\{\$subj\}/${subj}/g:转义正则特殊字符({、}、$),匹配字面的{$subj}并替换为当前被试ID
- 处理完成后,
design.fsf中所有关联被试ID的位置都会被替换为实际字符串,Tcl解析时无需再寻找未定义的变量。
- 借助
额外建议
如果你的design.fsf是从模板文件复制而来,建议每次处理前先复制干净的模板到被试目录,避免多次替换导致内容错乱:
#!/bin/bash # 假设原始模板存放在上级目录的template_design.fsf for id in $(seq 204 209) ; do subj="S$id" echo "===> Starting processing of $subj" echo # 创建被试目录(如果不存在) mkdir -p "$subj" || exit # 复制干净模板到被试目录 cp ../template_design.fsf "$subj/design.fsf" cd "$subj" || exit sed -i -e "s/S201/${subj}/g" -e "s/\{\$subj\}/${subj}/g" design.fsf echo "===> Starting feat for run 1" feat design.fsf echo done
内容的提问来源于stack exchange,提问作者Amber
相关产品推荐
相关产品推荐

