La siguiente matriz representa el número de discos en cada máquina Linux
Cada matriz individual incluye el número de discos en una máquina Linux .
echo ${ARRAY_DISK_Quantity[*]}
4 4 4 4 2 4 4 4
¿Cuál es la manera simple de identificar que todos los valores de la matriz son iguales?
Buen estado:
4 4 4 4 4 4 4 4
Mal estado:
4 4 4 4 4 4 2 4
Mal estado:
6 6 6 6 6 6 6 6 6 6 2 6 2
bash
shell-script
awk
array
yael
fuente
fuente
Respuestas:
bash
+ GNUsort
+grep
solución GNU :Explicación en inglés: si la clasificación única de los elementos de la matriz da como resultado un solo elemento, imprima "ok". De lo contrario, imprima "malo".
La matriz se imprime con bytes NUL que separan cada elemento, canalizados en GNU (confiando en
-z
opciones aka--zero-terminated
y-u
aka--unique
), y luego engrep
(usando las opciones-z
aka--null-data
y-c
aka--count
) para contar las líneas de salida.A diferencia de mi versión anterior, no puedo usarlo
wc
aquí porque requiere líneas de entrada terminadas con una nueva línea ... y usandosed
otr
para convertir NUL en nuevas líneas después de quesort
se anule el propósito de usar separadores NUL.grep -c
hace un sustituto razonable.Aquí está lo mismo reescrito como una función:
fuente
sort -u
no devuelve elementos únicos, sino uno de cada conjunto de elementos que clasifican lo mismo. Por ejemplo, diría "ok" enARRAY_DISK_Quantity=(① ②)
un sistema GNU donde las configuraciones regionales generalmente deciden que esos 2 caracteres se ordenan de la misma manera. Lo que quiereLC_ALL=C sort -u
para la unicidad byte a byte.Con
zsh
:Dónde
(u)
hay una bandera de expansión de parámetros para expandir valores únicos . Así que estamos obteniendo un recuento de los valores únicos en la matriz.Reemplazar
== 1
con<= 1
si desea considerar que una matriz vacía está bien.Con
ksh93
, puede ordenar la matriz y verificar que el primer elemento sea el mismo que el último:Con ksh88 o pdksh / mksh:
Con
bash
, probablemente necesites un bucle:(funcionaría con todos los shells tipo Bourne con soporte de matriz (ksh, zsh, bash, yash)).
Tenga en cuenta que devuelve OK para una matriz vacía. Agregue un
[ "$#" -gt 0 ] || return
al comienzo de la función si no quiere eso.fuente
bash
?typeset
diceObsolete. See `help declare'.
¿Hay alguna razón por la que lo estás usando en lugar delocal
odeclare
?typeset
es la que funciona en los 4 proyectiles. También es el original de ksh a principios de los años 80 (bash copió principalmente ksh88 cuando se trata de la configuración y declaración del tipo de alcance variable, pero decidió cambiar el nombretypeset
declare
y creartypeset
un alias para declarar).bash
+awk
soltion:Caso de prueba n. ° 1:
Caso de prueba # 2:
fuente
Tengo otra solución de bash only que también debería funcionar con cadenas:
Demostración:
fuente
Con bash y GNU grep:
fuente
Aquí está POSIX Awk:
fuente
bash only solution (suponiendo que
a
esARRAY_DISK_Quantity
)fuente
if [ "$ttt" -ne "$i" ]; then res=1; break; fi;
Use un bucle for para comparar cada elemento de la matriz con el siguiente. Finalice el ciclo una iteración menor que la longitud de la matriz para evitar comparar el último elemento con nada al final.
fuente