簡體   English   中英

用字符串bash比較變量

[英]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。

代碼#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在腳本文件的末尾添加了一個空格,我相信在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陳述中做錯了什么。

簡單答案:

  1. 如果要比較字符串,請確保使用==
  2. 請使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM