Search code examples
sh

How can I have a newline in a string in 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.


Solution

  • If you're using Bash, you can use backslash-escapes inside of a specially-quoted $'string'. For example, adding \n:

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

    Prints:

    Hello
    World
    

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

    STR='Hello
    World'
    

    Bash recognizes a number of other backslash escape sequences 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.