我尝试在shell脚本中使用以下语法声明一个布尔变量:

variable=$false

variable=$true

这对吗?另外,如果我想更新这个变量,我会使用相同的语法吗?最后,下面使用布尔变量作为表达式的语法正确吗?

if [ $variable ]

if [ !$variable ]

当前回答

替代-使用函数

is_ok(){ :;}
is_ok(){ return 1;}
is_ok && echo "It's OK" || echo "Something's wrong"

定义函数不那么直观,但是检查它的返回值非常容易。

其他回答

在大多数情况下,您需要“布尔”来执行布尔操作,例如!&&或||。在一些语言中,特殊的布尔类型根本不存在(因为实际上你在技术上不需要它),在大多数解释型语言中(几乎)所有类型在操作中自动转换为某种布尔类型,比如!&&或||。

布尔运算总是适用于布尔运算。在Bash中,这样的操作是(在$var周围没有“”,这非常重要!):

[[ $var ]] - check if var is true
[[ ! $var ]] - check if var is false
[[ $var1 || $var2 ]] - var1 or var2
[[ $var1 && $var2 ]] - var1 and var2

[[$var]]仅当var= "(或未设置)时为false。所以唯一一个正确的“假”值的变量在bash是“(空字符串)。对于true,你可以选择任何值,但我更喜欢var=1(就像在其他语言中,true是任何非null int,但出于可读性的目的,程序员总是使用1)。

注意:对于var='false', var在布尔检查中为真。在Bash中字符串'false'实际上是true(与所有其他语言相同!)。Bash和Python、Perl或PHP之间唯一的区别是,在Bash 0中也是如此。但是,Bash中也有布尔运算,它们的工作原理和所有其他解释语言一样,除了Bash中的0为真。

在Bash中使用字符串'true'和'false'作为布尔替换是绝对不合理的。这就像在Python、Perl或PHP中使用相同的奇怪概念一样。它的工作速度较慢(在Bash中也是如此),没有人在其他语言中这样做,但在Bash中有很多程序员认为这是一个很好的解决方案。不。在Bash中没有理由不直接使用布尔运算,没有像$var == 'true'或$var == 'false'这样绝对奇怪的比较。

再次强调,Bash中的布尔替换是:

var=''  # false
var=1   # true (actually any non-empty string)

在Bash中直接使用布尔检查也是执行类布尔检查的最快方法。所有其他结构都要慢得多。

注:“旧”风格的“布尔”检查像a=true;如果美元;然后……绝对是白痴,因为:

不能在[[]]条件下直接使用 它们充当bash代码的eval,存储在变量中。好吧,如果你认为这是个好主意,请不要写任何程序;)

P.P.S.如果$var可以取消设置,并且你使用了非常有用的set -u,只需在检查中将$var替换为${var-},例如[[${var-}]](还有:没有“”,这对代码执行速度很重要!)

我如何在shell脚本中声明和使用布尔变量?

与许多其他编程语言不同,Bash不按“类型”隔离其变量。[1]

所以答案很明确。在Bash中没有任何布尔变量。

然而:

使用declare语句,可以将赋值限制为 变量。[2]

#!/bin/bash
declare -ir BOOL=(0 1) # Remember BOOL can't be unset till this shell terminates
readonly false=${BOOL[0]}
readonly true=${BOOL[1]}

# Same as declare -ir false=0 true=1
((true)) && echo "True"
((false)) && echo "False"
((!true)) && echo "Not True"
((!false)) && echo "Not false"

declare和readonly中的r选项用于显式声明变量为只读。我希望目的很明确。

我的发现和建议与其他帖子有所不同。我发现我可以像使用任何“常规”语言一样使用“布尔值”,而不需要“跳篮”……

不需要使用[]或显式的字符串比较…我尝试了多个Linux发行版。我测试了Bash、Dash和BusyBox。结果总是一样的。我不确定最初投票最多的帖子在谈论什么。也许时代变了,就是这样?

如果将一个变量设置为true,它随后会在条件中作为“肯定”进行计算。将其设置为false,它的计算结果为“负”。很简单的!唯一需要注意的是,未定义的变量的计算结果也类似于true!如果它做了相反的事情(就像在大多数语言中那样),那就好了,但这就是诀窍——你只需要显式地将你的布尔值初始化为true或false。

为什么会这样?答案是双重的。A) true/false在shell中实际上意味着“无错误”vs“错误”(即0 vs任何其他)。B) true/false不是值——而是shell脚本中的语句!关于第二点,在一行中执行true或false本身就设置了你所在块的返回值,即false是“遇到错误”的声明,而true则“清除”该值。将它与对变量的赋值一起使用,将其“返回”到变量中。一个未定义的变量在条件句中的计算结果类似于true,因为它同样表示0或“没有遇到错误”。

请参阅下面的示例Bash行和结果。如果你想确认,自己测试一下…

#!/bin/sh

# Not yet defined...
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;

myBool=true
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;

myBool=false
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;

收益率

when set to
it evaluates to true
when set to true
it evaluates to true
when set to false
it evaluates to false
[[ "$x" == 'true' || "$x" -ne 0 ]] && ...

足够简单并且没有依赖项。

下面是一个适合我的简单例子:

temp1=true
temp2=false

if [ "$temp1" = true ] || [ "$temp2" = true ]
then
    echo "Do something." 
else
    echo "Do something else."
fi