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
相关产品推荐
相关产品推荐

