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

cgyqldqp  于 2023-01-13  发布在  Unix
关注(0)|答案(8)|浏览(264)
read -p "Please Enter a Message:" message

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

a2mppw5e

a2mppw5e1#

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

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

它将完全按照要求工作:

Please enter a Message:
_

下面是bash手册页中的一段摘录,对它进行了解释:
$'string'形式的单词将被特殊处理。该单词将扩展为string,并按照ANSI C标准的规定替换反斜杠转义字符。反斜杠转义序列(如果存在)的解码如下:

  • (...)
  • \n新行
  • (...)

展开的结果用单引号引起来,就好像美元符号不存在一样。
我花了点时间才知道。
请注意,单引号和双引号在这方面的行为不同:
前面带有美元符号($)的双引号字符串将导致根据当前区域设置翻译该字符串。如果当前区域设置为C或POSIX,则忽略美元符号。如果翻译并替换该字符串,则替换内容将被双引号括起来。

hjqgdpho

hjqgdpho2#

我喜欢Huang F. Lei的回答,但如果你不喜欢字面上的断行,下面这个答案也可以:

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

不过,肯定有更好的办法。

ccgok5k5

ccgok5k53#

下面是对公认答案的改进,它不需要生成子shell:

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

来自GNU Bash参考手册:
$'string'形式的单词将被特殊处理。该单词将扩展为 string,并按照ANSI C标准的规定替换反斜杠转义字符。

epggiuax

epggiuax4#

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

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

hxzsmxv2

hxzsmxv25#

为了改进我喜欢的Huang F. Lei和T.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,就像我的第一个示例一样

svdrlsy4

svdrlsy46#

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
py49o6xq

py49o6xq7#

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

使用printf,您可以将\n用于换行符。

fnvucqvd

fnvucqvd8#

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

相关问题