【问题标题】:How do I add a line break for read command?如何为读取命令添加换行符?
【发布时间】:2010-11-28 09:08:00
【问题描述】:
 read -p "Please Enter a Message:" message

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

【问题讨论】:

  • 您可能会考虑将接受的答案更新为this one,因为它不那么骇人听闻(而且对我们未来的访问者来说也不那么混乱......)。

标签: bash shell unix


【解决方案1】:

这是对不需要生成子外壳的公认答案的改进:

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

来自GNU Bash reference manual

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

【讨论】:

  • 这里最简洁的答案。 +1
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

只是为了改进我喜欢的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】:
    $ read -p "Please Enter a Message:
    > " message
    Please Enter a Message:
    

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

    【讨论】:

    • 简洁的解决方案,但可能会使稍后阅读代码的人感到困惑。
    • 这对我有用,因为我也有一个变量,并且使用read -p "$(echo -e 'Please Enter a Message: \n\b')" message 解决方案,它会逐字打印变量名。此解决方案可以正确扩展。
    【解决方案5】:

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

    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
    

    表演

    请输入信息:
    _

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

    【讨论】:

    • 希望有更好的办法:)
    • @Doug:是的。刚刚更新了轻微的改进。我还是不满意。 :-)
    • @Doug:虽然现在我想起来了,因为echo(如read)是内置的bash,尽管上面有点尴尬,至少它不是不必要的产生进程。
    • 您可以像这样直接分配换行符:(适用于 bash v3)cr=$'\n'
    • @T.J.Crowder Here 是您正在寻找的更好的方式。
    【解决方案6】:

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

    【讨论】:

    • 不适用于 Ubuntu 10.04 上的 bash。你确定那里的语法吗?
    • 也许你的意思是像黄 F. Lei 解决方案一样按回车键?
    【解决方案7】:

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

    【讨论】:

    • 但是无论输入是否来自终端,echo 都会发生;消息read 不会显示。
    • 公平点,如果脚本将被非交互式使用。
    猜你喜欢
    • 2022-01-08
    • 2020-11-26
    • 2010-12-10
    • 2011-07-01
    • 1970-01-01
    • 2011-01-19
    • 2011-12-31
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多