我最近在我的一个Bash脚本中出现了问题,该问题是由其运行的某个SSH命令的意外输出引起的(由于操作系统版本升级)。这个问题实际上导致了Bash语法错误,因为我希望这个输出只包含一个数字状态代码(来自远程脚本),然后我在算术表达式中使用它。
令我感到惊讶的是,我的Bash脚本在报告语法错误后继续执行。尽管事实上我在文件开头附近有以下行:
# Terminate script if any command fails
set -o errexit
虽然语法错误显然与失败的命令不同,但在我看来,前者表示更严重的错误情况。
我知道你可以使用-n参数来检查Bash脚本的语法,而无需实际执行任何命令,但无论如何都不会遇到这个问题。
以下是导致错误但未退出的示例:
#!/bin/bash
set -o errexit
x=")"
echo $(( x + 1 ))
echo still running
在正常操作期间检测到算术表达式中的语法错误后,有没有办法强制Bash脚本立即终止?
答案 0 :(得分:0)
快速回答是,您可以通过检查$?
:
#!/bin/bash
x=")"
echo $(( $x + 1 ))
if [[ $? != 0 ]]; then
echo >&2 "caught syntax error; aborting"
exit $?
fi
echo success
但是,这种方法并不总是有效,例如
#!/bin/bash
x="-1"
(( x += 1 ))
if [[ $? != 0 ]]; then
echo >&2 "caught syntax error; aborting"
exit $?
fi
echo success
将导致:
caught syntax error; aborting
bash(1)
手册页说:
The evaluation is performed according to the rules listed below
under ARITHMETIC EVALUATION. If expression is invalid, bash
prints a message indicating failure and no substitution occurs.
但这隐藏了Bash在语法错误方面相当奇特的行为的一些细节。例如,
#!/bin/bash
x=")"
if echo $(( $x + 1 )); then
echo success
else
echo failure
fi; echo "almost end of script"
echo "end of script"
结果:
./foo.sh: line 3: ) + 1 : syntax error: operand expected (error token is ") + 1 ")
end of script
顺便说一下,set -o errexit
似乎没有任何影响。