如何测试变量是否是 linux 非 bash shell 脚本中具有某些最大数字的数字

How to test if variable is a number with certain max digits in linux non-bash shell script

Here 我找到了测试变量是否为数字的好方法:

case $string in
   ''|*[!0-9]*) echo bad ;;
   *) echo good ;;
esac

我正在尝试修改它以测试变量是否为 1、2、3 或 4 位自然数(在 0-9999 范围内),因此我添加了 |*[0-9]{5,}* 以排除数字超过 5 位数字,但下面的代码会为大于 9999 的数字打印 good,例如1234567.

case $string in
   ''|*[!0-9]*|*[0-9]{5,}*) echo bad ;;
   *) echo good ;;
esac

我正在使用来自 busybox 的 ash。

不确定在 case 语句中是否需要这个,因为我会这样做:

if { test "$string" -ge 0 && test "$string" -lt 10000; } 2> /dev/null; then
  echo good
else 
  echo bad
fi

如果您想在严格可移植的 shell 中使用 case 语句,您可能会遇到以下问题:

case $string in 
    [0-9]|[0-9][0-9]|[0-9][0-9][0-9]|[0-9][0-9][0-9][0-9]) echo good;;
     *) echo bad;;
esac

您可以使用数值测试:

$ s=123
$ (( s>=0 && s<=9999 )) && echo "true" || echo "false"
true
$ s=123456
$ (( s>=0 && s<=9999 )) && echo "true" || echo "false"
false
$ s=-1
$ (( s>=0 && s<=9999 )) && echo "true" || echo "false"
false

您只需要确保该字符串的开头是可选的 ± 的所有数字。在数字上下文中使用的非数字字符串将计算为 0,因此您需要对其进行测试。

您可以将案例陈述用于:

case $s in 
  ''|*[!0-9]*) echo bad ;;
  *) (( s>=0 && s<=9999 )) && echo "true" || echo "false" ;;
esac

或:

$ [ "$s" -eq "$s" ] 2>/dev/null && (( s>=0 && s<=9999 )) && echo "true" || echo "false"

也有效。

这些 应该 在任何 POSIX shell 下工作。

case  $([[ $num =~ ^[0-9]+$ ]] && echo 0) in
 0) echo good ;;
*) echo bad ;;
esac