Mac终端运行shell脚本报syntax error near unexpected token `('如何解决
错误原因
- 核心问题是语法混用:你脚本里写的是类csh的
set 变量 = 值语法,但Mac终端默认执行shell脚本用的是bash/zsh,这类POSIX标准shell中,普通变量赋值不需要加set命令,且=两边严禁加空格,解析时直接碰到括号(就会判定为非法语法标记,直接抛出你看到的语法错误。 - 命令替换写法完全错误:你想把管道命令的执行结果存到变量里,不管是哪种shell,都需要用专门的命令替换语法包裹,不能直接把命令塞括号里跟在等号后面。
- 脚本存在大量格式错误:多条独立命令被挤在同一行没有分隔(比如赋值语句和
echo写在同一行、if块里的多条语句没换行分隔)、多余的无意义点号、赋值时直接把命令写在等号后没有做命令替换,这些都会触发语法报错。
修复方法
直接把脚本改成标准bash/zsh兼容的写法即可,修改后的完整可运行代码如下(记得把两处<path>替换成你自己的实际目录路径):
#!/bin/zsh # 读取传入的第一个参数 s=$1 # 替换为实际的SUBJECTS_DIR路径,注意等号两边不要加空格 SUBJECTS_DIR="<替换为你的实际SUBJECTS_DIR路径>" export SUBJECTS_DIR log="$SUBJECTS_DIR/recon-all-commands.log" # 替换为实际的dcm存储根目录路径 dcmdir="<替换为你的实际dcmdir路径>" # 用$()做命令替换,拿到分割后的subjid subjid=$(echo "$s" | gawk -F- '{print $2}') if [ -e "$dcmdir/$s/scan.log" ]; then echo "found scan.log, finding mprages" dat="$dcmdir/$s/scan.log" else echo "no scan.log" # 不存在日志文件时直接退出,避免后续执行空路径报错 exit 1 fi # 命令替换执行管道命令拿到结果,赋值和echo分两行写 mpr=$(grep "256 256 128" "$dat" | grep ok | awk '{print $8}') echo "found mprages, $mpr" # 拼接命令写入日志 echo "recon-all -i $dcmdir/$s/$mpr -all -s $subjid" >> "$log"
- 运行脚本前先给执行权限:
chmod +x 你的脚本文件名.sh,再用./你的脚本文件名.sh 参数运行即可,不需要显式指定csh。 - 如果你一定要用csh语法运行脚本,需要显式调用
csh 你的脚本文件名执行,同时修正csh下的语法错误(命令替换用反引号包裹、语句之间加分号/换行、去掉多余点号),但更推荐用上面的bash/zsh写法,Mac系统下兼容性更好,踩坑更少。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

