Как добавить разрыв строки для команды чтения?

 read -p "Please Enter a Message:" message

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

8 ответов

Решение

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

read -p "Please Enter a Message: `echo $'\n> '`" 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

шоу

Пожалуйста, введите сообщение:
_

Там должен быть лучший способ, хотя.

Просто ищу то же самое. Ты можешь использовать:

# -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, знак доллара игнорируется. Если строка переведена и заменена, замена заменяется двойными кавычками.

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

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

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

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

$ read -p "Please Enter a Message:
> " message
Please Enter a Message:

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

Просто чтобы улучшить ответы Хуанга Ф. Лея и Ти Джей Краудера, которые мне нравятся (и добавил +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 как в моем первом примере

От 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
      read -p "$(printf 'Please Enter a Message:\n')" message

Сprintfвы можете использовать\nдля разрывов строк.

read -p "Please Enter a Message:Вернуть" message

Другие вопросы по тегам