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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在shell脚本中声明和使用布尔变量? POSIX相关的知识,希望对你有一定的参考价值。

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

variable=$false

variable=$true

它是否正确?另外,如果我想更新该变量,我会使用相同的语法吗?最后,使用布尔变量作为正确的表达式是以下语法:

if [ $variable ]

if [ !$variable ]
答案

修订回答(2014年2月12日)

the_world_is_flat=true
# ...do something interesting...
if [ "$the_world_is_flat" = true ] ; then
    echo 'Be careful not to fall off!'
fi

原始答案

警告:https://stackoverflow.com/a/21210966/89391

the_world_is_flat=true
# ...do something interesting...
if $the_world_is_flat ; then
    echo 'Be careful not to fall off!'
fi

来自:Using boolean variables in Bash

这里包含原始答案的原因是因为2014年2月12日修订前的评论仅涉及原始答案,并且许多评论与修订后的答案相关时是错误的。例如,Dennis Williamson在2010年6月2日关于bash builtin true的评论仅适用于原始答案,而非修订版。

另一答案

Bill Parker is getting voted down,因为他的定义与正常的代码约定相反。通常,true定义为0,false定义为非零。 1将用于false,9999和-1也是如此。与函数返回值相同 - 0表示成功,任何非零表示失败。对不起,我还没有街头信誉投票或直接回复他。

Bash建议现在使用双括号作为习惯而不是单个括号,Mike Holt给出的链接解释了它们如何工作的差异。 7.3. Other Comparison Operators

首先,-eq是一个数值运算符,所以有代码

#**** NOTE *** This gives error message *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then

将发出一个错误语句,期望一个整数表达式。这适用于任一参数,因为它们都不是整数值。然而,如果我们在它周围放置双括号,它将不会发出错误声明,但它会产生错误的值(好的,在50%的可能排列中)。它将评估[[0 -eq true]] =成功,但也会[[0 -eq false]] =成功,这是错误的(嗯....那个内置是一个数值怎么样?)。

#**** NOTE *** This gives wrong output *****
The_world_is_flat=true;
if [[ "${The_world_is_flat}" -eq true ]]; then

条件的其他排列也会产生错误的输出。基本上,任何(除了上面列出的错误条件)将变量设置为数值并将其与true / false内置进行比较,或将变量设置为true / false内置并将其与数值进行比较。此外,任何将变量设置为true / false内置并使用-eq进行比较的内容。因此,请避免使用-eq进行布尔比较,并避免使用数值进行布尔比较。以下是将产生无效结果的排列摘要:

#With variable set as an integer and evaluating to true/false
#*** This will issue error warning and not run: *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then

#With variable set as an integer and evaluating to true/false
#*** These statements will not evaluate properly: *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then
#
if [[ "${The_world_is_flat}" -eq true ]]; then
#
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" = true ]]; then
#
if [ "${The_world_is_flat}" == true ]; then
#
if [[ "${The_world_is_flat}" == true ]]; then


#With variable set as an true/false builtin and evaluating to true/false
#*** These statements will not evaluate properly: *****
The_world_is_flat=true;
if [[ "${The_world_is_flat}" -eq true ]]; then
#
if [ "${The_world_is_flat}" = 0 ]; then
#
if [[ "${The_world_is_flat}" = 0 ]]; then
#
if [ "${The_world_is_flat}" == 0 ]; then
#
if [[ "${The_world_is_flat}" == 0 ]]; then

所以,现在到底有效。使用true / false内置函数进行比较和评估(正如Mike Hunt指出的那样,不要将它们括在引号中)。然后使用单或双等号(=或==)和单括号或双括号([]或[[]])。就个人而言,我喜欢双等号,因为它让我想起其他编程语言的逻辑比较,而双引号只是因为我喜欢打字。所以这些工作:

#With variable set as an integer and evaluating to true/false
#*** These statements will work properly: *****
#
The_world_is_flat=true/false;
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" = true ]]; then
#
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" == true ]]; then

你有它。

另一答案

在许多编程语言中,布尔类型是或者实现为整数的子类型,其中true的行为类似于1,而false的行为类似于0

Mathematically,boolean algebra类似于整数算术模2。因此,如果一种语言不提供本机布尔类型,最自然和有效的解决方案是使用整数。这几乎适用于任何语言。例如,在Bash中你可以这样做:

# val=1; ((val)) && echo "true" || echo "false"
true
# val=0; ((val)) && echo "true" || echo "false"
false

man bash

((表达))

根据ARITHMETIC EVALUATION下面描述的规则评估表达式。如果表达式的值不为零,则返回状态为0;否则返回状态为1.这与let“expression”完全相同。

另一答案

我的发现和建议与其他帖子略有不同。我发现我可以使用true / false基本上就像任何“常规”语言一样,没有“箍跳”建议......不需要[]或显式字符串比较......我试过多个Linux发行版,我测试过bash,dash和busybox。我和她一起跑,没有她的爆炸...结果总是一样的。我不确定最初投票的帖子是在谈论什么。也许时代已经改变了,这就是它的全部内容?

如果将变量设置为true,则在条件中计算结果为true。将其设置为false,它的计算结果为false。很直接!唯一需要注意的是,UNDEFINED变量也会评估为真!如果它做了相反的事情会很好,但这就是诀窍 - 你只需要明确地将你的布尔值设置为真或假。

请参阅下面的示例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
另一答案

这是一个适合我的简单示例:

temp1=true
temp2=false

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

我发现现有的答案令人困惑。

就个人而言,我只想拥有像C一样的外观和作品。

这个片段每天在制作中多次使用:

snapshotEvents=true

if ($snapshotEvents)
then
    # do stuff if true
fi

为了让每个人都开心,我测试了:

snapshotEvents=false

if !($snapshotEvents)
then
    # do stuff if false
fi

这也很好。

$snapshotEvents评估变量值的内容。所以你需要$

你真的不需要括号,我发现它们很有帮助。

另一答案

这是对miku的original answer的改进,它解决了Dennis Williamson对案例的担忧,其中变量未设置:

the_world_is_flat=true

if ${the_world_is_flat:-false} ; then
    echo "Be careful not to fall off!"
fi

并测试变量是否为false

if ! ${the_world_is_flat:-false} ; then
    echo "Be careful not to fall off!"
fi

关于变量中含有令人讨厌的内容的其他情况,这是任何输入程序的外部输入的问题。

在信任之前,必须验证任何外部输入。但是,当接收到该输入时,该验证必须只进行一次。

它不必像Dennis Williamson建议的每次使用变量那样影响程序的性能。

另一答案

这是一个简短的if true的实现。

# Function to test if a variable is set to "true"
_if () {
    [ "${1}" == "true" ] && return 0
    [ "${1}" == "True" ] && return 0
    [ "${1}" == "Yes" ] && return 0
    return 1
}

例1

my_boolean=true

_if ${my_boolean} && {
    echo "True Is 

以上是关于如何在shell脚本中声明和使用布尔变量? POSIX的主要内容,如果未能解决你的问题,请参考以下文章

如何在shell脚本中使用变量

在js 中怎样声明一个布尔值变量,使其经过多次验证,最后返回这个布尔

shell 中怎么声明一个函数

Linux常用Shell脚本测试命令

Linux常用Shell脚本测试命令

如何在shell脚本中使用变量