奇怪的 Bash if/elif 行为
Strange Bash if/elif behavior
我有以下脚本:
a=
b=
if [ ! a ]; then
echo "a=$a"
elif [ b ]; then
echo "b=$b"
fi
这是我可以调用它的四种可能方式:
balter$ bash eliftest.sh true true
b=true
balter$ bash eliftest.sh true false
b=false
balter$ bash eliftest.sh false true
b=true
balter$ bash eliftest.sh false false
b=false
我本以为:
b=true # !a evaluates to false but b is true
<nothing> # !a evaluates to false and b is also false
a=false # !a evaluates to true and if short circuits
a=false # !a evaluates to true and if short circuits
我显然不理解 bash elif 语句。有没有大神能指教一下?
此外,在互联网上,bash 脚本教程有时使用 [[...]]
,但主要使用 [...]
。我看到很多 SO 评论者说你应该使用 [[...]]
。有没有什么时候比另一个更好的经验法则?
你犯了两个错误:
- 您想使用变量
a
,而不是字符 "a";所以使用 $a
.
- 由于 bash 不知道布尔值,您可能只检查值是否为 "true"。
所以你想要这样的东西:
if [ "$a" = "true" ]; then
echo "a=$a"
elif [ "$b" = "true" ]; then
echo "b=$b"
fi
我实施了另外两个建议:
- 始终将变量放在引号之间;以避免在它们为空时出现错误(“$a”而不是 $a)
- 为了便携性只使用一个 = 符号(如@tripleee 所建议)
更多细节
bash 不知道布尔值。您的测试:
if [ ! a ];
总是失败,因为你问bash:字符"a"是空的吗?与以下内容相同:
if [ "" = "a" ]
假设您确实使用了 $a
(变量):
if [ ! $a ]
这仍然永远是错误的;因为这相当于:
if [ "" = "$a" ]
无论 a=true 还是 a=false 都永远不会为真(因为 a 永远不会是空字符串)
避免括号。试试这个:
a=
b=
if ! $a
then
echo "a=$a"
elif $b
then
echo "b=$b"
fi
我有以下脚本:
a=
b=
if [ ! a ]; then
echo "a=$a"
elif [ b ]; then
echo "b=$b"
fi
这是我可以调用它的四种可能方式:
balter$ bash eliftest.sh true true
b=true
balter$ bash eliftest.sh true false
b=false
balter$ bash eliftest.sh false true
b=true
balter$ bash eliftest.sh false false
b=false
我本以为:
b=true # !a evaluates to false but b is true
<nothing> # !a evaluates to false and b is also false
a=false # !a evaluates to true and if short circuits
a=false # !a evaluates to true and if short circuits
我显然不理解 bash elif 语句。有没有大神能指教一下?
此外,在互联网上,bash 脚本教程有时使用 [[...]]
,但主要使用 [...]
。我看到很多 SO 评论者说你应该使用 [[...]]
。有没有什么时候比另一个更好的经验法则?
你犯了两个错误:
- 您想使用变量
a
,而不是字符 "a";所以使用$a
. - 由于 bash 不知道布尔值,您可能只检查值是否为 "true"。
所以你想要这样的东西:
if [ "$a" = "true" ]; then
echo "a=$a"
elif [ "$b" = "true" ]; then
echo "b=$b"
fi
我实施了另外两个建议:
- 始终将变量放在引号之间;以避免在它们为空时出现错误(“$a”而不是 $a)
- 为了便携性只使用一个 = 符号(如@tripleee 所建议)
更多细节
bash 不知道布尔值。您的测试:
if [ ! a ];
总是失败,因为你问bash:字符"a"是空的吗?与以下内容相同:
if [ "" = "a" ]
假设您确实使用了 $a
(变量):
if [ ! $a ]
这仍然永远是错误的;因为这相当于:
if [ "" = "$a" ]
无论 a=true 还是 a=false 都永远不会为真(因为 a 永远不会是空字符串)
避免括号。试试这个:
a=
b=
if ! $a
then
echo "a=$a"
elif $b
then
echo "b=$b"
fi