Bashシェルスクリプトで数値配列の合計値を算出する
はじめに
Bash シェルスクリプトでは type
または declare
コマンドを利用することで配列変数を宣言できます。
この「配列変数」の合計値を算出する簡単な方法は無いか考えたことを公開します。
検証環境
$ uname -moi
x86_64 x86_64 GNU/Linux
$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
方法 1 - ループする方法
$ declare -a NUMS=(
1 2 3 4 5
)
$ SUM=0
$ for N in ${NUMS[@]}; do
((SUM+=N))
done
$ echo $SUM
15
実行結果は 15 となります。
方法 2 - awk
を使う
合計、件数、平均といった計算に汎用的に利用できます。
declare -a NUMS=(
1 2 3 4 5
)
$ echo "${NUMS[@]}" | awk '{ for (i=1; i<=NF; i++) { sum+=$i } } END { print sum }'
15
列単位のループが嫌な場合には、 awk
のデフォルトの行区切り文字 RS = "\n"
をスペースに変更します。
$ echo "${NUMS[@]}" | awk 'BEGIN { RS = " " } { sum+=$1 } END { print sum }'
15
方法 3 - 変数参照時に一工夫する方法
変数参照時に一工夫して合計値の算出する方法もあります。
$ declare -a NUMS=(
1 2 3 4 5
)
# 配列の各要素の後ろに "+" を付与する
$ echo "${NUMS[*]/%/+}"
1+ 2+ 3+ 4+ 5+
# 先の出力結果の後方に "0" を付与する
$ echo "${NUMS[*]/%/+}0"
1+ 2+ 3+ 4+ 5+0
# 先の出力結果を数式として処理する
$ echo $((${NUMS[@]/%/+}0))
15
実行結果はループする方法同様 15 となります。
出力内容が 3 つありますが、最終的に必要なのは以下の 1 コマンドのみです。
$ echo $((${NUMS[@]/%/+}0))
15
ひとこと
ワンライナーで実現できますが、可読性は高くないのが難点です。
ディスカッション
コメント一覧
まだ、コメントがありません