如何在Bash中使用boolean编写if / else?

时间:2017-04-01 04:18:53

标签: bash if-statement boolean

如何编写if then语句以在这些变量之间进行切换:

if(switch){
  server_var_shortname=$server_shared_shortname
  server_var=$server_shared
  server_var_bare=$server_shared_bare
} else {
  server_var_shortname=$server_vps_shortname
  server_var=$server_vps
  server_var_bare=$server_vps_bare
}

我不熟悉bash语法,基本上只需要一个布尔值的if / else语句。我也可以使用true / false值吗?另外我该怎么做else语句?

$switch=true;
if $switch
then
  server_var_shortname=$server_shared_shortname
  server_var=$server_shared
  server_var_bare=$server_shared_bare
fi

5 个答案:

答案 0 :(得分:5)

首先,贝壳(包括bash)没有布尔;他们甚至没有整数(虽然他们可以假装它)。大多数情况下,他们有字符串。 bash也有字符串数组。伪布尔有多种方法可供选择;我最喜欢的是使用字符串" true"和"假"。这些也恰好是总是成功和失败的命令的名称,这很方便,因为if语句实际上接受命令,并且如果成功则运行then子句并且{else子句1}}子句如果失败。因此,你可以"运行"如果设置为" true"则布尔值并且它会成功如果设置为" false"则失败。像这样:

switch=true  # This doesn't have quotes around it, but it's a string anyway.
# ...
if $switch; then
    server_var_shortname=$server_shared_shortname
    server_var=$server_shared
    server_var_bare=$server_shared_bare
else
    server_var_shortname=$server_vps_shortname
    server_var=$server_vps
    server_var_bare=$server_vps_bare
fi

请注意,您if所见的更常用格式有方括号,如if [ something ]; then。在这种情况下,[实际上是一个命令(不是一些有趣的分组操作符),它将其参数作为表达式进行计算;因此[ "some string" = "some other string" ]是一个失败的命令,因为字符串不相等。您可以使用if [ "$switch" = true ]; then,但我更愿意作弊并直接使用假布尔值。

警告:如果你使用我建议的作弊,请确保你的"布尔"变量设置为" true"或"假" - 没有设置,没有设置其他东西。如果它设置为其他任何内容,我对结果不承担任何责任。

其他一些语法说明:

  • 在获取值时使用$,在分配值时使用。你有$switch=true;,这会给你一个错误。
  • 此外,您在该行的末尾有一个分号。这是不必要的;分号用于在同一行(以及其他一些地方)分隔多个命令,但不需要在一行上结束最后一个(/唯一)命令。
  • [命令(也称为test)有一种奇怪的语法。主要是因为它是一个命令,所以它通过通常的命令解析,所以例如[ 5 > 19 ]被解析为[ 5 ],输出发送到名为" 19" (然后是真的,因为" 5"是非空的)。 [ 5 ">" 19 ]更好,但仍然评估为true,因为>执行字符串(字母)比较,以及" 5"在" 19"之后按字母顺序排列。 [ 5 -gt 19 ]做了预期的事情。

    还有[[ ]](类似但更清晰的语法,并且在所有shell中都不可用)和(( ))(对于数学,不是字符串;也不在所有shell中)。请参阅BashFAQ #31

  • 将命令放在变量中通常是个坏主意。见BashFAQ #50
  • shellcheck.net是你的朋友。

答案 1 :(得分:1)

Bash没有布尔值的概念 - 没有true / false值。构造

[ $switch ]
除非switch变量未设置或设置为空字符串,否则

将为真。

[ ]    && echo yes                      # nothing is echoed
[ "" ] && echo yes                      # nothing is echoed
unset switch && [ $switch ] && echo yes # nothing is echoed
switch=1 && [ $switch ] && echo yes     # yes is echoed
switch=0 && [ $switch ] && echo yes     # yes is echoed - shell makes no distinction of contents - it is true as long it is not empty

另见:

答案 2 :(得分:1)

Here is a good guide for If else.但我希望展示一种不同的方法(您也可以在第3页的链接中找到)。

您的编码看起来像Javascript,因此我认为case您也可以指代if命令而不是Switch。 JavaScript中的case类似于shell中的true,但没有方法可以检查布尔值。您可以检查类似false#!/bin/bash case "$Variable" in false|0|"") echo "Boolean is set to false." ;; *) echo "Boolean is set to true." ;; esac 的字符串值,然后检查数字。

示例...

boolean values

<强>加成

请注意,有许多程序和工具以不同的形式使用{{1}}。

两个例子......
SQL通常使用数字作为布尔值。
Javascript使用true和false值。

含义:你的bash-script在处理之前必须知道布尔的格式!

答案 3 :(得分:0)

你需要的是这样的东西:

if
  CONDITION_SEE_BELOW
then
  server_var_shortname=$server_shared_shortname
  server_var=$server_shared
  server_var_bare=$server_shared_bare
else
  server_var_shortname=$server_vps_shortname
  server_var=$server_vps
  server_var_bare=$server_vps_bare
fi

在Bash(和其他shell)中,CONDITION_SEE_BELOW部分必须是一个命令。命令返回一个数值,按惯例0表示“true”,任何非零值表示“false”。如果命令返回then,则执行0子句,或者在所有其他情况下返回else子句。返回值不是命令输出的文本。在shell中,您可以在执行命令后立即使用特殊变量扩展$?访问它。

您可以使用命令truefalse对其进行测试,这可以做一件事:生成零(true)和非零(false)返回值。在命令行中尝试:

true ; echo "true returns $?"
false ; echo "false returns $?"

您可以在条件中使用任何所需的命令。特别是有两个命令是通过定义条件创建的:经典测试命令[ ](实际命令只是开括号,也可用作test命令),和双括号,特定于Bash的[[ ]](技术上不是命令,而是特殊的shell语法)。

例如,假设您的switch变量不包含任何内容(空字符串)或其他内容(包含至少一个字符的字符串),并假设在您的情况下,您的意思是将空字符串设置为“false”,并且其他字符串为“true”。然后你可以用作条件:

[ "$switch" ]

如果你可以使用只包含空格和制表符的字符串被认为是空的(这将由于标准shell扩展和命令参数的单词拆分而发生),那么你可以删除双引号。

双括号测试命令大部分类似,但它有一些很好的东西,包括大多数时候不需要双引号,支持内置&&||的布尔逻辑表达式,并将正则表达式匹配作为特征。然而,这是一种基础。

您可以将此作为对可以使用两个测试命令执行的各种测试的参考:

https://www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions

如果对shell编程感兴趣,请务必了解可以使用的各种测试,因为您可能经常使用其中的许多测试。

答案 4 :(得分:0)

除了@ Gordon的优秀答案之外,在bash中您还可以使用Double-Parentheses Construct。适用于整数,它是与其他语言最接近的形式。演示:

for i in {-2..2}; do
    printf "for %s " "$i"

    if (( i ))   # you can omit the `$`
    then
        echo is nonzero
    else
        echo is zero
    fi

done

输出:

for -2 is nonzero
for -1 is nonzero
for 0 is zero
for 1 is nonzero
for 2 is nonzero

你可以在里面使用任何算术运算,例如:

for i in {1..6}; do
    printf "for %s " "$i"

    if (( i % 2 )) #modulo
    then
        echo odd
    else
        echo even
    fi
done

输出

for 1 odd
for 2 even
for 3 odd
for 4 even
for 5 odd
for 6 even