一部の配列に特定のインデックスに要素があるかどうかを計算して追加します。

一部の配列に特定のインデックスに要素があるかどうかを計算して追加します。

最小限のコードで次のコードを簡単に実装できますか?

$ cluster1=(x y)
$ cluster2=(a b)
$ cluster3=(m)

$ my=$((${cluster1[0]+1}+${cluster2[0]+1}+${cluster2[0]+1}))

$ echo $my
3

$ my=$((${cluster1[1]+1}+${cluster2[1]+1}+${cluster3[1]+1}))
-bash: 1+1+: syntax error: operand expected (error token is "+")

答え1

汚れたトリックかもしれませんが、接頭辞aを追加するのはどうですか0(「代替値」は有効な8進数なので安全です)。

my=$((0${cluster1[1]+1}+0${cluster2[1]+1}+0${cluster3[1]+1}))
echo $my
2

答え2

あなたのコードは、設定されていないすべての要素に対して構文エラーを生成しています。

$ echo "${cluster1[0]+1}+${cluster2[0]+1}+${cluster2[0]+1}"
1+1+1

$ echo "${cluster1[1]+1}+${cluster2[1]+1}+${cluster3[1]+1}"
1+1+

この場合、生成された式を使用して計算を実行するよりも、コレクション要素を計算する方が良いです。

#!/bin/bash

cluster1=(x y)
cluster2=(a b)
cluster3=(m)

for (( i = 0; i < 3; ++i )); do
    is_set=( ${cluster1[i]+"1"} ${cluster2[i]+"1"} ${cluster3[i]+"1"} )
    printf 'i=%d:\t%d\n' "$i" "${#is_set[@]}"
done

これにより、indexの要素を含む各配列を含むis_set新しい配列が作成されます。気にしません。任意の文字列にすることができます。 array( ) の要素数は、そのインデックスにある配列のコレクション要素数です。1i1is_set${#is_set[@]}cluster

テスト:

$ bash script.sh
i=0:    3
i=1:    2
i=2:    0

関連情報