【问题标题】:How can I check whether an argument passed to a shell script is NOT an integer?如何检查传递给 shell 脚本的参数是否不是整数?
【发布时间】:2013-03-22 15:20:11
【问题描述】:

我知道如何使用以下方法检查参数是否为整数:

if [[ $2 = *[[:digit:]]* ]]; then
    # $2 is a number
else
    # $2 is not a number
fi

但是,我需要检查参数是否不是一个整数。我该怎么做?

【问题讨论】:

    标签: bash shell unix scripting arguments


    【解决方案1】:

    你知道很容易。你可以这样做:

       if echo $Myvar | egrep -q '^[0-9]+$'; then
          # $Myvar is a number
       else
          # $Myvar is not a number
       fi
    

    这是我主要用于数字检查的东西。

    【讨论】:

      【解决方案2】:

      $2 = *[[:digit:]]* 只检查$2 是否包含一个数字。

      # is an integer
      [[ $2 =~ ^[[:digit:]]+$ ]]
      # is not an integer
      [[ ! $2 =~ ^[[:digit:]]+$ ]]
      

      【讨论】:

      • 此命令不起作用,不断收到“意外令牌附近的语法错误”错误!事实上,唯一有效的命令是我最初使用的那个。
      • @user2232423 接近意外令牌什么
      【解决方案3】:

      你的测试只检查输入是否为数字;例如 $2 is "43" 那么这将打印: 43不是数字 可以使用正则表达式修复您的解决方案以检查实际数字:

      if [[ $2 =~ ^-?[[:digit:]]+$ ]]; then
          echo "$2 is a number"
      fi
      

      检查输入是否不是数字然后只是否定测试的问题:

      if [[ ! $2 =~ ^-?[[:digit:]]+$ ]]; then
          echo "$2 is not a number"
      fi
      

      【讨论】:

        【解决方案4】:

        符合 POSIX 的方法

        一种健壮且可移植(符合 POSIX;在 dash 中测试)的方法是检查 shell 是否可以将变量解析为整数,如下面的脚本所示。

        #!/bin/sh
        
        # test-int.sh
        # A script that tests whether its first argument is an integer
        
        if [ "$1" -eq 0 -o "$1" -ne 0 ] >/dev/null 2>&1; then
            printf "integer: %s\n" "$1"
        else
            printf "not an integer\n"
        fi
        

        测试

        $ dash test-int.sh foo
        not an integer
        $ dash test-int.sh 098234
        integer: 098234
        $ dash test-int.sh 77239asdfasf
        not an integer
        $ dash test-int.sh -77239
        integer: -77239
        

        请注意,这种方法也接受开箱即用的负整数,但您可以轻松地将其修改为仅接受正整数。

        在我的脚本中,一个成功解析的整数被打印为一个字符串,但是,或者,您可能希望将它打印为一个整数,使用%d

        【讨论】:

          猜你喜欢
          • 2015-04-06
          • 2022-10-04
          • 1970-01-01
          • 2012-10-20
          • 2014-12-07
          • 1970-01-01
          • 2022-01-04
          • 2012-08-19
          • 2018-10-31
          相关资源
          最近更新 更多