TL; DR
bool=true
if [ "$bool" = true ]
有三苦的(问题原)答案
我不推荐接受的答案1。它的语法很漂亮,但是有一些缺陷。
说我们有以下情况。
if $var; then
echo 'Muahahaha!'
fi
在以下情况2中,此条件将评估为true并执行嵌套命令。
# Variable var not defined beforehand. Case 1
var='' # Equivalent to var="". Case 2
var= # Case 3
unset var # Case 4
var='<some valid command>' # Case 5
通常,仅在您的“布尔”变量(var
在此示例中)显式设置为true 时,才希望条件评估为true。所有其他情况都是危险的误导!
最后一种情况(#5)尤其顽皮,因为它将执行变量中包含的命令(这就是为什么条件对有效命令3、4评估为true的原因)。
这是一个无害的示例:
var='echo this text will be displayed when the condition is evaluated'
if $var; then
echo 'Muahahaha!'
fi
# Outputs:
# this text will be displayed when the condition is evaluated
# Muahahaha!
引用变量更安全,例如if "$var"; then
。在上述情况下,您应该得到一条警告,提示找不到该命令。但是我们仍然可以做得更好(请参阅底部的建议)。
另请参阅Mike Holt对Miku原始答案的解释。
这种方法也具有意外的行为。
var=false
if [ $var ]; then
echo "This won't print, var is false!"
fi
# Outputs:
# This won't print, var is false!
您可能希望上述条件的计算结果为false,从而从不执行嵌套语句。惊喜!
引用值("false"
),引用变量("$var"
)或使用test
或[[
代替[
并没有什么不同。
我不建议:
我建议您通过以下方法检查“布尔值”。他们按预期工作。
bool=true
if [ "$bool" = true ]; then
if [ "$bool" = "true" ]; then
if [[ "$bool" = true ]]; then
if [[ "$bool" = "true" ]]; then
if [[ "$bool" == true ]]; then
if [[ "$bool" == "true" ]]; then
if test "$bool" = true; then
if test "$bool" = "true"; then
它们几乎相等。您将需要比其他答案5中的方法键入更多的击键,但是您的代码将更具防御性。
脚注
- 此后,Miku的答案已被编辑,不再包含(已知)缺陷。
- 并非详尽的清单。
- 在此上下文中,有效命令表示存在的命令。命令的使用正确与否无关紧要。例如
man woman
,即使不存在这样的手册页,它也仍然被视为有效命令。
- 对于无效(不存在)的命令,Bash只会抱怨找不到该命令。
- 如果您在意长度,则第一个建议是最短的。
true
而false
在大多数片段的上下文中只是普通的字符串,没有了bash built-ins
!请阅读下面的Mike Holt回答。(这是一个示例,其中投票