需要帮助这个bash / shell练习

时间:2017-11-25 01:39:37

标签: linux bash shell

#!/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我真的不知道事情是怎么回事......

2 个答案:

答案 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