Das folgende Array repräsentiert die Anzahl der Festplatten auf jedem Linux-Computer
Jedes einzelne Array enthält die Anzahl der Festplatten auf einem Linux-Computer .
echo ${ARRAY_DISK_Quantity[*]}
4 4 4 4 2 4 4 4
Wie lässt sich auf einfache Weise feststellen, dass alle Array-Werte gleich sind?
Guter Zustand:
4 4 4 4 4 4 4 4
Schlechter Status:
4 4 4 4 4 4 2 4
Schlechter Status:
6 6 6 6 6 6 6 6 6 6 2 6 2
bash
shell-script
awk
array
yael
quelle
quelle
Antworten:
bash
+ GNUsort
+ GNU-grep
Lösung:Englische Erklärung: Wenn die eindeutige Sortierung der Elemente des Arrays nur zu einem Element führt, geben Sie "ok" aus. Andernfalls drucken Sie "schlecht".
Das Array wird gedruckt mit NUL - Bytes jedes Element trennt, verrohrt Aussortieren in GNU ( die sich auf dem
-z
aka--zero-terminated
und-u
aka--unique
Optionen) und dann ingrep
(unter Verwendung von Optionen-z
aka--null-data
und-c
aka--count
) , um die Ausgangsleitungen zu zählen.Im Gegensatz zu meiner vorherigen Version kann ich diese
wc
Option nicht verwenden , da Eingabezeilen mit einem Zeilenumbruch abgeschlossen werden müssen ... und die Verwendung vonsed
odertr
zur Konvertierung von NULs in Zeilenumbrüche, nachdemsort
dies den Zweck der Verwendung von NUL-Trennzeichen zunichte machen würde.grep -c
macht einen vernünftigen Ersatz.Hier ist dasselbe, was als Funktion umgeschrieben wurde:
quelle
sort -u
keine eindeutigen Elemente zurückgegeben werden, sondern nur eines von jedem Satz von Elementen, die gleich sortiert sind. Zum Beispiel würde esARRAY_DISK_Quantity=(① ②)
auf einem GNU-System "ok" sagen , wo die Gebietsschemata normalerweise entscheiden, dass diese 2 Zeichen gleich sortiert werden. Sie möchtenLC_ALL=C sort -u
eine Byte-zu-Byte-Eindeutigkeit.Mit
zsh
:Wo
(u)
befindet sich ein Parametererweiterungsflag zum Erweitern eindeutiger Werte? Wir erhalten also eine Zählung der eindeutigen Werte im Array.Ersetzen
== 1
durch<= 1
, wenn Sie davon ausgehen möchten, dass ein leeres Array in Ordnung ist.Mit
ksh93
können Sie das Array sortieren und prüfen, ob das erste Element mit dem letzten übereinstimmt:Mit ksh88 oder pdksh / mksh:
Mit
bash
bräuchten Sie wahrscheinlich eine Schleife:(würde mit allen Bourne-ähnlichen Shells mit Array-Unterstützung (ksh, zsh, bash, yash) funktionieren).
Beachten Sie, dass es für ein leeres Array OK zurückgibt. Fügen Sie
[ "$#" -gt 0 ] || return
am Anfang der Funktion ein hinzu, wenn Sie das nicht möchten.quelle
bash
?typeset
:Obsolete. See `help declare'.
Gibt es einen Grund, warum Sie es anstelle vonlocal
oder verwendendeclare
?typeset
funktioniert in allen 4 Shells. Es ist auch das Original von ksh in den frühen 80ern (bash kopierte meistens ksh88, wenn es um das Setzen und Deklarieren von Typen mit variablem Gültigkeitsbereich ging, entschied sich aber, umzubenennentypeset
declare
undtypeset
einen Alias für die Deklaration zu erstellen).bash
+awk
Lösung:Testfall 1:
Testfall 2:
quelle
Ich habe noch eine einzige Bash-Lösung, die auch mit Strings funktionieren sollte:
Demonstration:
quelle
Mit bash und GNU grep:
quelle
Hier ist POSIX Awk:
quelle
bash only solution (vorausgesetzt
a
istARRAY_DISK_Quantity
)quelle
if [ "$ttt" -ne "$i" ]; then res=1; break; fi;
Verwenden Sie eine for-Schleife, um jedes Array-Element mit dem nächsten zu vergleichen. Beenden Sie die Schleife um eine Iteration weniger als die Länge des Arrays, um zu vermeiden, dass das letzte Element am Ende mit nichts verglichen wird.
quelle