Как у меня может быть новая строка в строке в sh?

Это

STR="Hello\nWorld"
echo $STR

производит, как произведено

Hello\nWorld

вместо

Hello
World

Что я должен сделать, чтобы иметь новую строку в строке?

Примечание: Этот вопрос не об эхе. Я знаю echo -e, но я ищу решение, которое позволяет передавать строку (который включает новую строку) как аргумент другим командам, которые не имеют подобной опции интерпретировать \nкак новые строки.

303
задан Juan A. Navarro 4 June 2015 в 21:20
поделиться

2 ответа

Решение состоит в том, чтобы использовать $ 'string' , например:

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

Вот выдержка из страницы руководства Bash:

   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.
316
ответ дан 23 November 2019 в 01:23
поделиться

Проблема не в оболочке. Проблема в самой команде echo и отсутствии двойных кавычек вокруг интерполяции переменных. Вы можете попробовать использовать echo -e, но это поддерживается не на всех платформах, и это одна из причин, по которой printf теперь рекомендуется для переносимости.

Вы также можете попробовать вставить новую строку непосредственно в сценарий оболочки (если сценарий - это то, что вы пишете), чтобы это выглядело как...

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

or equivalently

#!/bin/sh
string="Hello
World"
echo "$string"  # note double quotes!
29
ответ дан 23 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: