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 4Mal estado:
4 4 4 4 4 4 2 4Mal 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+grepsolució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
-zopciones aka--zero-terminatedy-uaka--unique), y luego engrep(usando las opciones-zaka--null-datay-caka--count) para contar las líneas de salida.A diferencia de mi versión anterior, no puedo usarlo
wcaquí porque requiere líneas de entrada terminadas con una nueva línea ... y usandosedotrpara convertir NUL en nuevas líneas después de quesortse anule el propósito de usar separadores NUL.grep -chace un sustituto razonable.Aquí está lo mismo reescrito como una función:
fuente
sort -uno 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 -upara 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
== 1con<= 1si 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 ] || returnal comienzo de la función si no quiere eso.fuente
bash?typesetdiceObsolete. See `help declare'.¿Hay alguna razón por la que lo estás usando en lugar delocalodeclare?typesetes 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 nombretypesetdeclarey creartypesetun alias para declarar).bash+awksoltion: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
aesARRAY_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