2016-08-17 43 views
0

我正在嘗試創建一個腳本,只是爲了創建一個新用戶併爲他生成一個密碼。0-9和[[:digit:]]將匹配1-10,但不是更多

現在我必須檢查用戶是否輸入了一些愚蠢的東西,而不是一個數字。

function checkifcorrectnum() { 
#Check if the User did something else than enter a number 
#And check if the Number is absurdly big 

case "$1" in 
    [[:digit:]]) if [ "$1" -gt "255" ]; then echo "Too big!" ; else : ; fi ;; 
    *) echo "Please enter a number!"; exit ;; 
esac 

} 

但是當我運行該腳本,並輸入1-9它的工作原理,但任何更高不會

+0

整個腳本: https://drive.google.com/file/d/0Bx5xXH1384nZQS12VnhoN1U0MWc/view?usp=sharing – DatNoHand

回答

1

你只剛剛[[:digit:]]匹配單個數字。像*+這樣的運營商不能像使用正則表達式一樣使用bash globbing,並且可以多次匹配任何令牌。如果你想堅持你的方法,你確切地知道你想要允許的數字,然後使用例如2位:

case "$1" in 
    [[:digit:]][[:digit:]]) 

如果你不能確定,則:

case "$1" in 
    [[:digit:]]*) 

*擴展到任意數量的字符。

但我認爲你應該看看由=~運營商的[[通過bash提供的正則表達式匹配,讓你的整個功能可改寫爲:

if [[ $1 =~ ^[[:digit:]]+$ ]]; then 
    [[ $1 -gt 255 ]] && echo "Too big!" 
else 
    echo 'Please enter a number!' && exit 
fi 

而且因爲你沒有做任何事情,如果數字是<=255所以[[ $1 -gt 255 ]] && echo "Too big!"就夠了。

+0

謝謝大家!但爲什麼+ $? – DatNoHand

+0

@DatNoHand'+'是一個正則表達式運算符,它表示前面的一個或多個標記,所以如果參數只包含一個或多個數字,則可以匹配'^ [[:digit:]] + $'。 – heemayl

+0

和爲什麼雙括號?對不起,剛開始學習 – DatNoHand

0

因爲它是更容易測試一個字符串是否是一些,而不是測試,如果是這樣,我建議反轉測試的順序:

function checkifcorrectnum() { 
    case "$1" in 
    *[^[:digit:]]*) echo "Please enter a number";; 
    *) [ "$1" -gt "255" ] && echo "Too big!" ;; 
    esac; 
} 

的水珠,如果在任何字符*[^[:digit:]]*比賽$1不是一個數字。

實例:

$ checkifcorrectnum 255 
$ checkifcorrectnum 256 
Too big! 
$ checkifcorrectnum 25z 
Please enter a number 

作爲題外話,關鍵字function是bash的僅與通常不是必要的。刪除關鍵字後,代碼不僅在bash中工作,而且在任何POSIX兼容shell中工作。

+0

所以你可以省略if在第二種情況下? – DatNoHand

+0

@DatNoHand是的,你可以省略第二種情況。如果你這樣做,當然,如果數字太大,就不會有任何警告。 – John1024

+0

哈哈不,我的意思是,如果[..]部分 – DatNoHand

相關問題