BASH 检查 argv 是否是 0 到 100 之间的数字

BASH 检查 argv 是否是 0 到 100 之间的数字

我当前的脚本

checkargv='^[0-9]+$'
if ! [[ $1 =~ $checkargv ]]
        then
        echo "[!] How many times? $0 [number]" >&2
        exit 1
fi

for (( i=1;i<=$1;i++ ))
do
        x=$[($RANDOM % 100) + 1]
        ./script.sh $x
done

我的 argv $1 现在接受从 0 到 0 到 100 之间的任何数字都没关系,我怎样才能使 argv 只接受从 0 到 100 的数字

答案1

if [ "$1" -lt 1 ] || [ "$1" -gt 100 ]; then
    echo 'error (out of range)' >&2
    exit 1
fi

这假设 in 中的内容$1实际上是一个整数。您可以事先验证这一点

case "$1" in
    ("" | *[!0-9]*)
        echo 'error (not a positive decimal integer number)' >&2
        exit 1
esac

exit如果$1包含十进制数字以外的任何内容或为空,这将触发。

综合起来:

case "$1" in
    ("" | *[!0-9]*)
        echo 'error (not a positive decimal integer number)' >&2
        exit 1
        ;;
    *)
        if [ "$1" -lt 1 ] || [ "$1" -gt 100 ]; then
            echo 'error (out of range)' >&2
            exit 1
        fi
esac

但一个接一个地做可能看起来更好:

case "$1" in
    ("" | *[!0-9]*)
        echo 'error (not a positive decimal integer number)' >&2
        exit 1
esac

if [ "$1" -lt 1 ] || [ "$1" -gt 100 ]; then
    echo 'error (out of range)' >&2
    exit 1
fi

请注意,[算术运算符始终将数字视为十进制,即使它们以 开头0,而 POSIX shell 中的 shell 算术扩展会将以 0 开头的数字视为八进制(0100 对于 来说是 100 [,但对于 64 来说是 64 $((...)))。

答案2

使用算术代替正则表达式:

if ! (( num >= 0 && num <= 100 ))

(这假设 num 是数字。如果您还需要检查以确保 $num 是数字,则也可以使用正则表达式。)

相关内容