2013-05-26 64 views
3

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

因此,例如:

% addprogram 2 5 7 
The total is 14 

我已经尝试了所有的,我好像无法在网络上找到什么,请保持答案很简单。

我试过的东西,如:

#!/bin/bash 

total += [email protected] 

但我不认为运营商在bash存在。

我的算法是这样的:

  1. 对于从命令行传递的参数,
  2. 的第一个参数添加到总,
  3. 移动到下一个参数,并添加到总,
  4. 重复只要有争论
  5. 总产量
+2

写的StackOverflow问题并不像你粘贴在你的功课,根本没读什么(“似乎无法找到任何” ==“谷歌没在前5次结果中不会给我一个脚本“),并不是那么微不足道,以至于不了解这一点会严重阻碍你接下来的任务。你是不是被一个压迫性的极权主义技术专家带走了这个课程? – msw

回答

4

POSIX兼容的版本:

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

备注默认for迭代[email protected]

2

是这样的吗?

for n in [email protected] 
do 
    let sum=$sum+$n 
done 
echo The total is $sum 
+0

谢谢你完美的作品!我错过了'让'在我有... – classA

0

按照您提供的步骤,shiftexpr

sum=0 
while [ -n "$1" ]; do 
    sum=`expr $sum + $1` 
    shift 
done 
echo $sum 
+0

感谢你也是,这一个也是一个魅力!我看到了'expr',但我不确定如何使用它。哪一个答案是最正确的? – classA

+0

@classA所有这些看起来都是正确的,当你可以选择最适合你的解决方案时,你处于一个非常舒适的状态:) –

0

我会做这样的:

total=0 

for i in [email protected]; do 
    ((total+=i)) 
done 

echo "The total is $total" 
+0

谢谢你这个作品完美!哪一个更正确?上面这个还是这个呢? – classA

+0

AFAICS迄今为止提供的所有解决方案都是正确的,因此您应该选择一个您最熟悉的解决方案并[接受该答案](http://meta.stackexchange.com/a/5235)。 –

1

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

echo [email protected] | tr ' ' '\n' | awk '{sum+=$0}END{print sum}' 

而一个纯bash的版本可以去像:

echo [email protected] | tr ' ' '\n' | (sum=0; while read; do sum=$((sum+REPLY)); done; echo $sum) 
6

因为没有人这么做过

IFS=+ 
bc<<<"$*" 

使用bc让你高贵;当数字很大时,shell内置算法会失败。

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

IFS<<<只是使其缩短的技巧。更可以理解的版本将是

echo $* | sed 's/ /+/g' | bc 
+0

这是很酷的黑客解决方案。 +1。请记住恢复IFS,或者在'('subshel​​l')'中运行它。 –