在 case 语句中用正则表达式匹配数字

sie*_*ery 1 bash regular-expression case

我想检查一个 shell 脚本的参数是否是一个整数(即一个非负整数:0, 1, 2, 3, ..., 17, ..., 42, ... 等,但不是 3.1416 或 ?5 ) 以十进制表示(所以不像 0x11 或 0x2A)。如何使用正则表达式作为条件(匹配数字)编写 case 语句?我尝试了几种不同的方法(例如,[0-9]+^[0-9][0-9]*$);它们都不起作用。就像在下面的示例中一样,有效数字通过旨在捕获它们并与*通配符匹配的数字正则表达式 。

i=1
let arg_n=$#+1

while (( $i < $arg_n )); do
    case ${!i} in
    [0-9]+)
        n=${!i}
        ;;
    *)
        echo 'Invalid argument!'
        ;;
    esac
    let i=$i+1
done
Run Code Online (Sandbox Code Playgroud)

输出:

i=1
let arg_n=$#+1

while (( $i < $arg_n )); do
    case ${!i} in
    [0-9]+)
        n=${!i}
        ;;
    *)
        echo 'Invalid argument!'
        ;;
    esac
    let i=$i+1
done
Run Code Online (Sandbox Code Playgroud)

gle*_*man 9

case不使用正则表达式,它使用模式

对于“1 位或更多位数字”,请执行以下操作:

shopt -s extglob
...
    case ${!i} in
        +([[:digit:]]) )
            n=${!i}
            ;;
    ...
Run Code Online (Sandbox Code Playgroud)

如果要使用正则表达式,请使用内的=~运算符[[...]]

if [[ ${!i} =~ ^[[:digit:]]+$ ]]; then
    n=${!i}
else
    echo "Invalid"
fi
Run Code Online (Sandbox Code Playgroud)