В моей системе (Ubuntu 17.10) ваш пример работает так, как нужно, как при вводе из командной строки (в sh
), так и при выполнении в виде скрипта sh
:
[bash]§ sh
$ STR="Hello\nWorld"
$ echo $STR
Hello
World
$ exit
[bash]§ echo "STR=\"Hello\nWorld\"
> echo \$STR" > test-str.sh
[bash]§ cat test-str.sh
STR="Hello\nWorld"
echo $STR
[bash]§ sh test-str.sh
Hello
World
Полагаю, это отвечает на ваш вопрос: это просто работает. (Я не пытался выяснить детали, например, в какой момент именно замена символа новой строки на \n
происходит в sh
).
Однако я заметил, что этот же скрипт будет работать по-разному при выполнении с bash
и вместо этого выведет Hello\nWorld
:
[bash]§ bash test-str.sh
Hello\nWorld
Мне удалось получить желаемый результат с помощью bash
следующим образом:
[bash]§ STR="Hello
> World"
[bash]§ echo "$STR"
Обратите внимание на двойные кавычки вокруг $STR
. Это ведет себя идентично, если сохранено и запущено как bash
скрипт.
Следующее также дает желаемый результат:
[bash]§ echo "Hello
> World"