Bash

如何測試bash中的數組元素是否全部相等?

  • February 21, 2019

以下數組表示每台 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

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

英文解釋:如果對數組元素進行唯一排序結果只有一個元素,則列印“ok”。否則列印“壞”。

該數組列印為 NUL 字節分隔每個元素,通過管道傳輸到 GNU 排序(依賴-zaka--zero-terminated-uaka--unique選項),然後進入grep(使用選項-zaka--null-data-caka --count)以計算輸出行數。

與我以前的版本不同,我不能wc在這裡使用,因為它需要以換行符結尾的輸入行……並且在使用sedortr之後將 NUL 轉換為換行符sort會破壞使用 NUL 分隔符的目的。 grep -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

引用自:https://unix.stackexchange.com/questions/412933