Come sfuggire all'apostrofo in una stringa tra virgolette singole in bash?


18

Non capisco come bash valuti la fuga di caratteri apostrofo in stringhe tra virgolette singole.

Ecco un esempio:

$ echo ''\''Hello World'\'''
'Hello World' # works

$ echo '\'Hello World\''
 > # expects you to continue input

Ho provato a cercare spiegazioni a questo, ma non sono riuscito a ottenere nulla. Cosa ci fa Bash qui?


echo \''Hello World'\'
matematica,

Risposte:


19

Tra virgolette singole, non è possibile scappare. Non è possibile includere una virgoletta singola tra virgolette singole. Vedi Citando in man bash .


1
Hai ragione. Il trucco sta in quella riga "Una virgoletta singola potrebbe non avvenire tra virgolette singole anche se preceduta da una barra rovesciata" Quindi probabilmente la divide in parti diverse.
Kibet,

@Colin Non appena una singola virgoletta si trova all'interno di altre due virgolette singole (ma con una barra rovesciata), la citazione tra virgolette non è più una vera citazione. È solo un carattere senza particolari caratteristiche di abbinamento.
zero2cx

1
@ zero2cx: non è vero:echo '\''
choroba

@ zero2cx: direi "esterno" anziché "interno".
Choroba,

3
@choroba non è "totalmente" vero, in bash puoi farloecho $'\'hello world\''
bufh

9

Oltre alle virgolette singole e doppie supportate da POSIX, bashfornisce un ulteriore tipo di quotazione per consentire una piccola classe di caratteri di escape (inclusa una virgoletta singola) in una stringa tra virgolette:

$ echo $'\'Hello World\''
'Hello World'

Vedi la sezione PREVENTIVO nella bashpagina man, vicino alla fine della sezione. (Cerca "ANSI C".)


3

Per spiegare cosa sta succedendo con i tuoi apostrofi fuggiti, esamineremo il tuo secondo esempio (vedi anche virgolette singole o virgolette forti ):

$ echo '\'Hello World\''
>     # expects you to continue input

Qui, hai lasciato sospeso il preventivo, come hai affermato. Ora tagliare la fine e cambiarla in:

                     v                                v           v
$ echo '\'Hello World     # Echo two strings: '\' and 'Hello World'.
\Hello World         ^

La sotto-stringa "Hello World" non è stata citata qui, ma si comportava come se fosse citata con forza. Usando di nuovo il tuo esempio, questa volta taglia la fine in modo diverso:

                     vv                                    v (plain apostrophe)
$ echo '\'Hello World\'   # Will echo: '\' and 'Hello World''
\Hello World'        ^^   # Note that the trailing ' char is backslash escaped. 

La sotto-stringa "Hello World" si comporta di nuovo come se fosse citata in modo forte, con solo l'apostrofo aggiunto (scappato, quindi non più una sola virgoletta) alla fine.

Quando viene aggiunta un'altra virgoletta alla fine (l'esempio originale) la stringa viene lasciata in sospeso e in attesa di una virgoletta.


3

Semplice esempio di virgolette di escape nella shell:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Viene fatto chiudendo uno già aperto ( '), posizionando uno sfuggito ( \') per la stampa, quindi aprendo un altro ( ').

In alternativa:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

Viene fatto finendo uno già aperto ( '), posizionando la citazione in un'altra citazione ( "'"), quindi aprendone un'altra ( ').

Quello che hai fatto ( '\'Hello World\''), è:

  1. Aperto primo apostrofo: '.
  2. Chiuso subito dopo \', quindi la stringa diventa: '\'.
  3. Hello World non sono virgolette.
  4. Apostrofo autonomo posizionato ( \') senza aprirlo.
  5. L'ultimo apostrofo ( ') sta aprendo la stringa, ma non è prevista una chiusura.

Quindi l'esempio corretto sarebbe:

$ echo \'Hello World\'
'Hello World'

Correlati: Come evitare virgolette singole all'interno di stringhe tra virgolette singole?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.