2016-09-28 2 views
0

Итак, я изучаю bash и вам нужно сделать простой скрипт для умножения элементов массива, вызвав функцию.Элементы массива Multiply

Мой код пока что это, но он не работает вообще. Я считаю, что есть намного более простой способ, чем это (приращение переменной 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 

Я сделал все возможное, чтобы Google решение, но не смог найти любую соответствующую информацию, я нашел как суммировать с помощью бв, но он просто не будет работать, заменив + с *.

+0

Вы просто заменяете 'sum' каждый раз, вы не комбинируете новое значение с предыдущим. – Barmar

+0

Почему вы не голосуете за какой-либо ответ ни в одном из ваших прошлых вопросов, а также не выбираете никакого ответа. Это считается грубым. – sorontar

+0

Alejo, у вас теперь есть 5 вопросов на этом сайте, и ни одна из них не была принята с помощью Green Check Mark. Вот как мы катаемся здесь. См. [Как работает прием ответа?] (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

@Alejo Пожалуйста, примите его, если он решит вопрос. [Что делать, если кто-то отвечает на мой вопрос?] (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 наконец оценивает выражение.

В качестве альтернативы, можно сохранить подоболочку и пропустить bc:

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

Это использует арифметическое выражение для оценки выходного сигнала printf и paste (которая в настоящее время находится в подстановки команд), но читаемость страдает немного ,

В качестве альтернативы, в чистом Bash (наконечник шляпы sorontar):

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

Это устанавливает разделитель полей IFS к *, так что аргументы, $*, расширить в строку, разделенных *, который затем оценивается в арифметическое выражение $(()).

+1

Не нужно вызывать вставку (медленный вызов внешней утилите), просто определите основную программную функцию как: 'multiply() {local IFS = *; echo "$ (($ *))"; } ' – sorontar

+0

@sorontar Ах, аккуратно! Я добавлю это. –

+0

Спасибо, что помогли ему. Плюс uno. – Drew