Bashシェルスクリプトで数値配列の合計値を算出する

2023-02-04Bash,CentOS,Linux,Ubuntu

はじめに

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

ひとこと

ワンライナーで実現できますが、可読性は高くないのが難点です。

2023-02-04Bash,CentOS,Linux,Ubuntu