Чи є спосіб зробити щось на зразок PHP $array[] = 'foo';
в bash vs doing:
array[0]='foo'
array[1]='bar'
Чи є спосіб зробити щось на зразок PHP $array[] = 'foo';
в bash vs doing:
array[0]='foo'
array[1]='bar'
Відповіді:
Так, є:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
У контексті, коли оператор призначення присвоює значення змінній оболонки або індексу масиву (див. Масиви), оператор '+ =' може використовуватися для додавання або додавання до попереднього значення змінної.
ARRAY
це лише заповнювач місця для фактичного імені змінної. Навіть якщо ваші індекси масиву не є послідовними, додавання з +=
просто призначить найвищий індекс + 1.
${myarray[@]}
- посилання на змінну масиву, як якщо б вона була скалярною - це те саме, що доступ до її елемента 0; іншими словами: $myarray
те саме, що ${myarray[0]}
.
Як зазначає Німий Гай , важливо відзначити, чи починається масив з нуля і є послідовним. Оскільки ви можете виконувати призначення та скасовувати непомітні індекси, ${#array[@]}
це не завжди наступний елемент у кінці масиву.
$ array=(a b c d e f g h)
$ array[42]="i"
$ unset array[2]
$ unset array[3]
$ declare -p array # dump the array so we can see what it contains
declare -a array='([0]="a" [1]="b" [4]="e" [5]="f" [6]="g" [7]="h" [42]="i")'
$ echo ${#array[@]}
7
$ echo ${array[${#array[@]}]}
h
Ось як отримати останній індекс:
$ end=(${!array[@]}) # put all the indices in an array
$ end=${end[@]: -1} # get the last one
$ echo $end
42
Це ілюструє, як отримати останній елемент масиву. Ви часто бачите таке:
$ echo ${array[${#array[@]} - 1]}
g
Як бачите, оскільки ми маємо справу з розрідженим масивом, це не останній елемент. Це працює як на розріджених, так і на суміжних масивах, хоча:
$ echo ${array[@]: -1}
i
${array[@]: start[:count]}
Повертає кількість ліків. або, якщо не вказано, всі залишки . починаючи з наступного елема .: - Якщо почати> = 0: з елема. індекс якого = = початок. - Якщо почати <0: з елем. індекс якого (останній індекс масиву + 1) - abs (старт); CAVEAT: якщо abs (start)> (індекс останнього масиву + 1) повертається нульовий рядок. Якщо вказано підрахунок, повертається стільки елементів, навіть якщо їх індекси не є суміжними з самого початку.
${array[-1]}
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
arr=("${arr[@]}" "new")
якщо у вас є елементи з пробілами в них
Якщо ваш масив завжди є послідовним і починається з 0, ви можете зробити це:
array[${#array[@]}]='foo'
# gets the length of the array
${#array_name[@]}
Якщо ви ненавмисно використовуєте пробіли між знаком рівності:
array[${#array[@]}] = 'foo'
Тоді ви отримаєте помилку, схожу на:
array_name[3]: command not found
+=
синтаксис (див. Відповідь @ e-t172) є (а) простішим, і (b) також працює з масивами, які не є суміжними та / або не починаються з 0.
+=
додано, наприклад, версія 2
$arr += ($el)
здавалося, розділити рядок на пробіл і додати кожен із елементів.
За допомогою індексованого масиву ви можете щось подібне:
declare -a a=()
a+=('foo' 'bar')