检查shell中是否每个参数都是整数

时间:2018-05-21 22:52:28

标签: shell unix integer arguments sh

我一直在努力解决这个问题,但我知道这可能非常简单,所以希望一副新眼睛可以提供帮助。我有一个Bourne shell(sh)脚本,我正在写它,它需要一个整数列表作为输入(从1整数的数量,理想情况下,我想采取正负的整数)。如果有人输入的不是整数,我正试图对这种情况进行错误检查。他们可以输入“1 2 3 4 5 a”并且它会给出错误,因为a不是int。

我有一个错误检查,没有输入有效,而且我的代码会对整数列表本身进行处理,但即使给出了字符串,它仍会进入我的最终代码块。

我目前有一个for循环遍历整数列表中的每个项目,然后是一个if循环,如果有问题的参数不是int,则给出错误消息。我已经尝试了几个不同的版本,但这是最新版本,所以我把它放在下面。

for i in $@; do 
    if [ $i -ge 0 ] 2>/dev/null; then
        echo "Invalid input: integers only."
        exit 1
    fi 
done

3 个答案:

答案 0 :(得分:1)

#!/bin/sh
#

for i in "$@"
do 
    case "${i#[-+]}" in 
        0) 
            echo cannot be 0?
            exit 1
            ;; 
        *[!0-9]* | '')
            echo not int
            exit 2
            ;; 
    esac
done

echo i\'m ok

这对于正面和负面的整数都应该有用。如果你承认0是一个整数,只需删除第一个案例。

几乎重复:BASH: Test whether string is valid as an integer? 对于posix来说,这是一个很好的答案。 https://stackoverflow.com/a/18620446/7714132

答案 1 :(得分:0)

您可以使用正则表达式:

<强> my_script.sh

for i in $@ ; do 
    if ! [[ "$i" =~ ^-?[0-9]+$ ]] ; then
        echo "Invalid input: integers only."
        exit 1
    fi
done

示例:

$ sh my_script.sh 1 2 3 4
$ sh my_script.sh 1 2 -12
$ sh my_script.sh 1 2 -12-2
Not a number!
$ sh my_script.sh 1 2 a b
Not a number!

正则表达式的解释:

  • ^:字符串的开头
  • -?:字符-
  • 的0或1倍
  • [0-9]+:1位或更多位
  • $:字符串
  • 的结尾

答案 2 :(得分:0)

在POSIX sh中,您可以使用case将字符串与glob匹配:

#!/bin/sh
for i
do
  case "$i" in
    *[!0-9]*)
      echo "Integers only" >&2
      exit 1
  esac
done
echo "Ok"

以下是它的运行方式:

$ ./myscript 1 2 3 4 5
Ok

$ ./myscript 1 2 3 4 5 a
Integers only

您的方法的问题主要在于您检查是否成功而不是失败:当输入无效时,[将失败。