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

Shell脚本执行报错:eval语法错误(行1无括号却报异常)求助

解决eval: Syntax error: "(" unexpected错误

这个错误根本不是shebang的问题——你的#!/bin/bash完全没问题。问题出在你用eval拼接命令时,文件名里的(没有被正确处理,shell把它当成了语法符号(用来启动子shell的括号),而不是文件名的一部分。

咱们来拆解你的脚本问题:
你写的firstPart='tar -cvf n00866097_Backup('里的左括号,在eval执行时,shell会尝试解析它作为shell语法,而不是文件名的一部分,自然就抛出语法错误了。

推荐的修复方案(完全避开eval,更安全可靠)

eval本身就有安全风险(比如如果传入的参数包含特殊字符,可能会执行意外命令),所以最好直接构造文件名,然后执行tar命令:

#!/bin/bash
# 用双引号包裹变量,避免空格等特殊字符出问题
file="$1"
# 直接构造带日期的备份文件名
backup_filename="n00866097_Backup($(date +%Y-%m-%d)).tgz"
# 执行tar打包命令
tar -cvf "$backup_filename" "$file"
# 传输文件(记得补全你的pscp目标地址)
pscp -pw password "$backup_filename" us...

如果一定要用eval(不推荐)

如果你坚持要保留类似的拼接方式,需要给文件名加上双引号,让shell把括号当成文件名的一部分:

#!/bin/bash
file="$1"
# 给文件名部分加上双引号,包裹特殊字符
firstPart='tar -cvf "n00866097_Backup('
# 直接执行date命令赋值,比把反引号放字符串里更清晰
current_date=$(date +%Y-%m-%d)
lastPart=').tgz" "$file"'
zippedFile="$firstPart$current_date$lastPart"
# 用双引号包裹eval的参数,避免额外解析
eval "$zippedFile"
# 传输时也要正确引用文件名
pscp -pw password "n00866097_Backup($current_date).tgz" us...

记住:尽量避免使用eval,直接构造变量执行命令不仅更安全,也更容易排查问题。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:11:43