2016-06-07 78 views
-1

我想提出一個腳本,可以做幾臺機器相同的任務,像這樣:猛砸模式內匹配[試塊

#!/bin/bash 
if [[ hostname = login.machine1 ]]; then 
    #do things how they are done on machine1 
    ... 
elif [[ hostname = login.machine2 ]]; then 
    #etc. 
fi 

問題:有些機器有幾個登錄節點,就像login1.machine2login2.machine2,等我都試過殼模式匹配和正則表達式,但他們沒有工作:

if [[ hostname = login?.machine2 ]] 
if [[ hostname == login?.machine2 ]] 
if [[ hostname =~ login[0-9].machine2 ]] 
if [[ hostname =~ login[0-9]\.machine2 ]] 

,並至少有十幾個類似的圖案,帶有或不帶引號等什麼是做一個測試,將返回正確的方式如果hostname = login1.machine2或login2.machine2,則爲true TC?積分可與[配合使用,而不是[[

+0

我建議使用變量'$ HOSTNAME'或out放命令主機名:'$(主機名)'。 – Cyrus

+0

我不知道你使用的是什麼樣的shell。但在bash中'if [[$(hostname)= login?.machine2]]'這將檢查主機名是否等於字符串「login?.machine2」 – naab

回答

0

命令hostname需求被包裹:

if [[ $(hostname) = login?.machine2 ]] 
3

您需要一個$之前的主機名才能使用該變量。

if [[ $hostname =~ login[0-9]\.machine2 ]]; then 
    echo "ok" 
fi 

而對於單[(SH),正則表達式運算符=~在bash的加入,所以它不應該是可能的SH做它本身。

+0

這應該是命令'hostname',而不是變量。一旦我用'$(主機名)替換它'我的第一次嘗試與純shell模式匹配工作,不需要正則表達式。成功! –

0

[[ hostname =~ ... ]]應該調用命令hostname還是你有一個變量hostname?無論是使用$HOSTNAME或命令替換$(hostname)

如果關心可移植性AWK可以使用,與老同學命令替換:

if printf "%s\n" "`hostname`" | awk '!/login[[:digit:]]\.machine2/{exit 1}'; then 
    printf "Matches...\n" 
else 
    printf "Doesn't match\n" 
fi 

如果不是我會強烈建議the answer by naab