2014-07-09 48 views
1

我必須編寫一個shell腳本,我需要在許多遠程服務器上運行它。 腳本基本上在這些服務器上執行traceroute -m。從shell scipt中的命令行參數中提取一個模式

我必須先驗證ip格式,然後從輸入中提取ip地址。

輸入: -

192.168.1.1 
192.168.1.1 2222 
192.168.1.1:2222 
Any garbage values 

有可能是在輸入沒有端口,空間之前,端口號或冒號。

我要提取輸入的IP部分(192.168.1.1

我的腳本: -

ip=`echo $1` 
re='^([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})[ :]([0-9]{1,5})$' 
if [[ $ip =~ $re ]]; then 
      ip=`echo $ip | sed 's/[ :].*//'` 
      command=$(traceroute -m 9 $ip 2>&1) 
      echo "$command" 
else 
      echo "Entered ip address is not valid" 
fi 

我怎麼IP傳遞給腳本: -

$./script.sh 192.168.1.1 2222 

這腳本驗證的IP,但不是如果我通過IP空間和端口號。

輸入:-192.168.1.1 2222(不工作)

輸入: - 192.168.1.1:2222(工作)

輸入: - 192.168.1.1(不工作) 任何人都可以指出錯誤?

EDITED

還好我要去這個腳本: -

1 #!/bin/bash 
    2 ip="[email protected]" 
    3 re='([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})' 
    4 if [[ "$ip" =~ $re ]]; then 
    5   ip=`echo "$ip" | sed 's/^\([^: ]*\).*$/\1/'` 
    6   command=$(traceroute -m 9 "$ip" 2>&1) 
    7   echo "$command" 
    8 else 
    9   echo "Entered ip address is not valid" 
10 fi 

什麼值得注意的?任何我可能錯過的場景?

回答

3

您的正則表達式需要刪除^$

有你這樣的腳本:

re='([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})[ :]' 

if [[ "$ip" =~ $re ]]; then 
    ip="${BASH_REMATCH[1]}" 
    command=$(traceroute -m 9 "$ip" 2>&1) 
    echo "$command" 
else 
    echo "Entered ip address is not valid" 
fi 
+0

'ip =「$ {BASH_REMATCH [1]}」'有時在solaris上不起作用。 我可以使用'ip ='echo $ ip | sed's/[:]。* //''而不是那個? –

+0

你可以試試'echo「$ ip」| sed's/^ \([^:] * \)。* $/\ 1如果ip =「$ {BASH_REMATCH [1]}」不起作用。 – anubhava

+0

非常感謝你! :) –

3

這個腳本驗證IP而不是如果我通過IP與空間。

因爲腳本的參數 - $1$2$3等 - 被拆分的空白。如果您想將整個數組視爲一個字符串,請使用[email protected]

BTW此:

ip=`echo $1` 

是多餘的; ip=$1就足夠了(或者[email protected])。

但是,您現有的正則表達式現在將無法處理沒有端口的ip的情況。要糾正,只是下降的最後一部分:

re='^([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})' 

如果您需要執行更徹底的驗證,在結束使用[: ]*[0-9]*$