BASH脚本错误退出无效

时间:2016-12-29 08:19:56

标签: linux bash shell command-line error-handling

我希望我的BASH脚本退出脚本​​中的错误。但我不能让它发挥作用。

我尝试了两种方式,使用trap和set -e,同时也是两种方式。

这是一个测试脚本:

#!/bin/bash

# Exit on error
trap 'exit' ERR
set -e

h=1
b=$((h+)) # this produces an error
echo $?
echo $b
echo "end"

如果我运行脚本,输出结果如下:

test.sh: line 8: h+: syntax error: operand expected (error token is "+")
1

end

为什么它不起作用,我怎样才能使这两种方法都起作用?

3 个答案:

答案 0 :(得分:1)

您应该尝试在脚本的第一行使用#!/bin/sh而不是#!/bin/bash。 否则,您可以在bash set -o errtrace中启用错误跟踪。

来自bash手册页:

  

除非-o errtrace shell选项具有,否则不会继承ERR陷阱   已启用。

答案 1 :(得分:1)

您(故意)在set -e和陷阱的上下文中引入了语法错误。您可以识别出一些看似意外的行为。但我不认为这个问题与trap或shell选项有关。

试试这个(不在您的脚本中,只在交互式shell中):

echo $(( H+ )) && echo OK || echo NOT_OK

这当然会失败(紧接着尝试echo $?)。但它不会回应“NOT_OK”,它根本不会回响,这看起来并不自然。

因此,在存在语法错误的情况下,正常的shell语义会中断。您不能假设语法错误导致的失败行为类似于返回非零状态的命令,它明显绕过了我们习惯的预期shell错误处理行为的某些部分。

还有一件事......这是算术表达式中的语法错误,但在解析脚本时未检测到。它不会阻止脚本被执行(与缺少的引号,括号相反......)。

这也是一样的事情:

[[ A = ]] && echo OK || echo NOT_OK

但这不会(会显示NOT_OK):

[ A = ] && echo OK || echo NOT_OK

双括号条件是保留字,而单括号条件是shell内置,因此可能与行为上的差异有关。

答案 2 :(得分:0)

我想你想增加h?然后做 B = $((H ++))