/bin/dash: 检查 $1 是否为数字

Mar*_*ter 12 shell dash string regular-expression

检查 $1 是否为 /bin/dash 整数的最佳方法是什么?

在 bash 中,我可以这样做:

[[ $1 =~ ^([0-9]+)$ ]]
Run Code Online (Sandbox Code Playgroud)

但这似乎不符合 POSIX 标准,而且 dash 不支持

Joh*_*024 12

以下检测整数,正数或负数,并在dashPOSIX下工作:

选项1

echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"
Run Code Online (Sandbox Code Playgroud)

选项 2

case "${1#[+-]}" in
    ''|*[!0-9]*)
        echo "Not an integer" ;;
    *)
        echo "Integer" ;;
esac
Run Code Online (Sandbox Code Playgroud)

或者,稍微使用一下:(nop) 命令:

echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"
Run Code Online (Sandbox Code Playgroud)

  • 如果字符串包含换行符怎么办?`foo\n123\nbar` 不是一个整数,但会通过这个测试。 (5认同)
  • grep 版本,就是这样。案例版本看起来正确。 (3认同)

Jan*_*nis 5

是否dashbashkshzsh,POSIX sh,或posh“Bourne Shell的重新实现” sh); 该case构造是最广泛可用和最可靠的:

case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac
Run Code Online (Sandbox Code Playgroud)