我希望我的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
为什么它不起作用,我怎样才能使这两种方法都起作用?
答案 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 ++))