将变量与字符串进行比较 bash
Comparing variables with strings bash
上下文
我们很多CentOS服务器我想安装一些监控软件,该软件是基于CentOS版本的,我想查看发布版本并以此为基础安装软件。
问题
似乎 if 语句 运行 成功且没有错误,而结果永远不会对两个或所有三个 if 语句都为真。我查看了 if 命令和测试,似乎我应该在 bash 中使用双括号和单个 = 符号。我相信我正在做一些非常简单的错误,但我就是找不到它。
代码
#!/bin/bash
versionknown=false
version=$(</etc/centos-release)
known_version1="CentOS release 6.9 (Final)"
known_version2="CentOS Linux release 7.3.1611 (Core)"
if [[ "$version"="CentOS release 6.9 (Final)" ]] ; then
echo "Same versions as expected"
versionknown=true
#run commands for this specific version
fi
if [[ "$version"="CentOS Linux release 7.3.1611 (Core)" ]] ; then
echo "Same versions as expected v2"
versionknown=true
#run commands for this specific version
fi
if [[ "$versionknown"=false ]] ; then
echo "Different version detected than known:"
echo $version
echo "Aborted"
fi
echo $versionknown
结果
Same versions as expected
Same versions as expected v2
Different version detected than known:
CentOS Linux release 7.3.1611 (Core)
Aborted
true
更新
收到一些回复后,我更改了我的代码,在等号 (=) 周围添加了 space。仍然没有按预期工作,因为比较应该 return 在第二个 if 语句上为真,但它没有。
代码#2
#!/bin/bash
versionknown=false
version=$(</etc/centos-release)
known_version1="CentOS release 6.9 (Final)"
known_version2="CentOS Linux release 7.3.1611 (Core)"
if [[ "$version" = "CentOS release 6.9 (Final)" ]] ; then
echo "Same versions as expected"
versionknown=true
#run script for this specific version
fi
if [[ "$version" = "CentOS Linux release 7.3.1611 (Core)" ]] ; then
echo "Same versions as expected v2"
versionknown=true
#run script for this specific version
fi
if [[ "$versionknown" = false ]] ; then
echo "Different version detected than known:"
echo $version
echo "Aborted"
fi
echo $versionknown
结果 #2
Different version detected than known:
CentOS Linux release 7.3.1611 (Core)
Aborted
false
更新
declare -p version
告诉我 /etc/centos-release
有一个 space 添加到脚本文件的末尾,我相信在 CentOS 6.9 版(最终版)上情况并非如此.在字符串中添加 space,或者一起使用我的 known_version 变量并添加 space 解决了问题,脚本现在按预期工作。
作为一般经验法则,在可能所有的编程语言中,单个等号 (=
) 用于赋值而不用于相等检查,在这种情况下是双等号 (=
) 符号。
您输入所有 if
语句的原因是您的赋值表达式的结果是 true
,因此 if
语句被评估为 true
并被执行。
更新
感谢@chepner 的评论,当与单方括号 [ ]
或双方括号 [[ ]]
关联时,使用单个等号 (=
) 进行相等性检查。在 [ ]
或 [[ ]]
.
两种情况下,bash 还支持双等号 (=
) 作为相等性检查
你想要的大概是这样的:
#!/bin/bash
versionknown=false
version=$(</etc/centos-release)
known_version1="CentOS release 6.9 (Final)"
known_version2="CentOS Linux release 7.3.1611 (Core)"
if [[ "$version" == "CentOS release 6.9 (Final)" ]] ; then
echo "Same versions as expected"
versionknown=true
#run commands for this specific version
fi
if [[ "$version" == "CentOS Linux release 7.3.1611 (Core)" ]] ; then
echo "Same versions as expected v2"
versionknown=true
#run commands for this specific version
fi
if [[ "$versionknown" == "false" ]] ; then
echo "Different version detected than known:"
echo $version
echo "Aborted"
fi
echo $versionknown
你的 if 语句有问题。
简单回答:
- 如果要比较字符串,请确保使用
==
。
- 请使用
if [ "$version" == "xyz" ]
代替if [[ "$version" = "xyz" ]]
总结:if [ "$version"=="CentOS release 6.9 (Final)" ]; then
它应该有效!
此致,FrankTheTank
=
符号周围需要空格;没有它,shell 将 "expression" 视为单个词,而不是两个词的相等性比较。
[[ "$version" = "CentOS release 6.9 (Final)" ]]
[[ a=b ]]
等同于[[ -n a=b ]]
,也就是说,你只是在测试单个单词是否为非空字符串。
在 [[ ... ]]
中使用 =
还是 ==
是风格问题; bash
两者都支持。
我会完全避免使用 versionknown
变量,并编写如下代码:
version=$(</etc/centos-release)
known_version1="CentOS release 6.9 (Final)"
known_version2="CentOS Linux release 7.3.1611 (Core)"
if [[ "$version" = "$known_version1" ]] ; then
echo "Same versions as expected"
#run commands for this specific version
elif [[ "$version" = "$known_version2" ]] ; then
echo "Same versions as expected v2"
#run commands for this specific version
else
echo "Different version detected than known:"
echo "$version"
echo "Aborted"
fi
或 case
语句
case $version in
"$known_version1")
echo "Same versions as expected"
# ...
;;
"$known_version2")
echo "Same versions as expected v2"
# ...
;;
*)
echo "Different version detected than known:"
echo "$version"
echo "Aborted"
esac
上下文
我们很多CentOS服务器我想安装一些监控软件,该软件是基于CentOS版本的,我想查看发布版本并以此为基础安装软件。
问题
似乎 if 语句 运行 成功且没有错误,而结果永远不会对两个或所有三个 if 语句都为真。我查看了 if 命令和测试,似乎我应该在 bash 中使用双括号和单个 = 符号。我相信我正在做一些非常简单的错误,但我就是找不到它。
代码
#!/bin/bash
versionknown=false
version=$(</etc/centos-release)
known_version1="CentOS release 6.9 (Final)"
known_version2="CentOS Linux release 7.3.1611 (Core)"
if [[ "$version"="CentOS release 6.9 (Final)" ]] ; then
echo "Same versions as expected"
versionknown=true
#run commands for this specific version
fi
if [[ "$version"="CentOS Linux release 7.3.1611 (Core)" ]] ; then
echo "Same versions as expected v2"
versionknown=true
#run commands for this specific version
fi
if [[ "$versionknown"=false ]] ; then
echo "Different version detected than known:"
echo $version
echo "Aborted"
fi
echo $versionknown
结果
Same versions as expected
Same versions as expected v2
Different version detected than known:
CentOS Linux release 7.3.1611 (Core)
Aborted
true
更新
收到一些回复后,我更改了我的代码,在等号 (=) 周围添加了 space。仍然没有按预期工作,因为比较应该 return 在第二个 if 语句上为真,但它没有。
代码#2
#!/bin/bash
versionknown=false
version=$(</etc/centos-release)
known_version1="CentOS release 6.9 (Final)"
known_version2="CentOS Linux release 7.3.1611 (Core)"
if [[ "$version" = "CentOS release 6.9 (Final)" ]] ; then
echo "Same versions as expected"
versionknown=true
#run script for this specific version
fi
if [[ "$version" = "CentOS Linux release 7.3.1611 (Core)" ]] ; then
echo "Same versions as expected v2"
versionknown=true
#run script for this specific version
fi
if [[ "$versionknown" = false ]] ; then
echo "Different version detected than known:"
echo $version
echo "Aborted"
fi
echo $versionknown
结果 #2
Different version detected than known:
CentOS Linux release 7.3.1611 (Core)
Aborted
false
更新
declare -p version
告诉我 /etc/centos-release
有一个 space 添加到脚本文件的末尾,我相信在 CentOS 6.9 版(最终版)上情况并非如此.在字符串中添加 space,或者一起使用我的 known_version 变量并添加 space 解决了问题,脚本现在按预期工作。
作为一般经验法则,在可能所有的编程语言中,单个等号 (=
) 用于赋值而不用于相等检查,在这种情况下是双等号 (=
) 符号。
您输入所有 if
语句的原因是您的赋值表达式的结果是 true
,因此 if
语句被评估为 true
并被执行。
更新
感谢@chepner 的评论,当与单方括号 [ ]
或双方括号 [[ ]]
关联时,使用单个等号 (=
) 进行相等性检查。在 [ ]
或 [[ ]]
.
=
) 作为相等性检查
你想要的大概是这样的:
#!/bin/bash
versionknown=false
version=$(</etc/centos-release)
known_version1="CentOS release 6.9 (Final)"
known_version2="CentOS Linux release 7.3.1611 (Core)"
if [[ "$version" == "CentOS release 6.9 (Final)" ]] ; then
echo "Same versions as expected"
versionknown=true
#run commands for this specific version
fi
if [[ "$version" == "CentOS Linux release 7.3.1611 (Core)" ]] ; then
echo "Same versions as expected v2"
versionknown=true
#run commands for this specific version
fi
if [[ "$versionknown" == "false" ]] ; then
echo "Different version detected than known:"
echo $version
echo "Aborted"
fi
echo $versionknown
你的 if 语句有问题。
简单回答:
- 如果要比较字符串,请确保使用
==
。 - 请使用
if [ "$version" == "xyz" ]
代替if [[ "$version" = "xyz" ]]
总结:if [ "$version"=="CentOS release 6.9 (Final)" ]; then
它应该有效!
此致,FrankTheTank
=
符号周围需要空格;没有它,shell 将 "expression" 视为单个词,而不是两个词的相等性比较。
[[ "$version" = "CentOS release 6.9 (Final)" ]]
[[ a=b ]]
等同于[[ -n a=b ]]
,也就是说,你只是在测试单个单词是否为非空字符串。
在 [[ ... ]]
中使用 =
还是 ==
是风格问题; bash
两者都支持。
我会完全避免使用 versionknown
变量,并编写如下代码:
version=$(</etc/centos-release)
known_version1="CentOS release 6.9 (Final)"
known_version2="CentOS Linux release 7.3.1611 (Core)"
if [[ "$version" = "$known_version1" ]] ; then
echo "Same versions as expected"
#run commands for this specific version
elif [[ "$version" = "$known_version2" ]] ; then
echo "Same versions as expected v2"
#run commands for this specific version
else
echo "Different version detected than known:"
echo "$version"
echo "Aborted"
fi
或 case
语句
case $version in
"$known_version1")
echo "Same versions as expected"
# ...
;;
"$known_version2")
echo "Same versions as expected v2"
# ...
;;
*)
echo "Different version detected than known:"
echo "$version"
echo "Aborted"
esac