Если у меня есть массив с 5 элементами, например:
[a][b][c][d][e]
Используя echo ${myarray[4]}
я могу видеть, что он держит.
Но что, если я не знаю количество элементов в данном массиве? Есть ли способ прочитать последний элемент массива неизвестной длины? т.е. первое чтение элемента справа налево для любого массива?
Я хотел бы знать, как это сделать в Bash.
$@
не совсем массив (не может быть подписан). Для этого см. Получение последнего аргумента, переданного скрипту оболочки .Ответы:
Вы можете просто использовать отрицательный индекс,
${myarray[-1]}
чтобы получить последний элемент. Вы можете сделать то же самое для второго по счету и т. Д .; в Баш:То же самое также работает для назначения. Когда он говорит «выражение», это действительно означает выражение; вы можете написать любое арифметическое выражение для вычисления индекса, включая то, которое вычисляет с использованием длины массива в
${#myarray[@]}
явном виде.источник
ksh
иzsh
также.zsh
хотя, по умолчанию массивы 1 индексированные, в отличиеbash
иksh
где они находятся 0 индексированные.Modern Bash (v4.1 или лучше)
Вы можете прочитать последний элемент по индексу
-1
:Поддержка доступа к численно индексированным массивам с конца с использованием отрицательных индексов началась с bash версии 4.1-alpha .
Старая версия (версия 4.0 или более ранняя)
Вы должны получить длину массива
${#a[@]}
и затем вычесть единицу, чтобы получить последний элемент:Поскольку bash рассматривает индексы массива как арифметическое выражение, нет необходимости в дополнительных обозначениях, таких как
$((...))
форсирование арифметической оценки.источник
modern
на версию.bash
присваивание массива, ссылка, сброс с отрицательным индексом были добавлены только в bash 4.3 . С более старой версиейbash
, вы можете использовать выражение в индексеarray[${#array[@]-1}]
Другой способ также работает со старой версией
bash
(bash 3.0 или выше):или же:
Используя отрицательное смещение, необходимо отделить
:
с ,-
чтобы избежать путать с:-
расширением.источник
"${a[@]: -1}"
и это будет работать (помимоbash
иzsh
) также вksh
.zsh
илиbash
; но я проверил это во всех трех оболочках.)массив
Самые старые альтернативы в bash (начиная с bash 3.0+):
Пробел необходим, чтобы избежать интерпретации с
:
последующим минусом-
как расширением"${var:-abc}"
(Использовать значения по умолчанию).Это
~
арифметическое побитовое отрицание (эквивалентное дополнению или переворачиванию всех битов ). От человека Баш:Начиная с Баш-4.2 + также:
Начиная с bash 5.0+ также:
Для всех версий bash (более старая версия bash):
@
Для позиционных аргументов (начиная с bash 2.01):
Переносимым решением для всех оболочек является использование eval:
источник
~
в руководстве и не видел его.$@
?bash: ${@[@]:(-1)}: bad substitution
man bash
ссылка (проверьте расширенный ответ в @ заголовке). @ TomHale@
Это не массив (ну, не полностью массив ) в Баш и не принимает индекс ([]
) индекс для отдельных аргументов. Вы должны использовать${@:(-1)}
или эквивалентный. Проверьте расширенную запись в@
заголовке. @ TomHaleТакже вы можете сделать это:
Результат:
То, что вы делаете, это получает все количество элементов в массиве и вычитаете -1, потому что вы получаете все элементы, не начиная с индекса массива, который равен 0.
источник