loop input string do usuário no script

0

tentando fazer uma função de adição básica que adiciona os números inseridos e gera um total. Aqui está a minha função atual:

function addition() {
    read -a arr

    for i in ${arr[@]}
    do
        str=$str'+'$i

        echo $i
    done

    echo $str
}

mas isso parece pedir uma entrada e gera o resultado acima. Eu também tentei usar:

function addition() {
    for i in ${input[@]}

mas isso gera uma string vazia. Como faço para criar uma função que receba este comando:

$ addition 4 3 13 40

na função?

    
por treyBake 04.09.2018 / 14:29

1 resposta

4

Se o seu script / função usa os números na linha de comando, você não precisa lê-los com read (que lê a partir da entrada padrão).

Em vez disso:

addition () {
    sum=0

    for number do
        sum=$(( sum + number ))
    done

    printf 'Sum is %d\n' "$sum"
}

O loop também pode ser escrito de forma mais explícita como

for number in "$@"; do
    sum=$(( sum + number ))
done

Em ambas as variações do loop, a variável number receberá o valor de cada parâmetro posicional ("argumento de linha de comando") e o corpo do loop adicionará esses valores à variável sum .

Observe que o código acima assume que todos os argumentos da linha de comando são inteiros sem verificar se eles são.

Para uma saída mais sofisticada:

addition () {
    sum=0

    for number do
        sum=$(( sum + number ))
    done

    ( IFS='+'; printf '%s = %d\n' "$*" "$sum" )
}

"$*" expandirá para uma única string consistindo nos parâmetros posicionais concatenados com o primeiro caractere de $IFS como delimitador.

Teste:

$ addition 1 2 3 90 32
1+2+3+90+32 = 128
    
por 04.09.2018 / 14:38