我在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相匹配。请帮忙。
答案 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
的程序。