[英]Comparing variables with strings bash
對於很多我們的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,否則返回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變量並添加空格可以解決問題,腳本現在可以按預期運行。
您需要在=
號周圍加上空格; 沒有它,shell將“表達式”視為一個單詞,而不是兩個單詞的相等性比較。
[[ "$version" = "CentOS release 6.9 (Final)" ]]
[[ a=b ]]
等效於[[ -na=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
根據一般經驗,可能在所有編程語言中,單個等號( =
)用於賦值,而不用於等價性檢查,在這種情況下,等號是雙等號( =
)。
輸入所有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
if [ "$version"=="CentOS release 6.9 (Final)" ]; then
,它辛苦了!
問候,FrankTheTank
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.