bashで配列要素がすべて同じかどうかをテストする方法は?

bashで配列要素がすべて同じかどうかをテストする方法は?

以下の配列は、各Linuxシステムのディスク数を示します。

単一アレイディスクの番号を含めるLinuxマシン

echo ${ARRAY_DISK_Quantity[*]}
4 4 4 4 2 4 4 4

すべての配列値が同じであることを確認する簡単な方法は何ですか?

良い状態で:

4 4 4 4 4 4 4 4

悪い気分:

4 4 4 4 4 4 2 4

悪い気分:

6 6 6 6 6 6 6 6 6 6 2 6 2

ベストアンサー1

bash+GNU sort+GNUgrepソリューション:

if [ "${#array[@]}" -gt 0 ] && [ $(printf "%s\000" "${array[@]}" | 
       LC_ALL=C sort -z -u |
       grep -z -c .) -eq 1 ] ; then
  echo ok
else
  echo bad
fi

英語の説明:配列要素を一意に並べ替えると、要素が1つだけ生成された場合は「ok」を印刷します。それ以外の場合は「bad」を印刷します。

配列は各要素を区切るNULバイトで印刷され、GNUソート(-zaka--zero-terminated-uaka--uniqueオプションによって異なります)でパイプされ、次にパイプ(akaとakagrepオプションを使用)で接続され、出力行数を計算します。-z--null-data-c--count

wc以前のバージョンとは異なり、入力行は改行で終わる必要があるため、ここでは使用できません。そして、NULを改行で使用または変換すると、sedNUL区切り文字を使用する目的が無効になります。合理的に置き換えてください。trsortgrep -c


以下は、関数で書き換えたのと同じ内容です。

function count_unique() {
  local LC_ALL=C

  if [ "$#" -eq 0 ] ; then 
    echo 0
  else
    echo "$(printf "%s\000" "$@" |
              sort --zero-terminated --unique |
              grep --null-data --count .)"
  fi
}



ARRAY_DISK_Quantity=(4 4 4 4 2 4 4 4)

if [ "$(count_unique "${ARRAY_DISK_Quantity[@]}")" -eq 1 ] ; then
  echo "ok"
else
  echo "bad"
fi

おすすめ記事