为什么以下输出为True?
#!/bin/sh
if [ false ]; then
echo "True"
else
echo "False"
fi
这将始终输出True,即使条件似乎另有指示。如果我去掉括号[],它就可以工作了,但我不明白为什么。
为什么以下输出为True?
#!/bin/sh
if [ false ]; then
echo "True"
else
echo "False"
fi
这将始终输出True,即使条件似乎另有指示。如果我去掉括号[],它就可以工作了,但我不明白为什么。
当前回答
正如@tripleee所指出的,这充其量是切线。
不过,如果你来到这里寻找类似的东西(就像我一样),这是我的解决方案
必须处理用户可访问的配置文件,我使用这个函数:
function isTrue() {
if [[ "${@^^}" =~ ^(TRUE|OUI|Y|O$|ON$|[1-9]) ]]; then return 0;fi
return 1
}
Wich可以这样用
if isTrue "$whatever"; then..
您可以更改regexp中的“true列表”,本例中的“true列表”与法语兼容,并将诸如“yes, yes, on,1, Oui,y,true”之类的字符串视为“true”。
注意,'^^'不区分大小写
其他回答
您正在运行带有参数“false”的[(又名test)命令,而不是运行命令false。由于"false"是非空字符串,test命令总是成功。要实际运行该命令,请删除[命令。
if false; then
echo "True"
else
echo "False"
fi
使用true/false删除一些括号混乱…
#! /bin/bash
# true_or_false.bash
[ "$(basename $0)" == "bash" ] && sourced=true || sourced=false
$sourced && echo "SOURCED"
$sourced || echo "CALLED"
# Just an alternate way:
! $sourced && echo "CALLED " || echo "SOURCED"
$sourced && return || exit
正如@tripleee所指出的,这充其量是切线。
不过,如果你来到这里寻找类似的东西(就像我一样),这是我的解决方案
必须处理用户可访问的配置文件,我使用这个函数:
function isTrue() {
if [[ "${@^^}" =~ ^(TRUE|OUI|Y|O$|ON$|[1-9]) ]]; then return 0;fi
return 1
}
Wich可以这样用
if isTrue "$whatever"; then..
您可以更改regexp中的“true列表”,本例中的“true列表”与法语兼容,并将诸如“yes, yes, on,1, Oui,y,true”之类的字符串视为“true”。
注意,'^^'不区分大小写
添加上下文希望能够帮助您对这个主题提供一些额外的清晰度。对于BaSH新手来说,真/假语句的意义相当奇怪。以下面的简单例子及其结果为例。
这个语句将返回“true”:
foo=" "; if [ "$foo" ]; then echo "true"; else echo "false"; fi
但这将返回“false”:
foo=" "; if [ $foo ]; then echo "true"; else echo "false"; fi
你知道为什么吗?第一个例子有一个带引号的""字符串。这导致BaSH按字面意思处理它。所以,从字面意义上讲,一个空格不是空的。而在非字面意义上(上面的第二个例子),一个空格被BaSH(作为$foo中的值)视为'nothing',因此它等同于null(这里解释为'false')。
这些语句都将返回一个“false”文本字符串:
foo=; if [ $foo ]; then echo "true"; else echo "false"; fi
foo=; if [ "$foo" ]; then echo "true"; else echo "false"; fi
foo=""; if [ $foo ]; then echo "true"; else echo "false"; fi
foo=""; if [ "$foo" ]; then echo "true"; else echo "false"; fi
有趣的是,这种类型的条件总是返回true:
这些语句都会返回一个"true"的结果:
foo=""; if [ foo ]; then echo "true"; else echo "false"; fi
注意区别;在条件语句中,变量名前面的$符号被省略了。括号之间插入什么词并不重要。BaSH将始终将此语句视为true,即使您使用的单词以前从未与同一个shell中的变量关联。
if [ sooperduper ]; then echo "true"; else echo "false"; fi
同样地,将它定义为一个未声明的变量确保它总是返回false:
if [ $sooperduper ]; then echo "true"; else echo "false"; fi
对于BaSH,这与编写:
sooperduper="";if [ $sooperduper ]; then echo "true"; else echo "false"; fi
另一个提示....
括号vs无括号
更令人困惑的是,这些IF/THEN条件的变化都有效,但返回相反的结果。
返回false:
if [ $foo ]; then echo "true"; else echo "false"; fi
if [ ! foo ]; then echo "true"; else echo "false"; fi
但是,这些函数将返回true的结果:
if $foo; then echo "true"; else echo "false"; fi
if [ foo ]; then echo "true"; else echo "false"; fi
if [ ! $foo ]; then echo "true"; else echo "false"; fi
当然,这将返回一个语法错误(以及'false'的结果):
if foo; then echo "true"; else echo "false"; fi
困惑了吗?在开始的时候,在头脑中保持头脑清醒是相当具有挑战性的,特别是如果你习惯了其他高级编程语言的话。
我发现我可以做一些基本的逻辑运行如下:
A=true
B=true
if ($A && $B); then
C=true
else
C=false
fi
echo $C