LINUX.ORG.RU
решено ФорумAdmin

Почему bash не считывает пользовательский ввод в переменную?

 , , ,


0

1

Пытаюсь заставить работать что-то вроде такого:

xfce4-terminal -x bash -c "echo 'Enter the name:'; read EXP; echo $EXP; read"
Второе echo выводит пустую строку. Как правильно надо?

★★★★★

Ответ на: комментарий от anonymous

Кажется, я понял, в чём проблема: в изначальном виде bash сначала интерпретирует строку в двойных кавычках, подставляя туда пустое значение несуществующей переменной, и только потом передаёт её новому интерпретатору. По сути, надо только исправить двойные кавычки на одинарные.

Спасибо всем отписавшимся.

meliafaro ★★★★★ ()
Ответ на: комментарий от meliafaro

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

Это может помешать вставить действительно если надо значение от существующей переменной. Уж сколько твердили миру, если вы хотите передать спец символ для дальнейшей обработки, а пока запретить его интерпретацию как спец-символа, то удобнее его экранировать, а не танцы с кавычками. Кавычек всего две и обе могут понадобиться.

PROMPT='Enter the name:'

bash -c "read -p '$PROMPT' EXP; echo \$EXP"
PS: и на ответ намекала раскраска парсера ЛОР. Видите разницу? Где зелёная строка и где лиловая.

vodz ★★★★★ ()
Ответ на: комментарий от anonymous

С экранированием хуже читается. Если возможно, лучше кавычки.

Это так, пока не понадобятся таки вставка переменных и обе кавычки, казалось бы ерунда, а всё переписывать. Добавьте в prompt кавычки и при echo, скажем надпись Вы ввели "..."

vodz ★★★★★ ()
Ответ на: комментарий от vodz

А что можно почитать по sh, чтобы понять логику? Почему иногда хватает одного экранирующего слэша, иногда нужны два, иногда даже четыре. Я вот такие конструкции могу генерировать исключительно методом тыка, и насколько я могу судить, далеко не только я.

meliafaro ★★★★★ ()
Ответ на: комментарий от meliafaro

Ставишь обратный слеш и следующий символ перестаёт быть специальным (в однинарных кавычках это не работает). Вот и всё, никакой магии.

PROMPT=Enter something
xfce4-terminal -x bash -c echo "read -p '$PROMPT' EXP; echo Введено \\\"\$EXP\\\""

Что передаётся как строковой аргумент башу после экранирования и подстановки переменных:

read -p 'Enter something' EXP; echo Введено \"$EXP\"
melkor217 ★★★★★ ()
Ответ на: комментарий от meliafaro

Логика не сложная. Для каждого текущего sh-а достаточно одного экранирования, но сам символ \ при экранировании есть \\, вот и получается: экранирование \ и " преобразуется в три подряд \\\ и кавычку.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)