Следующий массив представляет количество дисков на каждой машине Linux
Каждый отдельный массив содержит количество дисков на компьютере с Linux .
echo ${ARRAY_DISK_Quantity[*]}
4 4 4 4 2 4 4 4
Какой простой способ определить, что все значения массива равны?
Хороший статус:
4 4 4 4 4 4 4 4
Плохой статус:
4 4 4 4 4 4 2 4
Плохой статус:
6 6 6 6 6 6 6 6 6 6 2 6 2
bash
shell-script
awk
array
Яэль
источник
источник
Ответы:
bash
+ GNUsort
+ GNUgrep
решение:Английское объяснение: если уникальная сортировка элементов массива приводит только к одному элементу, выведите «ok». В противном случае выведите «bad».
Массив печатается с байтами NUL, отделяющими каждый элемент, передается в сортировку GNU (полагаясь на параметры
-z
aka--zero-terminated
и-u
aka--unique
), а затем вgrep
(используя параметры-z
aka--null-data
и-c
aka--count
) для подсчета выходных строк.В отличие от моей предыдущей версии, я не могу использовать
wc
здесь, потому что для этого требуются строки ввода, заканчивающиеся символом новой строки ... и использующиеsed
илиtr
для преобразования NUL в новые строки после того, какsort
они потерпят поражение от использования разделителей NUL.grep -c
делает разумную замену.Вот то же самое, переписанное как функция:
источник
sort -u
не возвращает уникальные элементы, но один из каждого набора элементов, которые сортируются одинаково. Например, было бы сказано «хорошо»ARRAY_DISK_Quantity=(① ②)
в системах GNU, где локали обычно решают, что эти 2 символа сортируются одинаково. Вы хотели быLC_ALL=C sort -u
для байтовой уникальности.С
zsh
:Где
(u)
флаг расширения параметра для расширения уникальных значений. Таким образом, мы получаем количество уникальных значений в массиве.Замените
== 1
на<= 1
, если вы хотите считать пустой массив в порядке.С помощью
ksh93
вы можете отсортировать массив и проверить, что первый элемент совпадает с последним:С помощью ksh88 или pdksh / mksh:
С
bash
, вероятно, вам понадобится цикл:(будет работать со всеми подобными Борну оболочками с поддержкой массивов (ksh, zsh, bash, yash)).
Обратите внимание, что он возвращает ОК для пустого массива. Добавьте
[ "$#" -gt 0 ] || return
в начале функции, если вы этого не хотите.источник
bash
?typeset
указаноObsolete. See `help declare'.
, почему вы используете ее вместоlocal
илиdeclare
?typeset
работает во всех 4 оболочках. Он также был оригинальным от ksh в начале 80-х (bash в основном копировал ksh88, когда дело доходит до установки и объявления типа переменной области видимости, но решил переименоватьtypeset
declare
и сделатьtypeset
псевдоним для объявления).bash
+awk
решение:Тестовый пример № 1:
Тестовый пример № 2:
источник
У меня есть другое решение только для bash, которое должно работать и со строками:
Демонстрация:
источник
С bash и GNU grep:
источник
Вот POSIX Awk:
источник
решение только для bash (если
a
естьARRAY_DISK_Quantity
)источник
if [ "$ttt" -ne "$i" ]; then res=1; break; fi;
Используйте цикл for для сравнения каждого элемента массива со следующим. Завершите цикл на одну итерацию меньше длины массива, чтобы избежать сравнения последнего элемента ни с чем в конце.
источник