W moim systemie (Ubuntu 17.10) twój przykład działa tak, jak chcesz, zarówno po wpisaniu z linii poleceń (do sh), jak i po uruchomieniu jako shskrypt:
[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
Myślę, że to odpowiada na twoje pytanie: to po prostu działa. (Nie próbowałem dowiedzieć się szczegółów, takich jak na jakim dokładnie momencie zastąpienia znak nowej linii dla \nzdarza się sh).
Jednak zauważyłem, że ten sam skrypt będzie zachowywać się inaczej, gdy wykonywane zbash i będzie drukować Hello\nWorldzamiast:
[bash]§ bash test-str.sh
Hello\nWorld
Udało mi się uzyskać pożądany wynik bashw następujący sposób:
[bash]§ STR="Hello
> World"
[bash]§ echo "$STR"
Zwróć uwagę na podwójne cytaty wokół $STR. To zachowuje się identycznie, jeśli zostanie zapisane i uruchomione jako bashskrypt.
Poniższe daje również pożądany wynik:
[bash]§ echo "Hello
> World"