How do I add a line break for read command?

前端 未结 7 627
孤街浪徒
孤街浪徒 2020-12-24 10:43
 read -p \"Please Enter a Message:\" message

How can I add a line break after Message:?

相关标签:
7条回答
  • 2020-12-24 11:00

    Just looking for the exact same thing. You can use:

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

    And it will work exactly as asked:

    Please enter a Message:
    _
    

    Here is an extract from the bash manpage explaining it:

    Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows:

    • (...)
    • \n new line
    • (...)

    The expanded result is single-quoted, as if the dollar sign had not been present.

    Took me a while to find out.

    Note that single quotes and double quotes behave differently in this regard:

    A double-quoted string preceded by a dollar sign ($) will cause the string to be translated according to the current locale. If the cur- rent locale is C or POSIX, the dollar sign is ignored. If the string is translated and replaced, the replacement is double-quoted.

    0 讨论(0)
  • 2020-12-24 11:10
    $ read -p "Please Enter a Message:
    > " message
    Please Enter a Message:
    

    Typing a "newline" between ':' and '"' directly.

    0 讨论(0)
  • 2020-12-24 11:13

    Just to improve the answers of Huang F. Lei and of T.J. Crowder which I like (and added +1) .. You can use one of the following syntaxes too, which basically are the same, it depends on your taste (I prefer the first one):

    read -p "$(echo -e 'Please Enter a Message: \n\b')" message
    read -p "`echo -e 'Please Enter a Message: \n\b'`" message
    

    which both will produce the following output:

    Please Enter a Message: 
    _
    

    where _ is the cursor.
    In case you need a newline in any part of the string but the end, you can use \n, for example

    read -p "`echo -e '\nPlease Enter\na Message: '`" message
    

    will produce

    .
    Please Enter
    a Message: _
    

    where . is a blank first new line and _ is the cursor.

    Only to add a final trailing newline you have to use \n\b as in my first example

    0 讨论(0)
  • 2020-12-24 11:13

    read -p "Please Enter a Message:Return" message

    0 讨论(0)
  • 2020-12-24 11:14

    Here's an improvement on the accepted answer that doesn't require spawning a subshell:

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

    From the GNU Bash reference manual:

    Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard.

    0 讨论(0)
  • 2020-12-24 11:16

    I like Huang F. Lei's answer, but if you don't like the literal line break, this works:

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

    Shows:

    Please Enter a Message:
    > _

    ...where _ is where the cursor ends up. Note that since trailing newlines are usually dropped during command substitution, I've included the > afterward. But actually, your original question doesn't seem to want that prompt bit, so:

    # 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
    

    Shows

    Please Enter a Message:
    _

    There has to be a better way, though.

    0 讨论(0)
提交回复
热议问题