Bash: вставить переменное содержимое в подстановку команд в качестве аргументов — как правильно цитировать?

Я действительно не нахожу решения этой проблемы: скажем, у меня есть переменная с несколькими строками, каждая строка должна быть одним аргументом в конце.

line   1
line two
...

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

answer="$(dialog --menu 'Menu title' 0 0 0 'line   1' - 'line two' - ... 3>&1 1>&2 2>&3)"

(Данные должны быть разделены - но это не проблема.)

Я думаю, что я действительно пробовал все возможные комбинации, но это не сработает. Я уже проверил этот сайт, но >думаю‹, он не предлагает решения моей проблемы: http://mywiki.wooledge.org/BashFAQ/050

Должен ли я попытаться переключить разделение слов?

Это мой код на данный момент:

list=""
while read p; do
    list="$list '$p' - "
done <<< $line_separated_input

answer="$(dialog --menu 'Chosse sth' 0 0 0 $list 3>&1 1>&2 2>&3)"

Использование массива также не сработало (как предлагается здесь в (5): https://superuser.com/a/360986. ) :( Как остановить разбиение слов внутри цитируемого материала, даже если этот цитируемый материал вставлен из-за подстановки переменных?

Редактировать: спасибо всем, цитирование $line_separated_input было частью решения. Использование его вместе со списком массивов вместо переменной, наконец, решило мою проблему. Вы можете проверить сами, наличие дополнительной подстановки команд усложняет задачу:

> list="'a  a'   'b    c'"; echo "$(echo $list)"
'a a' 'b c'
> list="'a  a'   'b    c'"; echo "$(echo "$list")"
'a  a'   'b    c'

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

> list=('a  a'   'b    c'); echo "$(echo "${list[@]}")"
a  a b    c

Тадаа! Спасибо всем :)


person flix    schedule 28.12.2016    source источник
comment
Подойдет ли вам tr '\n' '-' <<<"$line_separated_input"?   -  person mustaccio    schedule 28.12.2016
comment
Просто используйте кавычки!!! ... done <<< "$line_separated_input" с кавычками!!!   -  person gniourf_gniourf    schedule 28.12.2016


Ответы (1)


Как прокомментировал gniourf_gniourf, вам, вероятно, просто нужно заключить вашу переменную в двойные кавычки, например ... done <<< "$line_separated_input". Аргумент, заключенный в двойные кавычки, представляет собой одно слово, даже если оно содержит пробельные разделители, таким образом, он предотвращает word splitting, что может привести к непредвиденным последствиям.

Чтобы лучше проиллюстрировать, см. следующие примеры:

var="/tmp/my directory"
mkdir -p "$var"

Вывод: каталог /tmp/my directory создан

Теперь без двойных кавычек:

var="/tmp/my directory"
mkdir -p $var

Вывод: каталог /tmp/my создан

person Jamil Said    schedule 28.12.2016
comment
Это было не полное решение, см. мое редактирование. Но спасибо! :-) - person flix; 29.12.2016