Bash - 检查变量是真还是假的更简单易读的方法
Bash - Simpler and more legible way to check if variable is true or false
在 Bash 中 0
是 true
而任何其他数字都是 false
,就像在 C 中一样。
为了测试一个变量是否为真,我目前正在做:
is_on=0
if [ $is_on -eq 0 ]; then
echo "It's on!"
else
echo "It's off!"
fi
我想要更简单易读的东西,所以我尝试了:
这不是因为 [
总是 returns 0
:
is_on=0
if [ $is_on ]; then
echo "It's on!"
else
echo "It's off!"
fi
这也不是因为 [[
总是 returns 0
:
is_on=0
if [[ $is_on ]]; then
echo "It's on!"
else
echo "It's off!"
fi
这也行不通:
is_on=0
if [ $is_on -eq true ]; then
echo "It's on!"
else
echo "It's off!"
fi
这与逻辑相反:
is_on=0
if (( $is_on )); then
echo "It's on!"
else
echo "It's off!" # Prints this!
fi
这有效,但它是一个字符串比较:
is_on=true
if [ $is_on = true ]; then
echo "It's on!"
else
echo "It's off!"
fi
是否有更简单易读的方法来检查变量是 true
还是 false
?
值的解释 取决于上下文。所以一些事实:
做一些逻辑时:
0
表示 false,
- 非零 表示 为真。
做某事时:
0
退出状态表示成功,
- 非零退出状态表示失败。
if
主体在命令成功时执行。 if
主体在命令以零退出状态退出时执行。
(( ... ))
算术展开的退出状态取决于里面最后一个表达式的逻辑值。 true 值表示成功,false 值表示失败(读两遍)。
参见 man test and inspect STRING equivalent to -n STRING
part. Also research bash builtins, bash shell arithemtic, bash exit status。
Is there a simpler and more legible way to check if a variable is true or false?
在受控环境中,我只使用变量值并执行 shell 内置函数 false
和 true
(即 return 非零退出状态(失败)和零(成功)分别为:
is_on=true
if "$is_on"; then
在不受控制的环境中,最好比较要保护的字符串以防止奇怪的用户输入:
is_on=""
if [[ "$is_on" = 'true' ]]; then
如果你想处理复杂的情况,那就自己写逻辑吧。在bash中所有变量值都是字符串,没有其他变量类型(好吧,有字符串数组):
shopt +extglob
user_boolean_value_to_my_boolean_convention() {
case "" in
# 0 and 0000000 are false
+(0)) echo false; ;;
# any nonzero number or string true is true
+([0-9])|T|t|[Tt][rR][uU][eE]) echo true; return; ;;
# all the rest is false
*) echo false; ;;
esac
}
is_on=$(user_boolean_value_to_my_boolean_convention "")
if "$is_on"; then
在 Bash 中 0
是 true
而任何其他数字都是 false
,就像在 C 中一样。
为了测试一个变量是否为真,我目前正在做:
is_on=0
if [ $is_on -eq 0 ]; then
echo "It's on!"
else
echo "It's off!"
fi
我想要更简单易读的东西,所以我尝试了:
这不是因为 [
总是 returns 0
:
is_on=0
if [ $is_on ]; then
echo "It's on!"
else
echo "It's off!"
fi
这也不是因为 [[
总是 returns 0
:
is_on=0
if [[ $is_on ]]; then
echo "It's on!"
else
echo "It's off!"
fi
这也行不通:
is_on=0
if [ $is_on -eq true ]; then
echo "It's on!"
else
echo "It's off!"
fi
这与逻辑相反:
is_on=0
if (( $is_on )); then
echo "It's on!"
else
echo "It's off!" # Prints this!
fi
这有效,但它是一个字符串比较:
is_on=true
if [ $is_on = true ]; then
echo "It's on!"
else
echo "It's off!"
fi
是否有更简单易读的方法来检查变量是 true
还是 false
?
值的解释 取决于上下文。所以一些事实:
做一些逻辑时:
0
表示 false,- 非零 表示 为真。
做某事时:
0
退出状态表示成功,- 非零退出状态表示失败。
if
主体在命令成功时执行。 if
主体在命令以零退出状态退出时执行。
(( ... ))
算术展开的退出状态取决于里面最后一个表达式的逻辑值。 true 值表示成功,false 值表示失败(读两遍)。
参见 man test and inspect STRING equivalent to -n STRING
part. Also research bash builtins, bash shell arithemtic, bash exit status。
Is there a simpler and more legible way to check if a variable is true or false?
在受控环境中,我只使用变量值并执行 shell 内置函数 false
和 true
(即 return 非零退出状态(失败)和零(成功)分别为:
is_on=true
if "$is_on"; then
在不受控制的环境中,最好比较要保护的字符串以防止奇怪的用户输入:
is_on=""
if [[ "$is_on" = 'true' ]]; then
如果你想处理复杂的情况,那就自己写逻辑吧。在bash中所有变量值都是字符串,没有其他变量类型(好吧,有字符串数组):
shopt +extglob
user_boolean_value_to_my_boolean_convention() {
case "" in
# 0 and 0000000 are false
+(0)) echo false; ;;
# any nonzero number or string true is true
+([0-9])|T|t|[Tt][rR][uU][eE]) echo true; return; ;;
# all the rest is false
*) echo false; ;;
esac
}
is_on=$(user_boolean_value_to_my_boolean_convention "")
if "$is_on"; then