Linux正则表达式

时间:2014-01-20 03:13:55

标签: bash shell

我在Linux中使用shell脚本。我想检查MAX_ARCHIVE_AGE的值是否为数字。我的代码是这样的:

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相匹配。请帮忙。

2 个答案:

答案 0 :(得分:4)

要获得POSIX兼容性,请查看case。我也发现它比相应的if构造更优雅,但是当你第一次看到它时,语法可能看起来有点奇怪。

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

顺便提一下,请注意使用>&2将错误消息重定向到标准错误。

答案 1 :(得分:2)

您的expr将匹配包含任何数字的任何内容;最好检查它是否包含位数,或相反,检查它是否包含任何 -digits。要做到这一点,你可以写:

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_AGE来进行初始化MAX_ARCHIVE_AGE=50(无空格),而非MAX_ARCHIVE_AGE = 50。后者尝试使用参数MAX_ARCHIVE_AGE=运行名为50的程序。