Bashで入力を追加して計算する

Bashで入力を追加して計算する

ユーザーが入力した数の数を加算して計算するbashスクリプトを作成するには?ユーザーが無制限に入力できるので、変数を処理する方法がわかりません。ユーザーが何も入力していない場合は、エラーメッセージが表示されます。これはこれまでのコードです。間違っているかもしれませんのでご安心ください。私はまだ初心者です。

#!/bin/bash
if [ read = null ]
  echo "Invalid input."
else
  echo "please input numbers to add"
  #add numbers inputted
  read num1 num2 num3 num4 num5 num6 num7 
  #i put 7 variables but it needs to add however many numbers the user puts
  TOTAL=$((num1+num2+num3+num4+num5+num6+num7))
  #count how many numbers are inputted
  read num1 num2 num3 num4 num5 num6 num7
  wordCount=$((num1+num2+num3+num4+num5+num6+num7 | wc -c))
  echo "Your total is $TOTAL and the number of inputs you entered is $wordCount"\
fi

ベストアンサー1

  1. このif [ read = null ]行は完全にナンセンスです。これはまったく意味がありません。

  2. 固定数の変数ではなく配列で数字を読み取ることができるようにbashを使用しています。

次のようにしてみてください。

$ cat add.sh
#!/bin/bash

while true; do
  printf "Please input numbers to add: "
  read -r -a numbers

  # exit if input is empty
  [ "${#numbers[@]}" == 0 ] && break

  # check if input consists only of numbers
  # (integers or decimals allowed)
  for n in "${numbers[@]}"; do
    if ! [[ "$n" =~ ^[0-9]+(\.[0-9]+)?$ ]] ; then
      echo "Invalid input: $n"
      continue 2
    fi
  done

  expression="$(printf "%s+" "${numbers[@]}" | sed -e 's/+$//')"
  echo "$expression" | bc
done

ループは永久に繰り返し(while true)入力を要求し、入力を配列に読み込みますnumbers

の要素数がnumbers0の場合、whileループを終了しますbreak。ちなみに、"${#numbers[@]}"配列内の要素の数、つまり必要な「単語数」を返します。必要に応じてechoそれを使用または印刷できます。printf私はあなたのためにすべての宿題をしてくれるわけではないので、あなたに任せます。

入力要素が数値でない場合は、「無効な入力」を印刷してwhileループの先頭に戻ります(この時点でスクリプトがループとループの内側にあるため、continue 2引数が必要です。そうでない場合はループを終了します。) 「無効な入力」を印刷してから計算を実行しようとします。)2whilefor2for

それ以外の場合は、文字列(という変数にexpression)を生成しますprintf。文字列の末尾から末尾の文字を削除するsedために使用されます。+

次に、式を次にパイプします。紀元前、電卓ツールです。 Bashに組み込まれた純粋整数演算とは異なり、bc浮動小数点数を処理できます。 bcデフォルトではシステムにインストールされていない可能性がありますが、Linuxを実行している場合はパッケージとして使用できます(たとえば、Debianではpackageにありますbc)。これはPOSIX仕様の一部であるため、他のUNIXバリアントでも機能する必要があります。https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html

$ ./add.sh 
Please input numbers to add: 1 2 3
6
Please input numbers to add: 1 2 3 xyz
Invalid input: xyz
Please input numbers to add: 4 5 6 7 8 9
39
Please input numbers to add: 

この例では、最初の入力行が式に変換され、パイプを介して計算が1+2+3実行bcされます。 3番目の入力行はに変換されパイプさ4+5+6+7+8+9れますbc

おすすめ記事