2016-12-28 12 views
1

Я действительно не нахожу решение этой проблемы: Скажем, у меня есть переменная с несколькими строками, каждая строка должна быть одним аргументом в конце.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) :(Как остановить софистика внутри цитируемого материала , даже если цитируемый материал вставляется из-за подстановки переменной

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

> 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 

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

+0

Будет ли 'tr '\ n' '-' <<<" $ line_separated_input "работать для вас? – mustaccio

+2

Просто используйте цитаты !!! '... done <<<" $ line_separated_input "' *** с кавычками !!! *** –

ответ

0

Как прокомментировал 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

+0

Это не было полным решением, см. мое редактирование. Но спасибо! :-) – flix