Bash: Как оценить эту строку? - PullRequest
0 голосов
/ 29 октября 2018

Если я напишу

echo --optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`

, он будет оценен как

--optionA hello --optionB 1 3 5 7 9 --optionC happy happy happy

Это желаемая строка , которую я мог бы в конечном итоге сохранить в новой переменной с помощью

desiredString=$(echo --optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`)

Если я начну со строки для оценки, сохраненной в строке как

string='--optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`'

, тогда как мне получить нужную строку?Вот несколько наивных попыток

$ echo $string
--optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`

$ eval "$string"
-bash: eval: --: invalid option
eval: usage: eval [arg ...]

$ echo `echo $string`
--optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`

Я использую GNU bash, версия 3.2.57 (1) -релиз (x86_64-apple-darwin15)

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Поскольку ваш ответ в порядке и вы можете принять его, давайте сделаем его лучше.

Следующее:

 string="-e string"
 eval "echo $string"

будет печатать только string без -e, поскольку -e интерпретируется как аргумент эха.

Что еще хуже, строки типа string='; rm -rf /' будут выполнять команду rm и стирать ваш жесткий диск. Лучшим и идиоматическим подходом было бы правильно избежать printf:

eval "printf '%s' \"$string\""

@ редактировать

Перечитав ваш вопрос, я думаю, вы просто ищете:

string="--optionA hello --optionB `seq 1 2 10` --optionC `printf "happy %.0s" {1..3}`"

или как обратные пометки `устарели:

string="--optionA hello --optionB $(seq 1 2 10) --optionC $(printf "happy %.0s" {1..3})"

Использование var=$(echo ....) в большинстве случаев аналогично var="...".

0 голосов
/ 29 октября 2018

Я получил это через 2 минуты после публикации вопроса ...

$ eval "echo $string"
--optionA hello --optionB 1 3 5 7 9 --optionC happy happy happy
...