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
bash
+ GNUsort
+ 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 排序(依賴
-z
aka--zero-terminated
和-u
aka--unique
選項),然後進入grep
(使用選項-z
aka--null-data
和-c
aka--count
)以計算輸出行數。與我以前的版本不同,我不能
wc
在這裡使用,因為它需要以換行符結尾的輸入行……並且在使用sed
ortr
之後將 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