Как добавить разрыв строки для команды чтения?
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
для разрывов строк.