Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I have a newline in a string in sh?

Tags:

sh

This

STR="Hello\nWorld" echo $STR 

produces as output

Hello\nWorld 

instead of

Hello World 

What should I do to have a newline in a string?

Note: This question is not about echo. I'm aware of echo -e, but I'm looking for a solution that allows passing a string (which includes a newline) as an argument to other commands that do not have a similar option to interpret \n's as newlines.

like image 331
Juan A. Navarro Avatar asked Jun 09 '10 13:06

Juan A. Navarro


People also ask

How do you add a newline to a string?

In Windows, a new line is denoted using “\r\n”, sometimes called a Carriage Return and Line Feed, or CRLF. Adding a new line in Java is as simple as including “\n” , “\r”, or “\r\n” at the end of our string.

How do you add a line break in shell script?

The most used newline character If you don't want to use echo repeatedly to create new lines in your shell script, then you can use the \n character. The \n is a newline character for Unix-based systems; it helps to push the commands that come after it onto a new line.

How do I add a new line to a string in bash?

Printing Newline in Bash The most common way is to use the echo command. However, the printf command also works fine. Using the backslash character for newline “\n” is the conventional way. However, it's also possible to denote newlines using the “$” sign.

Does \n work in a string?

in a string prevents actually making a new line and instead of Type (new line) for a new line it is Type \n for a new line .


2 Answers

If you're using Bash, the solution is to use $'string', for example:

$ STR=$'Hello\nWorld' $ echo "$STR" # quotes are required here! Hello World 

If you're using pretty much any other shell, just insert the newline as-is in the string:

$ STR='Hello > World' 

Bash is pretty nice. It accepts more than just \n in the $'' string. Here is an excerpt from the Bash manual page:

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:       \a     alert (bell)       \b     backspace       \e       \E     an escape character       \f     form feed       \n     new line       \r     carriage return       \t     horizontal tab       \v     vertical tab       \\     backslash       \'     single quote       \"     double quote       \nnn   the eight-bit character whose value is the octal value              nnn (one to three digits)       \xHH   the eight-bit character whose value is the hexadecimal              value HH (one or two hex digits)       \cx    a control-x character  The expanded result is single-quoted, as if the dollar sign had not been present.  A double-quoted string preceded by a dollar sign ($"string") will cause the string to be translated according to the current locale. If the current locale is C or POSIX, the dollar sign is ignored. If the string is translated and replaced, the replacement is double-quoted. 
like image 100
amphetamachine Avatar answered Sep 18 '22 20:09

amphetamachine


Echo is so nineties and so fraught with perils that its use should result in core dumps no less than 4GB. Seriously, echo's problems were the reason why the Unix Standardization process finally invented the printf utility, doing away with all the problems.

So to get a newline in a string, there are two ways:

# 1) Literal newline in an assignment. FOO="hello world" # 2) Command substitution. BAR=$(printf "hello\nworld\n") # Alternative; note: final newline is deleted printf '<%s>\n' "$FOO" printf '<%s>\n' "$BAR" 

There! No SYSV vs BSD echo madness, everything gets neatly printed and fully portable support for C escape sequences. Everybody please use printf now for all your output needs and never look back.

like image 30
Jens Avatar answered Sep 21 '22 20:09

Jens