Как мне прочитать пользовательский ввод и переслать его в другое приложение в bash, сохранив кавычки? - PullRequest
1 голос
/ 15 марта 2012

Я пытаюсь передать чтение пользовательского ввода bash с помощью команды read во внешнее приложение, как если бы пользователь написал аргументы в bash.

В следующем примере я использовал функцию, а не внешнее приложение, но не должно иметь значения . Это скрипт, который я использую:

foo() { while [ "$#" -gt 0 ]; do echo "$1"; shift; done }
read -p "Write something: " bar
foo "${bar}"
foo ${bar}

Что я пишу, когда меня просят что-то написать:

"a b" "c d" e\ f g\"h

То, что я ожидаю увидеть как вывод:

a b
c d
e f
g"h

Что я на самом деле вижу: (первая строка - это первый вызов foo(), остальные строки - от второго вызова)

"a b" "c d" e f g"h
"a
b"
"c
d"
e
f
g"h

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Если вы запустите set -x перед запуском, bash будет отображать команды при их запуске.В частности, вы можете видеть, что bash расширяет $ bar перед передачей в foo ():

$ foo ${bar}
+ foo '"a' 'b"' '"c' 'd"' e f 'g"h'

Ответ - использовать eval, однако это не совсем это может показаться простым:

$ eval foo ${bar]
+ eval foo '"a' 'b"' '"c' 'd"' e f 'g"h'
bash: unexpected EOF while looking for matching `"'
bash: syntax error: unexpected end of file

В этом случае вам нужно экранировать как кавычку, так и обратную косую черту:

$ read -p "Write something: " bar
+ read -p 'Write something: ' bar
Write something: "a b" "c d" e\ f g\\\"h
$ eval foo ${bar}
+ eval foo '"a b" "c d" e f g\"h'
++ foo 'a b' 'c d' e f 'g"h'
++ '[' 5 -gt 0 ']'
++ echo 'a b'
a b
++ shift
++ '[' 4 -gt 0 ']'
++ echo 'c d'
c d
++ shift
++ '[' 3 -gt 0 ']'
++ echo e
e
++ shift
++ '[' 2 -gt 0 ']'
++ echo f
f
++ shift
++ '[' 1 -gt 0 ']'
++ echo 'g"h'
g"h
++ shift
++ '[' 0 -gt 0 ']'
1 голос
/ 15 марта 2012

Я бы использовал eval для повторной интерпретации кавычек внутри переменной:

eval foo "$bar"

a b
c d
e f
g"h

РЕДАКТИРОВАТЬ: Это небезопасно и требует проверки исходной строки, чтобы избежать всех специальных символов bash.

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