在shell脚本中,通常使用设置-e
来使脚本更加健壮,方法是在从脚本执行的某些命令以非零退出代码退出时停止脚本。我对“ set -e
”和“ test
”命令感到困惑,结果与我想要的相反。
#!/bin/bash
set -e
a=10
b=9
#test $a -lt $b && false
#test $a -gt $b && false
echo "111"
实际结果是:
如果a > b
,则不打印任何内容
如果a < b
,则打印111。
但是我不这么认为,我认为结果什么都没发生。
答案 0 :(得分:1)
如果您想在a
大于b
时退出,只需输入
#!/bin/bash
set -e
a=10
b=9
test $a -le $b
echo "111"
如果test
失败,则set -e
将导致脚本退出;否则,脚本将退出。如果成功,脚本将继续执行echo
。但是,使用set -e
有很多陷阱;我建议您自己进行错误处理。
#!/bin/bash
abort () { printf '%s\n' >&2; exit 1; }
a=10
b=9
test "$a" -le "$b" || abort "$a is greater than $b"
echo "111"
答案 1 :(得分:0)
您编写脚本的方式意味着,如果a和b相等,它将退出而不在任何情况下都打印任何内容。
如果尝试使用a = 9
和b = 9
,则会看到111
的输出。
使用GNU / Bash的-x
选项,您可以轻松地完成所有操作。
退出的解释是您使用-e
选项;您可以在GNU/Bash manual中阅读:
如果可能由单个简单命令(请参见“简单命令”),列表(请参见“列表”)或复合命令(请参见“复合命令”)组成的管道(请参见“ Pipelines”)返回非零状态,则立即退出。如果失败的命令紧随一段时间或直到关键字,if语句中测试的一部分,&&或||中执行的任何命令的一部分之后的命令列表的一部分,则外壳程序不会退出。列出除最后一个&&或||之后的命令,管道中除最后一个命令之外的任何命令,或者该命令的返回状态用!反转。如果除子外壳程序以外的复合命令由于在-e被忽略时命令失败而返回非零状态,则外壳程序不会退出。在退出外壳程序之前,将执行ERR上的陷阱(如果已设置)。
此选项分别适用于Shell环境和每个子Shell环境(请参阅命令执行环境),并且可能导致子Shell在执行子Shell中的所有命令之前退出。
如果在忽略-e的上下文中执行复合命令或shell函数,则即使-e设置且-e设置,复合命令或函数体内执行的所有命令都不会受到-e设置的影响。命令返回失败状态。如果复合命令或shell函数在忽略-e的上下文中执行时设置了-e,则该设置在复合命令或包含函数调用的命令完成之前不会生效。
答案 2 :(得分:0)
谢谢大家,我找到了答案
SHELL如果管道(可能包含一个简单的命令),列表或复合命令(请参见上面的SHELL GRAMMAR)以非零状态退出,则立即退出。如果失败的命令是紧随一会儿或直到关键字之后的命令列表的一部分,紧随if或elif保留字之后的测试部分,以及在&&或||中执行的任何命令的一部分,则外壳程序不会退出。列出除最后一个&&或||之后的命令,管道中最后一个命令之外的任何命令,或者如果命令的返回值用!反转。