Как вы добавляете косвенные параметры расширения массива в BASH? - PullRequest
1 голос
/ 10 июля 2019

Я знаю, что вы можете создать косвенное расширение параметра для массива примерно так:

var1="target"
var2="arrayname"
targetarrayname=( "one" "two" "three" )
builtarrayname="${var1}${var2}[@]"
echo ${!builtarrayname} # prints "one two three"

Но я не могу понять, как добавить эту косвенную ссылку, так как якак правило, напрямую с targetarrayname+=('foo').

Я пробовал:

!builtarrayname+=('foo') # gives "Syntax error near unexpected token `'foo''"

и некоторые другие случайные попытки, которые в основном являются вариациями.

Мой предполагаемый вывод должен содержать targetarrayname, содержащий one two three foo, и сделать это путем косвенного расширения параметров.Это возможно?

1 Ответ

1 голос
/ 10 июля 2019
#!/bin/bash

var1="target"
var2="arrayname"
targetarrayname=( "one" "two" "three" )
builtarrayname="${var1}${var2}[@]"
echo ${!builtarrayname} # prints "one two three"

eval "${builtarrayname:0:-3}+=( 'foo' )"

echo ${!builtarrayname} # prints "one two three foo"

Заметьте, хотя этот eval можно считать злом: p Вы должны быть уверены, что у вас есть только санированный ввод в операторы eval, чтобы избежать возможности непреднамеренного выполнения кода.

EDIT:

:0:-3 in eval "${builtarrayname:0:-3}+=( 'foo' )" удаляет [@] из строки, содержащейся в $builtarrayname. Поскольку при присваивании массивов используется только имя переменной, нам пришлось его удалить. ( читайте больше здесь, чтобы увидеть, как работают манипуляции со строками в переменных )

и нет, я не думаю, что это может быть сделано без eval, поскольку именно так левая сторона назначения разрешается до того, как происходит назначение (см. этот хороший ответ для получения дополнительной информации о eval .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...