2016-09-28 82 views
0

所以我正在学习bash,需要做一个简单的脚本来通过调用一个函数来使数组元素相乘。乘以数组元素

我的代码到目前为止是这样,但它根本不工作。我相信有一个比这更简单的方法(递增pos变量,以移动到下一个数组元素感觉简直是错误的)。

array=(1 2 3 4 5 100) 
sum=0 
pos=1 


function multiplicate { 
     for i in ${array[*]};do 
       sum=$(($i * $array[pos])) 
       let pos++ 
     done 
} 

multiplicate 

echo $sum 

我尽我所能去谷歌的解决方案,但未能找到任何相关信息,我发现如何使用BC来概括,但它根本不会用*更换+工作。

+0

你只是每次都更换'sum',你不会将新值与前一个值相结合。 – Barmar

+0

为什么你没有投票答复任何你以前的任何问题,也没有选择任何答案。这被认为是无礼的。 – sorontar

+0

Alejo,你现在有5个问题在这个网站上,没有人被绿色复选标记接受。这就是我们如何在这里滚动。请参阅[如何接受答案工作?](http://meta.stackexchange。com/questions/5234) – Drew

回答

2

使用该脚本:

#!/bin/bash 
array=(1 2 3 4 5 100) 

function multiplicate { 
    local mul=1 
    for i in "${array[@]}"; do 
     ((mul *= i)) 
    done 
    echo "$mul" 
} 

multiplicate 


$ ./script 
12000 

或者更好的是:

#!/bin/bash 

multiplicate() { 
    local mul=1 
    for i 
    do  ((mul *= i)) 
    done 
    echo "$mul" 
} 

multiplicate 1 2 3 4 5 100 

如果你喜欢玩与字符串变量使用:

multiplicate() { local IFS=* ; echo $(($*)); } 

multiplicate 1 2 3 4 5 100 
+0

非常感谢!出于某种原因,我倾向于过度复杂的事情,看到你的代码现在变得更容易了! – Alejo

+0

@Ajojo请接受它,如果它解决了你的问题。 [当有人回答我的问题时,我该怎么办?](https://stackoverflow.com/help/someone-answers) – sorontar

+0

感谢您的帮助。加上uno。 – Drew

3

下面是一个使用方法bc

multiply() 
{ 
    printf '%s\n' "[email protected]" | paste -s -d '*' | bc 
} 

使用如下:

$ multiply 1 2 3 4 5 100 
12000 

在流水线打印第一个命令在单独的行的每个数组元素:

$ printf '%s\n' 1 2 3 4 5 100 
1 
2 
3 
4 
5 
100 

paste -s(“串行”),然后转动输出转换成单行再次,但现在分隔的元素*

$ printf '%s\n' 1 2 3 4 5 100 | paste -s -d '*' 
1*2*3*4*5*100 

bc最终评估表达式。

可替代地,我们可以节省一个子shell并跳过bc

multiply() { 
    echo $(($(printf '%s\n' "[email protected]" | paste -s -d '*'))) 
} 

这使用的算术表达式来评估printfpaste的输出(这是现在在一个命令替换),但可读性遭受位。

替代地,在纯击(帽尖sorontar):

multiply() { 
    local IFS='*' 
    echo "$(($*))" 
} 

这将设置字段分隔符IFS*这样的论据,$*,扩展到由*分开的字符串,然后在评价算术表达式$(())

+1

无需调用粘贴(对外部实用程序的缓慢调用),只需将主程序函数定义为:multiply(){local IFS = *; echo“$(($ *))”; }' – sorontar

+0

@sorontar啊,整洁!我会补充一点。 –

+0

谢谢你帮助他。加上uno。 – Drew