Bash脚本中使用trap捕获退出码执行清理jar时出现[: =: unary operator expected错误求助
Bash脚本中使用trap捕获退出码执行清理jar时出现[: =: unary operator expected错误求助
嗨,这个问题我太熟悉了!你遇到的错误根源在于双引号导致的变量提前展开,咱们一步步拆解来看:
你原本的trap命令用了双引号包裹:
trap "exit_code=$?; if [ "${exit_code}" = "0" ]; then java -jar /clean-app.jar; fi" EXIT
当bash解析这行命令的时候,双引号里的${exit_code}会被立刻展开——但这时候exit_code还没被定义过,是空值!所以等触发EXIT信号时,实际执行的命令会变成:
exit_code=$?; if [ "" = "0" ]; then java -jar /clean-app.jar; fi
这就导致[ "" = "0" ]这种写法触发了[: =: unary operator expected错误,因为bash把空值当成了缺失的操作数。
解决办法有两种,都很简单:
方法1:用单引号包裹trap命令
单引号会阻止bash提前展开变量,直到EXIT信号触发时才执行命令,这样exit_code=$?就能正确获取到main-app.jar的退出码:
trap 'exit_code=$?; if [ "${exit_code}" = "0" ]; then java -jar /clean-app.jar; fi' EXIT java -jar /main-app.jar
方法2:简化写法,直接用$?做数值比较
因为EXIT陷阱里的$?就是当前进程的退出码,咱们可以直接用数值比较符-eq(比字符串比较更稳妥,毕竟退出码是数字),省去临时变量:
trap 'if [ $? -eq 0 ]; then java -jar /clean-app.jar; fi' EXIT java -jar /main-app.jar
两种方法都能解决你的问题,我个人更推荐第二种,代码更简洁也不容易出错~
备注:内容来源于stack exchange,提问作者ah_ben
相关产品推荐
相关产品推荐

