#!/bin/bash
read x
if expr $x+1 1> /dev/null 2>&1
then
echo "$x is a number"
else
echo "$x is not a number"
fi
这一行的输出if expr $x+1 1> /dev/null 2>&1
我真的不知道事情是怎么回事......
答案 0 :(得分:0)
像这样修改你的脚本(简单地在+周围添加空格):
#!/bin/bash
read x
if expr $x + 1 1>/dev/null 2>&1
then
echo "$x is a number"
else
echo "$x is not a number"
fi
expr尝试将1添加到变量的值。如果状态为0(值为$?)则为数字。否则,有一个错误,所以它返回1(值$?)。
如果删除输出的重定向(1>/dev/null 2>&1
),您将看到expr e + 1
输出 expr:非整数参数。
答案 1 :(得分:0)
有许多非数字输入不会导致您的方法出错。例如
$ x="3 - 2"
$ expr $x + 1
2
引用可以提供帮助:
$ expr "$x" + 1
expr: not a decimal number: '3 - 2'
但你仍然可以欺骗expr
:
$ x=999999999999999999999999999
$ expr "$x" + 1
expr: operand too large: '999999999999999999999999999'
更好的方法是使用expr
的正则表达式匹配:
# A number might be defined as a string of numerical digits,
# optionally preceded by a minus sign.
if expr "$x" : '-\{0,1\}[[:digit:]]\{1,\}'; then
bash
内置了更简单的正则表达式匹配。
if [[ $x =~ -?[[:digit:]]+ ]]; then