【问题标题】:Testing if a variable is an integer [duplicate]测试变量是否为整数
【发布时间】:2011-04-07 02:58:04
【问题描述】:

我想测试我的变量$var 是否实际上是一个整数。请问我该怎么做?

【问题讨论】:

    标签: bash testing variables integer


    【解决方案1】:

    只要您使用的是 bash 版本 >=3,您就可以使用正则表达式:

    [[ $a =~ ^-?[0-9]+$ ]] && echo integer
    

    虽然this bash FAQ 提到了各种 bash 3.x 中 bash 正则表达式实现的不一致(是否应该引用正则表达式),但我认为在这种情况下,没有需要引用的字符在任何版本中,所以我们是安全的。至少它对我有用:

    • 3.00.15(1)-release (x86_64-redhat-linux-gnu)
    • 3.2.48(1)-release (x86_64-apple-darwin12)
    • 4.2.25(1)-release (x86_64-pc-linux-gnu)
    $ a="" $ [[ $a =~ ^-?[0-9]+$ ]] && 回显整数 $ a="" $ [[ $a =~ ^-?[0-9]+$ ]] && 回显整数 $ a="a" $ [[ $a =~ ^-?[0-9]+$ ]] && 回显整数 $ a='你好世界!' $ [[ $a =~ ^-?[0-9]+$ ]] && 回显整数 $ a='你好世界42!' $ [[ $a =~ ^-?[0-9]+$ ]] && 回显整数 $ a="42" $ [[ $a =~ ^-?[0-9]+$ ]] && 回显整数 整数 $ a="42.1" $ [[ $a =~ ^-?[0-9]+$ ]] && 回显整数 $ a="-42" $ [[ $a =~ ^-?[0-9]+$ ]] && 回显整数 整数 $ a="两个" $ [[ $a =~ ^-?[0-9]+$ ]] && 回显整数

    【讨论】:

      【解决方案2】:

      一个 hackish-but-portable 解决方案是使用 test-eq(整数相等)运算符将值与自身进行比较,并丢弃任何产生的错误消息:

      is_int () { test "$@" -eq "$@" 2> /dev/null; }
      
      for input in "0.3" "abc" "3"; do
          if is_int "$input"; then
              echo "Integer: $input"
          else
              echo "Not an integer: $input"
          fi
      done
      

      【讨论】:

        【解决方案3】:

        我需要一些只对正整数返回 true 的东西(而对于空字符串则失败)。我决定了:

        test -n "$1" -a "$1" -ge 0 2>/dev/null

        2>/dev/null 之所以存在,是因为如果输入(至 -ge)未解析为整数,测试会打印错误(并返回 2)

        我希望它可以更短,但“测试”似乎没有“安静”选项,并将“”视为有效整数(零)。

        【讨论】:

          【解决方案4】:
          shopt -s extglob
          case "$var" in
           +([0-9]) ) echo "integer";
          esac
          

          【讨论】:

            【解决方案5】:

            echo your_variable_here | grep "^-\?[0-9]*$" 如果是整数则返回变量,否则不返回任何内容。

            【讨论】:

            • 实际上,如果它是一个整数,它也会将变量打印到标准输出。你真的想要grep -q,它不会打印到标准输出,如果匹配,它只会以 0 或非 0 退出。
            【解决方案6】:

            你可以这样做:

            shopt -s extglob
            
            if [ -z "${varname##+([0-9])}" ]
            then
              echo "${varname} is an integer"
            else
              echo "${varname} is not an integer"
            fi
            

            ## 贪婪地从 "varname" 返回的值中删除正则表达式,因此如果 var 是整数则为 true,否则为 false。

            它具有与最佳答案相同的弱点(使用“$foo != [!0-9]”),如果 $varname 为空,则返回 true。我不知道这是否有效。如果不只是将测试更改为:

            if [ -n "$varname" ] && [ -z "${varname##[0-9]}" ]
            

            【讨论】:

            • (刚刚注意到上面的一个错误,它说 1a1 是一个整数:P ... 1 秒)
            • 我想不通写“一个或多个模式xxx”的“文件名扩展”方式。所以当我写 [0-9]* 它匹配一个整数后跟任何字符,所以“1a1”,“1a”或“1blah”都匹配......通过链接到它的常见问题解答中的测试可以完成为:if [[ "$varname" == +([0-9]) ]] 但 '[[' 不是标准 BASH,必须使用“正确的”正则表达式扩展而不是文件扩展。有人知道如何使我的解决方案起作用吗? :P
            • ghostdog74 的解决方案给了我答案。添加shopt -s extglob 我猜可以启用所需的模式语法:)
            【解决方案7】:

            您可以执行 *2 /2 运算来检查值是否为数字和整数。 如果不是数字,则该操作返回 0

            echo "Try with 10"
            
            var=10
            var1=`echo $((($var*2)/2))`
            
            if [ "$var" == "$var1" ]; then
              echo '$var integer'
            else
              echo '$var not integer'
            fi
            
            echo "Try with string"
            
            var=string
            var1=`echo $((($var*2)/2))`
            
            if [ "$var" == "$var1" ]; then
              echo '$var integer'
            else
              echo '$var not integer'
            fi
            

            【讨论】:

            猜你喜欢
            • 2012-06-09
            • 2019-01-03
            • 2018-09-01
            • 1970-01-01
            • 2022-01-25
            • 2013-01-10
            • 2011-08-05
            • 1970-01-01
            • 2013-10-14
            相关资源
            最近更新 更多