6

编写一个 bash 脚本,添加其命令行参数并显示结果。假设命令行参数是除参数本身之外的所有整数。

例如:

% addprogram 2 5 7
The total is 14

我已经尽我所能,似乎无法在网上找到任何东西,请保持答案非常简单。

我尝试过类似的东西:

#!/bin/bash

total += $@

但我认为 bash 中不存在该运算符。

我的算法是这样的:

  1. 对于从命令行传递的参数,
  2. 将第一个参数添加到总数中,
  3. 移动到下一个参数并将其添加到总数中,
  4. 只要有论据就重复
  5. 总输出
4

6 回答 6

10

因为还没有人做过

IFS=+
bc<<<"$*"

使用bc会让你大吃一惊;当数字很大时,shell 内置算术会失败。

expr可能会也可能不会做 bignums,这取决于它是否是最近的 GNU coreutils 版本。

IFS<<<只是缩短它的技巧。一个更容易理解的版本是

echo $* | sed 's/ /+/g' | bc
于 2013-05-26T09:55:07.353 回答
9

posix 兼容版本:

for i do
    sum=$(expr $sum + $i)
done
echo $sum

请注意,默认情况下for会遍历$@.

于 2013-05-26T08:46:31.867 回答
4

像这样的东西?

for n in $@
do
  let sum=$sum+$n
done
echo The total is $sum
于 2013-05-26T08:37:45.890 回答
2

我会这样做:

total=0

for i in $@; do
  (( total+=i ))
done

echo "The total is $total"
于 2013-05-26T08:40:36.823 回答
2

我喜欢awk,所以我会这样做:

echo $@ | tr ' ' '\n' | awk '{sum+=$0}END{print sum}'

纯 bash 版本可能如下所示:

echo $@ | tr ' ' '\n' | ( sum=0; while read; do sum=$((sum+REPLY)); done; echo $sum )
于 2013-05-26T08:48:03.820 回答
0

按照您提供的步骤,使用shiftexpr

sum=0
while [ -n "$1" ]; do
    sum=`expr $sum + $1`
    shift
done
echo $sum
于 2013-05-26T08:38:54.747 回答