我正在尝试创建一个退出错误,以便现在扩展上一个脚本。如果我现在输入任何数字而不是数字,到目前为止我尝试的是:
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
答案 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
为首的数字,它会失败。