сценарий оболочки для динамического создания команды оболочки - PullRequest
0 голосов
/ 12 января 2019

Как генерировать приведенную ниже команду динамически для n чисел элементов? Я не хочу использовать любую другую переменную или массив.

command mycommand /path/location ${arg[1]}="${value[1]}" ${arg[2]}="${value[2]}" ...

1 Ответ

0 голосов
/ 12 января 2019

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

command mycommand /path/location $(for ((i=0; i<"${#value[@]}"; i++)) do printf "%s=%s " "${arg[$i]}" "${value[$i]}"; done)

Как я и обещал в комментариях, это будет работать, даже если в значениях есть пробелы.

Здесь я создаю аргументы динамически и разделяю аргументы на нулевые символы (\ 0).

Я отправляю их по электронной почте xargs. xargs - это своего рода анализатор аргументов и, вероятно, лучший выбор для этой работы.

Таким образом, вместо того, чтобы позволить bash передавать аргумент (который передает их, разбивая их на пустое пространство), мы позволяем xargs передавать аргумент и иметь полный контроль над тем, как они разбиваются.

В этом случае я выбираю разделение на нулевые символы (путем установки -0), чтобы все остальные символы (пробелы или даже разрывы строк) не мешали передаче аргументов.

for ((i=0; i<"${#value[@]}"; i++)) do printf "%s=%s\0" "${arg[$i]}" "${value[$i]}"; done | 
xargs -0 command mycommand /path/location 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...