Suppose
PATH=/this/is/path1:/this/is/path2:/this/is/path3
Why does
echo "${PATH//:/\n}" or echo -e "${PATH//:/\n}"
not output
this/is/path1
this/is/path2
this/is/path3
This is bash 4.4.20.
Suppose
PATH=/this/is/path1:/this/is/path2:/this/is/path3
Why does
echo "${PATH//:/\n}" or echo -e "${PATH//:/\n}"
not output
this/is/path1
this/is/path2
this/is/path3
This is bash 4.4.20.
Stuff inside ${var//<here>/<and here>} is escaped with \, so that you could write \} or \/. Like:
$ var=abc; echo "${var//b/\}}"
a}c
The \n is not special sequence, so it's just n:
$ var=abc; echo "${var//b/\n}"
anc
So with "${PATH//:/\n}" you are just only replacing : with n. Either replace : with an actual newline:
echo "${PATH//:/$'\n'}"
# or an actual actual newline
echo "${PATH//:/
}"
or you seem to want to replace it by a sequence of two characters \n and then use echo -e to tranform \n into newlines:
echo -e "${PATH//:/\\n}"
The bash operator ${var//pattern/string/ } is a variable expansion, which takes as input the value of the variable var, then replaces all matches of pattern by string.
In your example, to goal is to replace each separator : by \n, and print them with echo -e as a newline.
But to make it work, it is necessary to double the \ to protect it, so the correct command is
echo -e "${PATH//:/\\n}"
For further informations, see in the reference manual the paragraph ${parameter/pattern/string}.