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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 14:37:33