我的bash脚本有问题

时间:2014-11-29 00:47:13

标签: linux bash shell

#!/bin/bash
sum=0
for number in $@
do

echo $number | grep -q "[^a-z]" >> /dev/null

if [ $? != 0 ]
then
     echo "Sorry, '$number' is not a number"

else

    sum=$((sum + number))
    echo "$sum"

fi

done

我的作业要求如果我输入add2 4 -3 12 9,则会输出

  

22

但我的产出:

  

4 1 3 22

如果我输入add2 4 -3 twelve nine,它会输出:

  

对不起,'十二'不是数字

但是我的输出

  

4
  1
  对不起,'十二'不是数字
  对不起,'九'不是数字

我的作业需要echo $number | grep -q "[^a-z]" >> /dev/null,因为它希望我将输出重定向到/dev/null,我不知道我做错了什么。

1 个答案:

答案 0 :(得分:0)

问题是您在处理的每个号码后打印$sum,而您的分配是仅在最后一个号码后打印它。因此,您需要在循环后移动echo "$sum"部分(打印$sum)。

换句话说,你需要改变这个:

    echo "$sum"

fi

done

到此:

fi

done

echo "$sum"

  

我的作业需要echo $ number | grep -q" [^ a-z]" >> / dev / null因为它希望我将输出重定向到/ dev / null,[...]

这有点多余。 grep -q不会将任何内容打印到标准输出,因此没有理由重定向其标准输出。 (无论如何,这不是检测有效数字的好方法。如果这个方法甚至包含一个不是小写字母的字符,这种方法会接受$number作为有效数字。例如,它会接受ab%AB作为有效数字。)


编辑添加: O.K.,那么 如何检测到有效数字?这非常棘手。

可以通过自己决定有效数字应该是什么样子,然后制作grep - 用这种形式检测数字的命令或类似物来做到这一点;例如,您可以写下以下任何内容:

  
      
  • grep -q $'^-[1-9][0-9]*$\n^0$\n^[1-9][0-9]*$ <<< "$number"
  •   
  • grep -q '^-[1-9][0-9]*$' <<< "$number" \ || grep -q '^[1-9][0-9]*$' <<< "$number" \ || grep -q '^0$' <<< "$number"
  •   
  • [[ "$number" = 0 ]] || [[ "$number" =~ ^-?[1-9][0-9]*$ ]]
  •   

但是我认为通过询问Bash是否识别该号码以及是否同意该号码是以正常方式输入的方式,#34; cheat&#34;会更好:

[[ "$number." = "$(printf %d "$number" 2>/dev/null && echo .)" ]]

顺便提一下,请注意,使用这些方法中的任何一种,都没有理由明确地检查$?if的重点是运行命令并检查其退出状态。这种形式的任何Bash片段:

foo
if [ $? != 0 ]
then
    bar
else
    baz
fi

也可以用这种形式写成:

if ! foo ; then
    bar
else
    baz
fi