bash if for循环中的结构

时间:2016-12-02 14:20:04

标签: bash

我正在尝试创建一个退出错误,以便现在扩展上一个脚本。如果我现在输入任何数字而不是数字,到目前为止我尝试的是:

sum=0
for num in "$@"
do
echo $num | grep -i [^0-9+-]
if ["$?" = 1] then
echo "Sorry, '$num' is not a number"
fi

sum=$((sum + num))  
done
echo $sum

如果我输入

的示例
add 1 2 3 four five

它会说

four
Sorry, 'four' is not a number   

1 个答案:

答案 0 :(得分:1)

代码的以下部分:

echo $num | grep -i [^0-9+-]
if ["$?" = 1] then

应改为:

if grep -q '[^0-9+-]' <<< "$num"; then

在测试([)中,空格很重要,但无论如何都不需要在这里使用它。使用-q表示grep不生成输出 - 退出状态表示是否找到匹配项,因此可以直接与if一起使用。

如评论中所述,匹配有效整数的模式可以更加健壮。检测整数的一些好方法显示在this related question中。例如,您可以将grep模式更改为以下内容:

grep -qE '^[+-]?(0|[1-9][0-9]*)$'

或使用原生正则表达式,如该问题最受欢迎的答案:

re='^[+-]?(0|[1-9][0-9]*)$'
if [[ $num =~ $re ]]; then
    sum=$((sum + num))
else
    echo "Sorry, '$num' is not a number"
fi

即使这种模式也不完美,因为对于以0为首的数字,它会失败。