如何在Bash中用布尔值编写if / else?

3 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
}
Run Code Online (Sandbox Code Playgroud)

我不熟悉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
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 5

首先,shell(包括bash)没有布尔值;他们甚至没有整数(尽管它们可以伪造)。通常,它们具有字符串。bash也有数组...字符串。伪造布尔值的方法有很多种。我最喜欢的是使用字符串“ true”和“ false”。这些也恰好分别是总是成功和失败的命令的名称,它们之所以派上用场,是因为该if语句实际上接受命令,then如果成功则运行该子句,如果else失败则运行该子句。因此,您可以“运行”布尔值,如果将其设置为“ 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
Run Code Online (Sandbox Code Playgroud)

请注意,您会看到的更常见的格式if有方括号,例如if [ something ]; then。在这种情况下,[实际上是一个将其参数作为表达式求值的命令(不是某种有趣的分组运算符)。因此,这[ "some string" = "some other string" ]是一条由于字符串不相等而失败的命令。您可以使用if [ "$switch" = true ]; then,但我更喜欢直接作弊并使用伪布尔值。

警告:如果您确实使用了我建议的作弊功能,请确保将“布尔值”变量设置为“真”或“假”,而不是未设置,也不要设置为其他值。如果设置为其他任何值,我对结果不承担任何责任。

其他一些语法说明:

  • $在获取变量值时使用,而不是在分配变量时使用。您在$switch=true;那里,这将使您出错。
  • 另外,在该行的末尾有一个分号。这是不必要的;分号用于在同一行(以及其他一些地方)中分隔多个命令,但不需要在一行中结束最后一个(/仅)命令。
  • [命令(也称为test)具有一种怪异的语法。通常是因为它是一条命令,所以它会经历通常的命令解析,因此例如[ 5 > 19 ]将解析结果[ 5 ]与发送到名为“ 19”的文件的输出一样解析(然后为true,因为“ 5”是非空白的)。[ 5 ">" 19 ]更好,但仍进行计算,因为>会进行字符串(字母)比较,并且“ 5”按字母顺序在“ 19”之后。[ 5 -gt 19 ]做预期的事情。

    还有[[ ]](相似但更简洁的语法,并非在所有shell中都可用)和(( ))(对于数学,不是字符串;也不是在所有shell中都适用)。参见BashFAQ#31

  • 将命令放在变量中通常不是一个好主意。参见BashFAQ#50
  • shellcheck.net是您的朋友。