コマンドからのユーザー入力によって定義された配列の要素を追加しようとしていますread -a
。どうやってやるの?
9 に答える
read -a array
tot=0
for i in ${array[@]}; do
let tot+=$i
done
echo "Total: $tot"
(整数の)配列が与えられた場合、その要素を(bashで)追加する面白い方法は次のとおりです。
sum=$(IFS=+; echo "$((${array[*]}))")
echo "Sum=$sum"
例えば、
$ array=( 1337 -13 -666 -208 -408 )
$ sum=$(IFS=+; echo "$((${array[*]}))")
$ echo "$sum"
42
プロ:ループもサブシェルもありません!
短所:整数でのみ機能します
編集(2012/12/26)。
この投稿がぶつかったので、私はあなたと別の面白い方法を共有したいと思いましたdc
。それは整数だけに制限されていません。
$ dc <<< '[+]sa[z2!>az2!>b]sb1 2 3 4 5 6 6 5 4 3 2 1lbxp'
42
この素晴らしいラインはすべての数字を追加します。きちんとした、え?
あなたの番号が配列にある場合array
:
$ array=( 1 2 3 4 5 6 6 5 4 3 2 1 )
$ dc <<< '[+]sa[z2!>az2!>b]sb'"${array[*]}lbxp"
42
実際、負の数の問題があります。番号「-42」は、dc
として指定する必要があります_42
。したがって、次のようになります。
$ array=( -1.75 -2.75 -3.75 -4.75 -5.75 -6.75 -7.75 -8.75 )
$ dc <<< '[+]sa[z2!>az2!>b]sb'"${array[*]//-/_}lbxp"
-42.00
しましょう。
Pro:フローティングポイントで動作します。
短所:外部プロセスを使用します(ただし、非整数演算を実行する場合は選択できませんがdc
、このタスクではおそらく最も軽量です)。
私のコード(私が実際に利用している)はgniourf_gniourfの答えに触発されています。私は個人的に、これを読んだり理解したり、修正したりするのがより明確だと考えています。整数だけでなく、浮動小数点も受け入れます。
配列内の合計値:
arr=( 1 2 3 4 5 6 7 8 9 10 )
IFS='+' sum=$(echo "scale=1;${arr[*]}"|bc)
echo $sum # 55
小さな変化で、値の平均を取得できます。
arr=( 1 2 3 4 5 6 7 8 9 10 )
IFS='+' avg=$(echo "scale=1;(${arr[*]})/${#arr[@]}"|bc)
echo $avg # 5.5
私は簡潔さが好きなので、よく使うのは次のようなものです。
IFS="+";bc<<<"${array[*]}"
基本的に、配列のデータをリストし、それを評価する BC に渡します。「IFS」は内部フィールドのセパレートであり、本質的に配列を分割する方法を指定し、プラス記号で区切るように言いました。つまり、BC に渡すと、プラス記号で区切られた数字のリストを受け取るので、自然にそれらを一緒に追加します。
増加する変数を使用すると、これは非常に簡単です。
result2=0
for i in ${lineCoffset[@]};
do
result2=$((result2+i))
done
echo $result2