2016-09-28 84 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