2011-05-10 24 views
17

我有一個代碼,我需要它來呼應1,如果主機名與V-qai01或任何其他VQ *服務器匹配:Bash:檢查主機名是否爲v-q *如何使用通配符?

if [ `hostname -s` -eq `v-q*` ]; then 
     echo "1" 
fi 

林有幾個誤區:

./run.sh: line 3: v-q*: command not found 
./run.sh: line 3: [: v-qai01: unary operator expected 

任何建議請?

如果我有下一個案例呢?

hostname=`hostname -s` 

portalesWildcard=v-*ws* 
qaiservers={'v-qai01' 'v-qai02'} 
portales={'t1wsyellar01' } 


if [[ ${hostname} = ${qaiservers} ]]; then 
    echo "yes" 
fi 

感謝

回答

34

使用雙括號和=運營商將接受通配符:

#!/bin/bash 

if [[ $(hostname -s) = v-q* ]]; then 
    ... 
fi 

它也有一個=~運營商正則表達式匹配時你需要更高級的字符串匹配。這將檢查主機名還與一個或多個數字結尾:

#!/bin/bash 

if [[ $(hostname -s) =~ ^v-q.*[0-9]+$ ]]; then 
    ... 
fi 
+0

如果我有一個主機名數組,並且我想檢查它是否屬於當前服務器主機名,該怎麼辦? – BoDiE2003 2011-05-10 19:57:58

+0

@ BoDiE2003,值得一個單獨的問題。 – 2011-05-10 21:14:59

1

這將從字符串的開頭刪除v-q。如果條件爲真,您的主機名匹配v-q*

hostname=`hostname -s` 
if ! [ "${hostname#v-q}" = "${hostname}" ]; then 
    echo "1" 
fi 
+0

如果我在hostanmes列表中有一個數組,那該怎麼辦? – BoDiE2003 2011-05-10 19:56:35

5

可以使用case聲明:

case $(hostname -s) in 
    v-q*) echo yes ;; 
    *) echo no ;; 
esac 
+0

[指南說](http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_03.html)在case語句的末尾必須有'esac',而不是'done'。 – 2015-05-04 18:51:37

+0

挺對的。感謝您指出錯誤。 – 2015-05-04 19:29:55

4

的實際問題,原來的海報已經是他們使用的字符串各地反引號:

if [ `hostname -s` -eq `v-q*` ]; then 

而不是字符串引號。反引號告訴shell將它們中的字符串作爲命令執行。在這種情況下,殼試圖執行:

v-q* 

其失敗。

+1

更常稱爲「反引號」 – chepner 2012-06-07 01:47:18

+0

爲術語和清晰度編輯。 – 2017-03-20 02:45:48

相關問題