我可以在 bash if 语句中使用错误的 [ 语法导致 shell 因错误退出吗?

问题描述 投票:0回答:2

考虑以下

bash
代码:

if [ "$a" = "foo"]
then
  echo "TRUE"
fi
echo $?

我们得到:

bash: [: missing `]'
0

所以基本上,if 中的测试由于拼写错误而失败(

"foo"
]
之间没有空格),但整个
if
的退出代码仍然是
0
又名。成功了。

这个答案解释了为什么退出代码是

0
(我们得到
if
的退出代码,它是
0
,因为什么都不是
true
)。

到目前为止一切都很好,但这种行为极其危险,因为它可能会导致无声错误。有没有办法重写条件,或更改任何

bash
设置,以便像这样的拼写错误触发脚本的非零退出/
ìf

bash if-statement exit-code
2个回答
0
投票

if
不区分
[
失败的不同原因。但是,它会根据条件是否失败或存在其他错误来设置不同的退出状态。条件失败时,退出状态为
1
,错误数将大于1。

所以你可以明确检查

$?
来区分:

[ "$a" = "foo"] 2>/dev/null
case $? in
    0) echo "TRUE" ;;
    1) ;;
    *) (exit 1) ;;
esac
echo $? # prints 1

0
投票

是的,有一种方法可以重写条件:不要使用

[

#!/bin/bash -e
if [[ "$a" = "foo"]]
then
  echo "TRUE"
fi

正确结果:

yourscript: line 1: syntax error in conditional expression

注意,

set -e
严重的陷阱,我强烈建议不要使用它;但它确实可以让你解决这个特定的情况。

© www.soinside.com 2019 - 2024. All rights reserved.