-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.
So, not with read itself, and putting \n in the message string just echoes \n. The answer should be simple though - don't get read to display the prompt:
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
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
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.
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.