2012-12-31 66 views
-2

我想做一個case語句,檢查給定的參數,如果它的IP連接到它。我無法驗證IP。IP正則表達式的情況下

case $1 in 
-h) 
    echo "usage: $0 <IP/DNS/IP range> <Port/Portrange>"; 
    ;; 
--help) 
    echo "usage: $0 <IP/DNS/IP range> <Port/Portrange>"; 
    ;; 
    [1-255].[0-255].[0-255].[0-255]) 

上面的正則表達式僅適用於1.1.1.1或相同的IP。

+0

DRY:使用'-h | - 幫助)'如果他們有相同的行爲。 – tripleee

+0

此外,案件只支持通配符,而不是正則表達式,AFAIK。 – anishsane

+0

任何想法我怎麼能做一個通配符,將使區別ip(*。*。*。*)和ip範圍? (*。*。*。* - *。*。*。*) –

回答

1

字符類定義了單個字符。因此[1-255]匹配1-2或5或5範圍內的單個字符(同樣,sic)。

如果您想堅持case語法,正確的修復方法是清除不允許的變體,然後轉到您的實際處理。

*[!.0-9]* | *.*.*.*.* | .* | *. | *[0-9][0-9][0-9][0-9]* \ 
    | *2[6-9][0-9]* | *25[6-9]*) 
    error ;; 
# require three dots 
*.*.*.*) ... Success scenario ... ;; 
*) error ;; 

(我敢肯定有一些角落情況下,我都忽略不動。)

爲了簡化代碼,也許你可以在成功的情況下使用變量realip=false並將其設置爲true,然後做esac之後的簡單if $realip,並儘可能簡單地將代碼保留在case之內。

由此,由case支持的模式是glob模式,而不是真正的正則表達式。

+0

謝謝tripleee。但是這樣做不會讓我使用這個命令的主機名或IP範圍,對吧? –

+1

沒錯,但是你需要檢查一個有效的IP嗎?讓解析器處理用戶輸入,如果失敗則退出。 – tripleee

+0

謝謝你,我設法做了一些事情。 還有一個問題,有沒有辦法從一個範圍內生成所有的IP? 10.0.0.0-10.0.1.0?一個簡單的方法。 –

相關問題