Poniższa tablica reprezentuje liczbę dysków na każdym komputerze z systemem Linux
Każda pojedyncza tablica zawiera liczbę dysków na komputerze z systemem Linux .
echo ${ARRAY_DISK_Quantity[*]}
4 4 4 4 2 4 4 4
jaki jest prosty sposób stwierdzenia, że wszystkie wartości tablic są równe?
Dobry status:
4 4 4 4 4 4 4 4
Zły status:
4 4 4 4 4 4 2 4
Zły status:
6 6 6 6 6 6 6 6 6 6 2 6 2
bash
shell-script
awk
array
Yael
źródło
źródło
Odpowiedzi:
bash
+ GNUsort
+grep
rozwiązanie GNU :Wyjaśnienie w języku angielskim: jeśli unikalne sortowanie elementów tablicy daje tylko jeden element, to wypisz „ok”. W przeciwnym razie wydrukuj „zły”.
Tablica jest drukowana z bajtami NUL oddzielającymi każdy element, przesyłana potokiem do sortowania GNU (zależnie od opcji
-z
aka--zero-terminated
i-u
aka--unique
), a następnie dogrep
(przy użyciu opcji-z
aka--null-data
i-c
aka--count
) w celu zliczenia linii wyjściowych.W przeciwieństwie do mojej poprzedniej wersji, nie mogę jej
wc
tutaj użyć , ponieważ wymaga ona linii wejściowych zakończonych znakiem nowej linii ... i użyciased
lubtr
konwersji NUL na znaki nowej linii posort
pokonaniu celu użycia separatorów NUL.grep -c
stanowi rozsądny substytut.Oto ta sama rzecz przepisana jako funkcja:
źródło
sort -u
nie zwraca unikalnych elementów, ale jeden z każdego zestawu elementów, który sortuje to samo. Na przykład powiedziałby „ok” wARRAY_DISK_Quantity=(① ②)
systemach GNU, w których ustawienia regionalne zazwyczaj decydują o tym, że te 2 znaki sortują się tak samo. ChciałbyśLC_ALL=C sort -u
wyjątkowości bajt po bajcie.Z
zsh
:Gdzie
(u)
jest flaga rozwinięcia parametru, aby rozwinąć unikalne wartości. Otrzymujemy więc liczbę unikalnych wartości w tablicy.Wymień
== 1
się<= 1
to warto rozważyć pusta tablica jest OK.Za pomocą
ksh93
możesz posortować tablicę i sprawdzić, czy pierwszy element jest taki sam jak ostatni:Z ksh88 lub pdksh / mksh:
Z
bash
prawdopodobnie potrzebujesz pętli:(działałby ze wszystkimi powłokami podobnymi do Bourne'a z obsługą tablicy (ksh, zsh, bash, yash)).
Zauważ, że zwraca OK dla pustej tablicy. Dodaj
[ "$#" -gt 0 ] || return
na początku funkcji, jeśli nie chcesz tego.źródło
bash
?typeset
mówiObsolete. See `help declare'.
Czy istnieje powód używasz go zamiastlocal
lubdeclare
?typeset
to ten, który działa we wszystkich 4 powłokach. Jest to również oryginalna wersja ksh z początku lat 80. (bash kopiował głównie ksh88, jeśli chodzi o ustawienie i deklarowanie typu zmiennej zasięgu, ale postanowił zmienić nazwętypeset
declare
i utworzyćtypeset
alias do zadeklarowania).bash
+awk
rozwiązanie:Przypadek testowy nr 1:
Przypadek testowy nr 2:
źródło
Mam inne rozwiązanie typu bash, które również powinno działać z ciągami:
Demonstracja:
źródło
Z bash i GNU grep:
źródło
Oto POSIX Awk:
źródło
rozwiązanie tylko bash (zakładając, że
a
jestARRAY_DISK_Quantity
)źródło
if [ "$ttt" -ne "$i" ]; then res=1; break; fi;
Użyj pętli for, aby porównać każdy element tablicy z następnym. Zakończ pętlę o jedną iterację mniej niż długość tablicy, aby uniknąć porównywania ostatniego elementu z niczym na końcu.
źródło