linuxbashshell

How to add an unknown amount of numbers from user input in Linux shell script


I'm trying to add up all numbers inputted by a user, however there is no limit on how many numbers a user can input for the addition. How do I code this in linux shell script?

I have this so far:

firstNumber=0
secondNumber=0
number=0


echo Please enter two numbers to add up

read firstNumber
read secondNumber

echo Would you like to keep adding numbers? YES OR NO
read answer

if answer = YES
then
echo Please add another number
read number
echo $(($firstNumber +$secondNumber + $number))
fi

while answer = NO
do
echo $(($firstNumber + $secondNumber))
done

Solution

  • as @dash-o recommended, a simple entry sequence ended with ENTER is the most simple approach:

    #!/usr/bin/env sh
    
    sum=0
    
    echo "Please enter integer numbers to add, or just RETURN to end."
    
    while read -r number && [ -n "$number" ]; do
      if [ "$number" -eq "$number" ] 2>/dev/null; then
        sum=$((sum + number))
        echo "Sum is: $sum"
      else
        echo "$number is not a valid integer. Try again..." >&2
      fi
    done
    

    Or to allow multiple integers entry per line:

    #!/usr/bin/env sh
    
    # Save the shell's options state
    shelloptions="$(set +o)"
    # Disable globbing to prevent filename expansion in parameters
    set -o noglob
    
    sum=0
    
    echo "Please enter integer numbers to add, or RETURN to end."
    
    # Read lines until empty REPLY
    while read -r && [ -n "$REPLY" ]; do
    
      # Split $REPLY as parameters
      # Globbing is turned-off so filenames will not mess with entries
      # shellcheck disable=SC2086 # Explicitly intended word splitting
      set -- $REPLY
    
      # Iterate numbers from the parameters array
      for number in "$@"; do
    
        # If $number is a valid integer
        if [ "$number" -eq "$number" ] 2>/dev/null; then
          sum=$((sum + number))
        else
          echo "$number is not a valid integer." >&2
        fi
      done
      echo "Sum is: $sum"
    done
    
    # Restore the shell's options state
    eval "$shelloptions"