15

コマンドからのユーザー入力によって定義された配列の要素を追加しようとしていますread -a。どうやってやるの?

4

9 に答える 9

26
read -a array
tot=0
for i in ${array[@]}; do
  let tot+=$i
done
echo "Total: $tot"
于 2012-11-29T21:50:45.747 に答える
20

(整数の)配列が与えられた場合、その要素を(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、このタスクではおそらく最も軽量です)。

于 2012-11-29T22:01:35.427 に答える
8

私のコード(私が実際に利用している)は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
于 2015-07-27T12:42:12.977 に答える
5

私は簡潔さが好きなので、よく使うのは次のようなものです。

IFS="+";bc<<<"${array[*]}"

基本的に、配列のデータをリストし、それを評価する BC に渡します。「IFS」は内部フィールドのセパレートであり、本質的に配列を分割する方法を指定し、プラス記号で区切るように言いました。つまり、BC に渡すと、プラス記号で区切られた数字のリストを受け取るので、自然にそれらを一緒に追加します。

于 2015-11-04T19:31:07.583 に答える
0

増加する変数を使用すると、これは非常に簡単です。

result2=0
for i  in ${lineCoffset[@]};
do
    result2=$((result2+i))  
done
echo $result2
于 2017-02-21T16:01:31.610 に答える