Problemas com script para adicionar números

1

Estou tendo problemas para enviar meu script agora. Eu me pergunto se algum de vocês tem alguma idéia sobre por que não está tomando como está funcionando atualmente? Ele quer adicionar 6, 9, -4 e 7 juntos e meu script está fazendo isso .. Talvez haja maneiras de melhorá-lo? Qualquer ideia ajudaria muito.

#!/bin/bash

sum=0

for number in $1 $2 $3 $4
do
        sum=$(($1 + $2 + $3 + $4))
        echo $number

done

echo $sum
    
por pvman 23.03.2018 / 20:09

3 respostas

2

Se você quiser apenas adicionar 4 números, isso deve ser suficiente:

sum() {
  printf '%d\n' "$(( $1 + $2 + $3 + $4 ))"
}

Ou se você quiser adicionar uma quantidade arbitrária de números:

sum() {
  local number sum

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

  printf '%d\n' "$sum"
}
    
por 23.03.2018 / 20:25
1

Faça o trabalho de shell para você. E use utilitários externos quando solicitado.

#!/bin/bash
IFS=+
echo "$*" | bc
    
por 23.03.2018 / 20:35
0

Não há necessidade de fazer um loop se você souber que sempre obterá quatro inteiros na linha de comando:

#!/bin/sh

sum=$(( $1 + $2 + $3 + $4 ))
printf 'sum is %d\n' "$sum"

Alternativamente, apenas

#!/bin/sh

printf 'sum is %d\n' "$(( $1 + $2 + $3 + $4 ))"

Para suportar um número arbitrário de argumentos, você precisará fazer um loop:

#!/bin/sh

while [ "$#" -gt 0 ]; do
    sum=$(( sum + $1 ))
    shift
done

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

Este script irá iterar sobre seus argumentos de linha de comando, adicionando o primeiro à variável sum e deslocando-o da lista de argumentos da linha de comando, até que nenhum argumento seja deixado. A expansão da variável $# expandirá para o número de argumentos da linha de comando, enquanto shift removerá $1 da lista, deslocando $2 para o seu lugar (e $3 para $2 etc.). / p>

Alternativamente:

#!/bin/sh

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

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

Em vez de mudar constantemente a lista de argumentos da linha de comando, isso faz com que a lista seja desmarcada e, em vez disso, itera sobre ela, adicionando cada uma a sum .

A cabeça do loop for num do também pode ser escrita for num in "$@"; do .

    
por 05.05.2018 / 20:58