Как добавить разрыв строки для команды чтения? - PullRequest
44 голосов
/ 28 ноября 2010
 read -p "Please Enter a Message:" message

Как добавить разрыв строки после Message:?

Ответы [ 7 ]

56 голосов
/ 29 марта 2013

Просто ищу точно такую ​​же вещь.Вы можете использовать:

# -r and -e options are unrelated to the answer.
read -rep $'Please Enter a Message:\n' message

И он будет работать в точности так, как просили:

Please enter a Message:
_

Вот выдержка из справочной страницы bash, объясняющая это:

Слова вида $ 'string' обрабатываются специально.Слово расширяется до строки, символы с обратной косой чертой заменяются в соответствии со стандартом ANSI C.Экранирующие последовательности с обратной косой чертой, если они существуют, декодируются следующим образом:

  • (...)
  • \ n новая строка
  • (...)

Расширенный результат заключен в одинарные кавычки, как если бы знак доллара отсутствовал.

Мне потребовалось некоторое время, чтобы выяснить.

Обратите внимание, что одинкавычки и двойные кавычки ведут себя по-разному в этом отношении:

Строка с двойными кавычками, которой предшествует знак доллара ($), приведет к переводу строки в соответствии с текущей локалью.Если текущим языковым стандартом является C или POSIX, знак доллара игнорируется.Если строка переведена и заменена, замена заменяется двойными кавычками.

39 голосов
/ 28 ноября 2010

Мне нравится Ответ Хуанга Ф. Лея , но если вам не нравится разрыв буквальной строки, это работает:

read -p "Please Enter a Message: `echo $'\n> '`" message

Показывает:

Please Enter a Message:
> _

... где _ - это место, где заканчивается курсор.Обратите внимание, что поскольку завершающие символы новой строки обычно удаляются во время подстановки команд, я включил > после этого.Но на самом деле ваш первоначальный вопрос, похоже, не нуждается в этом подсказке, поэтому:

# Get a carriage return into `cr` -- there *has* to be a better way to do this
cr=`echo $'\n.'`
cr=${cr%.}

# Use it
read -p "Please Enter a Message: $cr" message

Показывает

Please Enter a Message:
_

Однако должен быть лучший способ.

10 голосов
/ 28 ноября 2010
$ read -p "Please Enter a Message:
> " message
Please Enter a Message:

Ввод "новой строки" между ':' и '"' напрямую.

7 голосов
/ 23 февраля 2012

Просто для улучшения ответов Хуан Ф. Лей и Т.Дж. Crowder который мне нравится (и добавил +1) .. Вы также можете использовать один из следующих синтаксисов, которые в основном одинаковы, это зависит от вашего вкуса (я предпочитаю первый):

read -p "$(echo -e 'Please Enter a Message: \n\b')" message
read -p "`echo -e 'Please Enter a Message: \n\b'`" message

, который выдает следующий результат:

Please Enter a Message: 
_

где _ - курсор.
Если вам нужна новая строка в любой части строки, кроме конца, вы можете использовать \n, например

read -p "`echo -e '\nPlease Enter\na Message: '`" message

будет производить

.
Please Enter
a Message: _

где. пустая первая новая строка, а _ - курсор.

Только для добавления заключительного трейлинга новой строки вы должны использовать \n\b, как в моем первом примере

6 голосов
/ 19 сентября 2016

Вот улучшение принятого ответа, который не требует порождения подоболочки:

read -p "Please Enter a Message:"$'\n' message

Из справочного руководства GNU Bash :

Слова формы $'string' обрабатываются специально. Слово расширяется до string , символы с обратной косой чертой заменяются в соответствии со стандартом ANSI C.

2 голосов
/ 28 ноября 2010

Из справочной страницы bash:

-p prompt
   Display prompt on standard error, without a trailing new-
   line, before attempting to read any input.  The prompt is
   displayed only if input is coming from a terminal.

Таким образом, не с самим read, а добавление \n в строку сообщения повторяет \n.Ответ должен быть простым - не выводите read, чтобы отобразить приглашение:

echo "Please Enter a Message:" 1>&2
read message
0 голосов
/ 28 ноября 2010

read -p "Please Enter a Message: Возвращение " message

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