Le barre rovesciate vengono trattate appositamente da echo -e
, ma prima a volte vengono trattate specialmente dalla shell (che in questo caso lo è bash
), secondo le regole di quotazione della shell .
L'argomento in echo
realtà vede è Hello\\n
. Poiché sei passato -e
a echo
, tratta in modo speciale le escape di barra rovesciata e \\
viene compresso in una sola \
. Il finale n
non è sfuggito, quindi appare letteralmente.
La ragione di ciò è che, prima e separatamente dal funzionamento di echo
se stesso, la shell tratta \
specialmente in alcuni contesti ma non in altri. I \
personaggi non quotati vengono sempre trattati in modo speciale, i caratteri a virgoletta singola\
non vengono mai trattati in modo speciale, ma il trattamento dei caratteri tra virgolette doppie \
, come nel comando eseguito, è più sottile e complicato.
Quando la shell incontra un testo tra virgolette in un comando, come nel caso "Hello\\\n"
, tratta \
un carattere di escape quando precede un carattere che può avere un significato speciale tra virgolette doppie e non altrimenti .
- Perché a
\
volte ha un significato speciale dentro ""
, un \
che precede immediatamente un altro \
ha l'effetto di citare quel secondo \
. Quindi all'interno delle doppie virgolette, le prime \\
vengono compresse \
.
- Dopo quei primi due
\
personaggi, c'è un terzo \
personaggio che non è interessato da quei primi due e che precede un n
. Ma n
non è un personaggio mai trattato in modo speciale tra virgolette doppie, quindi il personaggio \
precedente non viene trattato in modo particolare in questa situazione. Così \n
rimane \n
.
L'effetto è che, tra virgolette doppie, \\\n
viene interpretato come \\n
.
Quando echo -e
vede \\n
, il primo \
rimuove il significato speciale dal secondo, quindi echo
stampa \n
letteralmente per quel testo.
Se il tuo obiettivo è stampare Hello
con una nuova riga extra ma senza barre rovesciate (la domanda era inizialmente ambigua su questo, in più penso che sia un esempio utile), quindi una soluzione è rimuovere un \
. Esecuzione di echo -e "Hello\\n"
output Hello
con una nuova riga aggiuntiva alla fine.
Una soluzione migliore è usare virgolette singole e scrivere echo -e 'Hello\n'
. Le virgolette singole sono la forma di citazione più forte. Una soluzione ancora migliore è di solito usare al printf
posto di echo
, che in questo caso sarebbe printf 'Hello\n\n'
.
Se il tuo obiettivo è stampare Hello\
includendo la barra rovesciata, seguita da una nuova riga in più , allora l'approccio tra virgolette è possibile ma ingombrante. Per capirlo, lavora all'indietro: echo -e
converte \\
in \
e \n
in una nuova riga, e la doppia virgoletta si converte \\
in \
, quindi puoi farlo con sei barre rovesciate ( echo -e "Hello\\\\\\n"
), perché \\n
si trasforma in \n
una barra rovesciata che sfugge a un'altra. Puoi anche farlo con cinque, perché la doppia virgoletta viene mantenuta \n
quando \
non è stato eseguito l'escaping.
Questo illustra il vantaggio di echo -e
virgolette singole: inserisci semplicemente quello che vuoi vedere tra virgolette singole ( echo -e 'Hello\\\n'
). printf
va bene anche qui. Un'opzione è printf 'Hello\\\n\n'
. Ma dove printf
brilla davvero è che puoi inserire argomenti aggiuntivi. Puoi usare printf '%s\n\n' 'Hello\'
, che inserisce il secondo argomento (letteralmente Hello\
perché le virgolette singole non cambiano nulla) al posto di %s
.