bash - 如何使用 expr 测试脚本中的参数是否为数字?

标签 bash testing numbers integer expr

我一直在尝试找出一种使用命令 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。 然而,这似乎不起作用......有什么想法吗?

附言请记住,我必须使用 expr

最佳答案

无论 $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 通过了测试,尽管有些人可能反对它不是严格的 整数。

关于bash - 如何使用 expr 测试脚本中的参数是否为数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39959518/

相关文章:

testing - 认证测试运行异常

PHP 格式将数千个分组到未分组

swift - 如何以特定方式从 Swift 中的字符串中提取数字

macos - 查看加载了哪些 Bash 配置文件脚本

linux - 使用带有数字后缀但没有开始为零的输出文件拆分文件

ruby-on-rails - 如何使用 RSpec/RoR 测试 AJAX 请求?

java - 我正在尝试为插入时间表的方法编写一个 JUnit 测试用例,该时间表将参数作为员工 ID。我应该如何尝试?

c - 高级数字模式

linux - Jenkins - 在中止主构建之前运行子构建

Bash:在系统上放置可配置负载的简单方法?