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

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

原理说明

  1. 问题根源:

    • FSL的feat命令用Tcl解释器解析design.fsf配置文件,文件里的{$subj}是Tcl的变量引用语法,和你Bash脚本中的subj变量属于不同运行环境,作用域完全隔离。
    • 你之前的脚本只替换了文件中硬编码的S201,但未处理{$subj}这部分Tcl变量引用,导致feat执行时Tcl找不到名为subj的变量,触发报错。
  2. 修正逻辑:

    • 借助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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:52:33