A seguinte matriz representou o número de discos em cada máquina Linux
Cada matriz única 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 se todos os valores da matriz são iguais?
Bom status:
4 4 4 4 4 4 4 4
Status ruim:
4 4 4 4 4 4 2 4
Status ruim:
6 6 6 6 6 6 6 6 6 6 2 6 2
bash
shell-script
awk
array
yael
fonte
fonte
Respostas:
bash
Solução + GNUsort
+ GNUgrep
:Explicação em inglês: se a classificação exclusiva dos elementos da matriz resultar em apenas um elemento, imprima "ok". Caso contrário, imprima "incorreto".
A matriz é impresso com NUL bytes separando cada elemento, canalizada para GNU tipo (baseando-se no
-z
aka--zero-terminated
e-u
aka--unique
opções), e, em seguida, emgrep
(utilizando as opções-z
aka--null-data
e-c
aka--count
) para contar as linhas de saída.Diferente da minha versão anterior, não posso usar
wc
aqui porque requer linhas de entrada terminadas com uma nova linha ... e usarsed
outr
converter NULs em novas linhas depois que issosort
anularia o propósito de usar separadores NUL.grep -c
faz um substituto razoável.Aqui está a mesma coisa reescrita como uma função:
fonte
sort -u
não retorna elementos exclusivos, mas um de cada conjunto de elementos que são iguais. Por exemplo, ele diria "ok" emARRAY_DISK_Quantity=(① ②)
um sistema GNU onde as localidades geralmente decidem que esses 2 caracteres têm a mesma classificação. Você desejaLC_ALL=C sort -u
a exclusividade de byte a byte.Com
zsh
:Onde
(u)
é um sinalizador de expansão de parâmetro para expandir valores exclusivos . Portanto, estamos obtendo uma contagem dos valores exclusivos na matriz.Substitua
== 1
por<= 1
se você deseja considerar que uma matriz vazia está OK.Com
ksh93
, você pode classificar a matriz e verificar se o primeiro elemento é o mesmo que o último:Com ksh88 ou pdksh / mksh:
Com
bash
, você provavelmente precisará de um loop:(funcionaria com todos os shells semelhantes a 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.fonte
bash
?typeset
DizObsolete. See `help declare'.
: existe um motivo para você usá-lo em vez delocal
oudeclare
?typeset
é o que funciona em todas as 4 conchas. É também o original do ksh no início dos anos 80 (o bash copia o ksh88 principalmente quando se trata de definição e declaração de tipo de escopo variável, mas decidiu renomeartypeset
declare
e criartypeset
um alias para declarar).bash
+awk
solução:Caso de teste nº 1:
Caso de teste nº 2:
fonte
Eu tenho outra solução somente bash que deve funcionar com seqüências de caracteres também:
Demonstração:
fonte
Com bash e GNU grep:
fonte
Aqui está o POSIX Awk:
fonte
solução somente bash (assumindo que
a
éARRAY_DISK_Quantity
)fonte
if [ "$ttt" -ne "$i" ]; then res=1; break; fi;
Use um loop for para comparar cada elemento da matriz com o próximo. Finalize o loop uma iteração menor que o comprimento da matriz para evitar a comparação do último elemento com nada no final.
fonte