(тут нуби здесь)

В bash мне удалось создать массив с таблицами базы данных, а затем прокрутить их. Я хочу объявить этот массив в верхней части моего скрипта, а затем назначить его другой переменной.

my_databases=(value1 value2 value3)

Циклический просмотр отлично работает с for i in "${my_databases[@]}"

Проблема здесь: Вместо того, чтобы перебирать my_databases, у меня есть промежуточный шаг, и я хочу присвоить массив переменной new_array.

new_array=$my_databases

Теперь, когда я перебираю этот new_array, сценарий терпит неудачу после первого значения массива. Как я могу правильно присвоить объявленный массив новой переменной?

0
Freddy 30 Сен 2019 в 22:05

2 ответа

Лучший ответ

Чтобы создать новую переменную массива, присвойте значения старого массива новому массиву следующим образом:

my_databases=(value1 value2 value3)
new_array=("${my_databases[@]}")

Если вы используете

new_array=$my_databases

Новая переменная не будет массивом (если вы не используете declare -a new_array=$my_databases), а $my_databases расширяется только до первого значения массива.

3
Freddy 30 Сен 2019 в 21:10
Bash обрабатывает это new_array=$my_databases следующим образом: new_array=${my_databases[0]}
 – 
glenn jackman
30 Сен 2019 в 20:39
Спасибо. Я также играл с другим комментарием, чтобы посмотреть, что произойдет. Работает отлично!
 – 
Daniel
30 Сен 2019 в 21:24
1
При отладке может помочь отображение атрибутов и значений переменных с declare -p name […], например declare -p my_databases new_array.
 – 
Freddy
30 Сен 2019 в 21:29

Я предполагаю, что вы хотите создать копию массива. Затем используйте ответ @Freddy.

Если вы хотите создать ссылку на те же данные, в последних версиях bash есть "namerefs":

$ my_databases=(value1 value2 value3)
$ declare -n new_array=my_databases

Затем:

$ for i in "${!new_array[@]}"; do printf "%d\t%s\n" $i "${new_array[i]}"; done
0   value1
1   value2
2   value3

Но если вы измените первый массив, изменения будут видны в «новом»:

$ my_databases[2]="updated value 3"
$ for i in "${!new_array[@]}"; do printf "%d\t%s\n" $i "${new_array[i]}"; done
0   value1
1   value2
2   updated value 3
3
glenn jackman 30 Сен 2019 в 20:42
Спасибо. Мне это нравится. Хорошо подходит для манипулирования массивом. Спасибо, что поделились шапкой.
 – 
Daniel
30 Сен 2019 в 21:27