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

后端 未结 13 775
北恋
北恋 2020-11-22 17:17

This

STR=\"Hello\\nWorld\"
echo $STR

produces as output

Hello\\nWorld

instead of

Hello
Wo         


        
相关标签:
13条回答
  • 2020-11-22 17:29

    I wasn't really happy with any of the options here. This is what worked for me.

    str=$(printf "%s" "first line")
    str=$(printf "$str\n%s" "another line")
    str=$(printf "$str\n%s" "and another line")
    
    0 讨论(0)
  • 2020-11-22 17:30

    I find the -e flag elegant and straight forward

    bash$ STR="Hello\nWorld"
    
    bash$ echo -e $STR
    Hello
    World
    

    If the string is the output of another command, I just use quotes

    indexes_diff=$(git diff index.yaml)
    echo "$indexes_diff"
    
    0 讨论(0)
  • 2020-11-22 17:31

    The problem isn't with the shell. The problem is actually with the echo command itself, and the lack of double quotes around the variable interpolation. You can try using echo -e but that isn't supported on all platforms, and one of the reasons printf is now recommended for portability.

    You can also try and insert the newline directly into your shell script (if a script is what you're writing) so it looks like...

    #!/bin/sh
    echo "Hello
    World"
    #EOF
    

    or equivalently

    #!/bin/sh
    string="Hello
    World"
    echo "$string"  # note double quotes!
    
    0 讨论(0)
  • 2020-11-22 17:32

    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:

    FOO="hello
    world"
    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 and never look back.

    0 讨论(0)
  • 2020-11-22 17:35

    This isn't ideal, but I had written a lot of code and defined strings in a way similar to the method used in the question. The accepted solution required me to refactor a lot of the code so instead, I replaced every \n with "$'\n'" and this worked for me.

    0 讨论(0)
  • 2020-11-22 17:37

    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.
    
    0 讨论(0)
提交回复
热议问题