У меня есть два массива:
arrayA=(1 2 3)
arrayB=(a b c)
и я хочу распечатать один из них, используя аргумент командной строки, т. е. без такового if else
.
Я попробовал несколько вариантов синтаксиса, но безуспешно. Я хочу сделать что-то вроде этого:
ARG="$1"
echo ${array${ARG}[@]}
но я получаю ошибку "плохая замена". Как мне этого добиться?
Ответы:
Попробуйте сделать это:
НОТА
man bash
(расширение параметра):источник
!
делает передvar
переменной? Как это работает, казалось, это замена истории на поиск в Google, но я не мог понять, как это работает здесь.Хотя вы можете использовать косвенный доступ, как указано в другом ответе , другим способом (в ksh и Bash 4.3 и новее) будет использование namerefs. Особенно в случае массивов это может быть более полезным, так как вы можете индексировать массив через nameref и не нужно помещать индекс в переменную, используемую в качестве ссылки.
Это не работает через косвенный доступ:
Как мог бы сказать программист C,
${!q[1]}
здесь он действует так, как если бы онq
был массивом указателей, а не указателем на массив.источник
примечание: избегайте кавычек в случае пробела !
источник
Это заняло много проб и ошибок, но в итоге сработало.
Я черпал вдохновение у Юнесса. Но все остальные ответы не помогли на моем старом bash (suse11sp1 [3.2.51 (1) -release])
Цикл 'for' отказывался расширять косвенный массив, вместо этого вам нужно предварительно развернуть его, используйте его для создания другого массива с вашим новым именем переменной. Мой пример ниже показывает двойной цикл, так как это мое предназначение.
Я использую #, чтобы удалить «New_» из первой записи массива, а затем объединить с «вещи», чтобы получить «FOOthings». \ $ {} с помощью echo и eval, затем делайте свое дело по порядку, не выбрасывая ошибок, который оборачивается в новый $ () и присваивается имя новой переменной.
ОБНОВЛЕНИЕ ##### 2018/06/07Я недавно обнаружил еще одно вращение по этому вопросу. Созданная переменная на самом деле является не массивом, а строкой, разделенной пробелом. Для вышеприведенной задачи это было нормально, так как «for» работает, он не читает массив, он расширяется, а затем проходит цикл, см. Ниже выдержку:
Но тогда мне нужно было использовать его как массив. Для этого мне нужно было сделать еще один шаг. Я взял дословный код Денниса Уильямсона . Я проверил это, и он отлично работает.
"IFS = ','" - это переменная, содержащая ваш разделитель. «read» с «-a» обрезает и возвращает строчку обратно в переменную массива. Обратите внимание, что это не относится к кавычкам, но есть несколько опций для чтения , например, я удалил флаг -r, который мне не нужен. Таким образом, я теперь объединил это дополнение в создании переменной, которая позволяет обрабатывать и обрабатывать данные, как следует.
источник
Так вы бы создали переменную с динамическим именем (версия bash <4.3).
Ниже приведена группа функций, которые могут использоваться для управления динамически именованными массивами (версия bash <4.3).
Ниже приведена группа функций, которые можно использовать для управления динамически именованными массивами (версия bash> = 4.3).
Для получения более подробной информации об этих примерах посетите раздел «Получение от динамических массивов» Людвика Джерабека.
источник
ни за что :(
если ваши массивы настолько просты, то используйте ассоциативные массивы
к сожалению, если ваши массивы более сложные (например
array=( "a b" c )
), это не сработает. Затем вам нужно подумать о другом способе достижения своей цели.источник
использование
eval
источник