1

我一直在尝试找出一种方法来使用命令 expr 来测试参数是否为数字。

到目前为止,在我的脚本中,我写过:

expr $1 + 1 2>/dev/null
if [ $? -eq 2 -o $1 -lt 0 ]
then
    echo "$1 is not a positive integer" >&2
    exit 1
fi

我在这里要做的是将 1 添加到变量中。如果这引发错误(这意味着变量不是数字),结果将被发送到 /dev/null。之后,我测试返回码是否为 2 或变量是否小于 0。但这似乎不起作用......有什么想法吗?

PS请记住,我必须使用expr

4

2 回答 2

0

无论 的值是什么,都会评估您的条件$1,这意味着如果$1不是数字,shell 将抛出语法错误。

我首先检查是否expr失败(不要预先假设错误代码,只测试非零)。如果是这样,我设置错误标志。然后,如果未设置错误标志,我知道这是一个数字,然后我检查是否为正(错误标志可防止$1使用非整数进行评估。

不确定这是最好的方法,但有效:

error=0

expr $1 + 1 2>/dev/null >/dev/null 

if [ $? -ne 0 ] ; then
  error=1
fi
if [ $error -eq 0 ] ; then
  if [ $1 -lt 0 ] ; then
     error=1
  fi
fi

if [ $error -eq 1 ] ; then
    echo "$1 is not a positive integer" >&2
    exit 1
fi

测试:

$ exprtest.sh foo
foo is not a positive integer

$ exprtest.sh 4

$ exprtest.sh -5
-5 is not a positive integer

注意:0通过了测试,尽管有些人可能会反对它不是严格的整数。

于 2016-10-10T13:43:16.070 回答
0

你也可以试试这个;

#!/bin/bash
expr $1 + 1 2>/dev/null >/dev/null 
if [ $? -eq 2 ] || [ $1 -lt 0 ]
then
    echo "$1 is not a positive integer" >&2
    exit 1
fi

例如:

user@host:/tmp/test$ ./test.sh foo
foo is not a positive integer

user@host:/tmp/test$ ./test.sh 4

user@host:/tmp/test$ ./test.sh -5
-5 is not a positive integer
于 2016-10-10T13:54:42.307 回答