对于我们很多的CentOS服务器,我想安装一些监控软件,该软件基于CentOS版本,我想查看发布版本并根据它安装软件。
似乎if语句成功运行且没有错误,而结果对于两个或所有三个if语句都不应该为真。我查看了if命令和测试,似乎我应该在bash中使用双括号和single =符号。我相信我做的事情非常简单,但是我找不到它。
#!/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
在得到一些回复后,我改变了我的代码,在等号(=)周围添加了空格。仍然没有按预期工作,因为比较应该在第二个if语句中返回true,而不是。
#!/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
Different version detected than known:
CentOS Linux release 7.3.1611 (Core)
Aborted
false
declare -p version
了解到我/etc/centos-release
在脚本文件的末尾添加了一个空格,我相信在CentOS版本6.9(最终版)中并非如此。添加字符串中的空格,或者一起使用我的known_version变量并添加空格来解决问题,脚本现在可以按预期工作。
答案 0 :(得分:1)
你需要=
标志周围的空格;如果没有它,shell会将“表达式”视为单个单词,而不是将两个单词作为相等的比较。
[[ "$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
答案 1 :(得分:0)
作为一般的经验法则,可能在所有编程语言中,一个相等的(=
)符号用于赋值而不用于相等检查,在这种情况下是等于(=
签收。
您输入所有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
答案 2 :(得分:-1)
你在if语句中做错了什么。
简单回答:
==
。 if [ "$version" == "xyz" ]
代替if [[ "$version" = "xyz" ]]
总结:if [ "$version"=="CentOS release 6.9 (Final)" ]; then
它可以工作!
问候,FrankTheTank