如何为读取命令添加换行符?

问题描述 投票:0回答:8
 read -p "Please Enter a Message:" message

如何在

Message:
之后添加换行符?

bash shell unix
8个回答
104
投票

只是寻找完全相同的东西。您可以使用:

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

它会完全按照要求工作:

Please enter a Message:
_

这里是 bash 手册页上 ANSI-C 引用 的摘录,对其进行了解释:

$'string' 形式的单词会被特殊处理。这个词扩展为 字符串,用反斜杠转义字符替换为指定的 ANSI C 标准。反斜杠转义序列(如果存在)将被解码 如下:

  • (...)
  • 新线路
  • (...)

扩展后的结果是单引号的,就好像美元符号没有一样 曾经在场。

我花了一段时间才找到答案。

请注意,单引号和双引号在这方面的行为有所不同,如区域特定翻译:

下所指出的

前面带有美元符号 ($) 的双引号字符串将导致 要根据当前语言环境进行翻译的字符串。如果电流 rent 语言环境是 C 或 POSIX,美元符号被忽略。如果字符串 被翻译和替换,替换是双引号的。


50
投票

我喜欢Huang F. Lei的回答,但如果你不喜欢字面上的换行符,这有效:

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

演出

请输入留言:
_

不过,必须有更好的方法。


46
投票

这是对已接受答案的改进,不需要生成子shell:

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

来自 GNU Bash 参考手册

$'string'
形式的单词经过特殊处理。该单词扩展为 string,并按照 ANSI C 标准的规定替换反斜杠转义字符。


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

直接在 ':' 和 '"' 之间输入“换行符”。


12
投票

只是为了改进Huang F. LeiT.J.的答案。我喜欢 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
,如我的第一个示例中那样


4
投票

来自

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

通过

printf
,您可以使用
\n
进行换行。


-3
投票

read -p "Please Enter a Message:
返回
" message

© www.soinside.com 2019 - 2024. All rights reserved.