linux - 我的 bash 脚本有问题

标签 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 十二九,它会输出:

Sorry, 'twelve' is not a number

但是我的输出

4
1
Sorry, 'twelve' is not a number
Sorry, 'nine' is not a number

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

最佳答案

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

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

    echo "$sum"

fi

done

为此:

fi

done

echo "$sum"

my assignment requires echo $number | grep -q "[^a-z]" >> /dev/null as it wants me to redirect the output to /dev/null, […]

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


编辑添加:好的,那么您如何检测到有效号码?这非常棘手。

您可以自己决定有效数字应该是什么样子,然后制作 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 是否识别该数字,以及它是否同意以正常方式输入该数字:

[[ "$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

关于linux - 我的 bash 脚本有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27197727/

相关文章:

c - 防止 make 删除从 .def 文件生成的源文件

linux - 使用 xmllint 格式化 apache2 虚拟主机conf

mysql - for 循环中的逻辑与运算符

linux - bash find 命令没有给出我期望的输出

用于递归查找字符串的正则表达式?

bash - 查看安装脚本是否在 mac 或 linux 机器上运行

linux - Eclipse 工作区作为项目的系统根引用

linux - 同步shell脚本执行

java - 是否有可能始终将 -Djava.library.path 从 POM 文件内部传递给 Maven 测试?

linux - 在shell脚本中,for循环中的 'if-else'是如何执行的?为什么它只为一个变量打印一次?