A matriz a seguir representa o número de discos em cada máquina Linux
Cada array único inclui o número de discos em uma máquina Linux .
echo ${ARRAY_DISK_Quantity[*]}
4 4 4 4 2 4 4 4
qual é a maneira simples de identificar que todos os valores da matriz são iguais?
bom estado:
4 4 4 4 4 4 4 4
Estado ruim:
4 4 4 4 4 4 2 4
Estado ruim:
6 6 6 6 6 6 6 6 6 6 2 6 2
bash
+ GNUsort
+grep
solução GNU: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, canalizada para a classificação GNU (baseando-se nas opções
-z
aka--zero-terminated
e-u
aka--unique
) e depoisgrep
(usando as 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 requer linhas de entrada terminadas com uma nova linha ... e usarsed
outr
para converter NULs em novas linhas após anularsort
o propósito de usar separadores NUL.grep -c
faz um substituto razoável.Aqui está a mesma coisa reescrita como uma função:
Com
zsh
:Onde
(u)
está um sinalizador de expansão de parâmetro para expandir valores exclusivos . Portanto, estamos obtendo uma contagem dos valores únicos na matriz.Substitua
== 1
por<= 1
se você deseja considerar que uma matriz vazia está OK.Com
ksh93
, você pode classificar o array e verificar se o primeiro elemento é igual ao último:Com ksh88 ou pdksh/mksh:
Com
bash
, você provavelmente precisaria de um loop:(funcionaria com todos os shells do tipo Bourne com suporte a array (ksh, zsh, bash, yash)).
Observe que ele retorna OK para uma matriz vazia. Adicione um
[ "$#" -gt 0 ] || return
no início da função se você não quiser isso.bash
+awk
solução:Caso de teste nº 1:
Caso de teste nº 2:
Eu tenho outra solução somente bash que também deve funcionar com strings:
Demonstração:
Com bash e GNU grep:
bash apenas solução (assumindo que
a
éARRAY_DISK_Quantity
)Aqui está o POSIX Awk:
Use um loop for para comparar cada elemento do array com o próximo. Termine o loop uma iteração a menos que o comprimento da matriz para evitar comparar o último elemento com nada no final.