bash
+ GNU sort
+ GNU grep
solução:
if [ "${#array[@]}" -gt 0 ] && [ $(printf "%sfunction count_unique() {
local LC_ALL=C
if [ "$#" -eq 0 ] ; then
echo 0
else
echo "$(printf "%sif [ "${#array[@]}" -gt 0 ] && [ $(printf "%sfunction count_unique() {
local LC_ALL=C
if [ "$#" -eq 0 ] ; then
echo 0
else
echo "$(printf "%s%pre%0" "$@" |
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
0" "${array[@]}" |
LC_ALL=C sort -z -u |
grep -z -c .) -eq 1 ] ; then
echo ok
else
echo bad
fi
0" "$@" |
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
0" "${array[@]}" |
LC_ALL=C sort -z -u |
grep -z -c .) -eq 1 ] ; then
echo ok
else
echo bad
fi
Explicação em inglês: se a classificação única dos elementos da matriz resultar em apenas um elemento, imprima "ok". Caso contrário, imprima "ruim".
A matriz é impressa com bytes NUL separando cada elemento, inseridos na classificação GNU (contando com as opções -z
aka --zero-terminated
e -u
aka --unique
) e, em seguida, em grep
(usando opções -z
aka --null-data
e -c
aka --count
) para contar as linhas de saída.
Ao contrário da minha versão anterior, não posso usar wc
aqui porque ela exige linhas de entrada terminadas com uma nova linha ... e usar sed
ou tr
para converter NULs em novas linhas depois que sort
for derrotar o propósito de usar separadores NUL. grep -c
faz um substituto razoável.
Aqui está a mesma coisa reescrita como uma função:
%pre%