2014-01-20 35 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