如何为read命令添加换行符?

时间:2010-11-28 09:08:00

标签: bash shell unix

 read -p "Please Enter a Message:" message

如何在Message:之后添加换行符?

7 个答案:

答案 0 :(得分:53)

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

# -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,美元符号被忽略。如果是字符串   翻译和替换,替换是双引号。

答案 1 :(得分:35)

我喜欢Huang F. Lei's answer,但如果您不喜欢文字换行符,则可以:

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:
_

但必须有更好的方法。

答案 2 :(得分:10)

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

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

答案 3 :(得分:7)

只是为了改善我喜欢的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 :(得分:4)

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

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

来自GNU Bash reference manual

  

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

答案 5 :(得分:2)

来自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

答案 6 :(得分:-2)

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