Vždy jsem si myslel, že bash zachází se zpětnými lomítky stejně při použití bez uvozovek nebo s uvozovkami, ale mýlil jsem se:
[[email protected] ~]$ echo "foo \ "
foo \
[[email protected] ~]$ echo foo \ # Space after \
foo
Takže jsem si myslel, že při použití dvojitých uvozovek se zpětná lomítka tisknou vždy, ale:
[[email protected] ~]$ echo "foo \" "
foo "
[[email protected] ~]$ echo "foo \\ "
foo \
Proč je na prvním řádku kódu zobrazeno zpětné lomítko?
Přijatá odpověď:
Oddíl 3.1.2.3 Dvojité uvozovky v příručce GNU Bash říká:
Zpětné lomítko si zachová svůj zvláštní význam pouze tehdy, když za ním následuje jeden z
následujících znaků:‘$
“, „`
“, „`
“, „\
“ nebonewline
. V dvojitých uvozovkách jsou odstraněna zpětná lomítka, za kterými následuje jeden
z těchto znaků. Zpětná lomítka před znaky
bez zvláštního významu zůstávají beze změny. Dvojité uvozovky mohou být
uvedeny v dvojitých uvozovkách tak, že se před ně uvede zpětné lomítko. Pokud je
povoleno, rozbalení historie se provede, pokud se nezobrazí „!
’ objevující se
ve dvojitých uvozovkách je zakončeno zpětným lomítkem. Zpětné lomítko před
„!
“ není odstraněno.
Tedy \
ve dvojitých uvozovkách se zachází odlišně od \
v jednoduchých uvozovkách a \
vnější uvozovky. Zachází se s ním doslovně, kromě případů, kdy je v pozici, kdy může způsobit doslovné zacházení s postavou, která by jinak mohla mít zvláštní význam v uvozovkách.
Všimněte si, že sekvence jako \'
, \?
a \*
jsou zpracovány doslovně a zpětné lomítko není odstraněno, protože '
, ?
a *
již nemají žádný zvláštní význam, když jsou uzavřeny ve dvojitých uvozovkách.