В моей системе (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"
Это было изменено между 3,1 и 3.2:
Это - краткое описание новых опций, добавленных к удару 3.2 начиная с выпуска удара 3.1.
Заключение в кавычки аргумента строки к [[команда = ~ оператор теперь вызывает сопоставление строк, как с другими операторами сопоставления с образцом.
Так используют его без кавычек таким образом:
i="test"
if [[ $i =~ 200[78] ]] ; then
echo "OK"
else
echo "not OK"
fi
Нужны пробелы вокруг оператора =~
i="test" if [[ $i =~ "200[78]" ]]; then echo "OK" else echo "not OK" fi