【问题标题】:How to test if variable is a number with certain max digits in linux non-bash shell script如何在linux非bash shell脚本中测试变量是否是具有某些最大位数的数字
【发布时间】:2017-08-01 23:20:26
【问题描述】:

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

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

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

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

我正在使用busybox中的ash。

【问题讨论】:

  • 我把正则表达式shell模式混在一起了。根据 ash man 文档: 模式由匹配自身的普通字符和元字符组成。元字符是“!”、“*”、“?”和“[”。如果引用这些字符,它们就会失去其特殊含义。 所以{5,}* 无法识别。

标签: regex linux shell numbers ash


【解决方案1】:

您可以使用数值测试:

$ 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 下工作。

【讨论】:

    【解决方案2】:

    不确定您是否需要在案例陈述中使用它,因为我会这样做:

    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
    

    【讨论】:

      【解决方案3】:
      case  $([[ $num =~ ^[0-9]+$ ]] && echo 0) in
       0) echo good ;;
      *) echo bad ;;
      esac
      

      【讨论】:

        猜你喜欢
        • 2010-10-22
        • 2021-03-24
        • 1970-01-01
        • 2018-05-24
        • 2011-02-04
        • 2018-02-01
        • 2017-12-30
        相关资源
        最近更新 更多