如何编写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
答案 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。
答案 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中,您可以在执行命令后立即使用特殊变量扩展$?
访问它。
您可以使用命令true
和false
对其进行测试,这可以做一件事:生成零(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