2014-01-20 36 views
1

我正在Linux中使用shell腳本。我想檢查MAX_ARCHIVE_AGE的值是否爲數字。我的代碼是這樣的:Linux正則表達式

MAX_ARCHIVE_AGE = "50" 

expr="*[0-9]*" 

if test -z "$MAX_ARCHIVE_AGE"; 
then 
    echo "MAX_ARCHIVE_AGE variable is missing or not initiated" 
else 
    if [ "$MAX_ARCHIVE_AGE" != $expr ] 
    then 
     echo "$MAX_ARCHIVE_AGE is not a valid value" 
    fi 
fi 

我想要的MAX_ARCHIVE_AGE值與我EXPR匹配。請幫忙。

+1

Shell腳本語法不是內核的一個特性,Bash可以移植到衆多的Unix平臺以及Windows上,所以在你的問題中沒有任何「Linux」。 – tripleee

+0

您對數字的定義僅限於「整數」? – tuxdna

回答

2

你的expr將匹配任何包含任何數字的任何東西;最好檢查它是否包含只有數字,或者相反,檢查它是否包含任何-數字。要做到這一點,你可以寫:

if ! [[ "$MAX_ARCHIVE_AGE" ]] ; then 
    echo "MAX_ARCHIVE_AGE is blank or uninitialized" >&2 
elif [[ "$MAX_ARCHIVE_AGE" == *[^0-9]* ]] ; then 
    echo "$MAX_ARCHIVE_AGE is not a valid value" >&2 
fi 

另外請注意,您將通過例如編寫初始化MAX_ARCHIVE_AGEMAX_ARCHIVE_AGE=50(無空格),而不是MAX_ARCHIVE_AGE = 50。後者試圖運行一個名爲MAX_ARCHIVE_AGE的程序,其參數爲=50

+0

是否有另一種方法將值與數字正則表達式匹配? 「$ MAX_ARCHIVE_AGE」== * [^ 0-9] *似乎不起作用。 – makalshrek

+1

@SciasTwentyThree:當然還有其他方法,但這種方式很好。 (我已經測試過了。)如果你能從中得到的最多的東西「看起來不起作用」,那麼我不清楚你還有哪些其他的方法可以帶來更好的運氣。 。 。 – ruakh

4

對於POSIX兼容性,請參閱case。我還發現它比相應的if構造更優雅,但是當您第一次看到它時,語法看起來有點奇怪。

case $MAX_ARCHIVE_AGE in 
    '') echo "empty" >&2 ;; 
    *[!0-9]*) echo "not a number" >&2 ;; 
esac 

順便說一下,請注意錯誤消息重定向到標準錯誤>&2