
ユーザーが入力した数の数を加算して計算する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
この
if [ read = null ]
行は完全にナンセンスです。これはまったく意味がありません。固定数の変数ではなく配列で数字を読み取ることができるように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
。
の要素数がnumbers
0の場合、whileループを終了しますbreak
。ちなみに、"${#numbers[@]}"
配列内の要素の数、つまり必要な「単語数」を返します。必要に応じてecho
それを使用または印刷できます。printf
私はあなたのためにすべての宿題をしてくれるわけではないので、あなたに任せます。
入力要素が数値でない場合は、「無効な入力」を印刷してwhileループの先頭に戻ります(この時点でスクリプトがループとループの内側にあるため、continue 2
引数が必要です。そうでない場合はループを終了します。) 「無効な入力」を印刷してから計算を実行しようとします。)2
while
for
2
for
それ以外の場合は、文字列(という変数に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
。
答え2
シェルは、特にbash
算術演算を独自に実行するのには適していません。それに加えて、ユーザーが提供した入力に対して算術演算を実行することは通常、次のように構成されます。任意コマンド実行の脆弱性。
しかし、彼らがうまくやっているのは、コマンドを実行するために使用されるものだからです。
#! /bin/sh -
awk 'BEGIN {printf "Enter numbers, space separated: "}
{
sum = 0
for (i = 1; i <= NF; i++) sum += $i
print "Sum of those "NF" numbers: "sum
exit
}'
ここではシェル(ここではsh
必要ありませんので使用されますbash
)が呼び出され、awk
入力行を処理し、各フィールドの値を追加します。awk
整数および浮動小数点数をサポートし、前にゼロの数字が8進数として扱われるのに問題はなく、bash
シェル算術ACEの脆弱性はありません。
文字列を数字でデコードしようとするときに最善を尽くし、認識できない場合は停止します(1e4foo
例:aka)。1e4
10000
whatever
0
1可能ですが、読む入力が端末から出ない場合は、2つ以上になります。