2012-08-15 20 views
38

ho bisogno di passare una stringa a un programma come argomento dalla Bash CLI, ad esempioIn che modo il principale segno del dollaro influisce sulle virgolette singole in Bash?

program "don't do this" 

La stringa può includere qualsiasi carattere come '$', '\', ecc e non voglio fare alcun Bash modifica. Quindi penso a usare le virgolette singole.

Tuttavia il seguente non funziona:

program 'don\'t do this'   //escape doesn't work in single quote 

Mentre i due seguenti opere:

program $'dont\'t do this'   //seems fine, but any other side effects? 
program 'dont'\''do this'   //breaking into 3 parts 

Il primo approccio sembra meglio in quanto acquista meno modifica pre (mettere il simbolo del dollaro di fronte e sostituire ogni \ a \\), ma non so cos'altro potrebbe fare il DOLLAR SIGN.

ho davvero googled questo, ma non riesco a trovare quello che mi serve ...

+4

Per capire meglio l'esempio di '$' ... '', dare un'occhiata al primo paragrafo di [pagina di informazioni di base] (http://www.gnu.org/software/bash /manual/html_node/ANSI_002dC-Quoting.html#ANSI_002dC-Quoting) – suvayu

+0

Grazie per aver postato questa domanda. È fondamentale per capire come allineare i record delimitati da tabulazioni (ad es. 'Cat myData.tsv | column -t -s $ '\ t'') –

risposta

48

provoca sequenze di escape per essere interpretati.

$ echo $'Name\tAge\nBob\t24\nMary\t36' 
Name Age 
Bob  24 
Mary 36 

(e maniglie SO schede in modo goffo, in modo da provare questo uno a casa)

+0

+1 buona cattura.Immagino che questo accada perché i nomi delle variabili sono espansi? –

+0

No, questo succede perché è definito comportamento per '$ '...''. –

+0

Questo è esattamente ciò di cui ho bisogno se questo è tutto $ '' fa! – user1206899

18

Utilizzando $ come prefisso dice BASH per cercare di trovare una variabile con quel nome. $' è una sintassi speciale (fully explained here) che abilita l'elaborazione della stringa ANSI-C. In questo caso, il segno di spunta singolo non è "prendi valore letteralmente fino al prossimo segno di spunta". Dovrebbe essere abbastanza sicuro da usare. Gli svantaggi sono solo BASH e abbastanza rari, così tante persone si chiederanno cosa significhi.

Il modo migliore è utilizzare le virgolette singole. Se hai bisogno di una singola citazione in una stringa, devi sostituirla con '\''. Questo termina la precedente stringa con quotatura singola, aggiunge una singola citazione (\') e quindi avvia una nuova stringa singola quotata. Questa sintassi funziona con qualsiasi discendente di Bourne shell, è abbastanza facile da capire e la maggior parte delle persone riconosce rapidamente il pattern.

L'alternativa è replase ogni singolo tick con '"'"' che traduce "interrompere corrente singola stringa citato, aggiungere doppio anello citato che contiene solo un singolo battito, riavviare singola stringa citato". Questo evita il carattere di fuga e sembra ben simmetrico. Funziona anche viceversa se hai bisogno di una virgoletta doppia in una stringa doppia citata: "'"'".

+0

sì è il modo corretto – user1206899

+2

È anche comune vedere "" "" "". es. "il cane" "" "la coda" –

+0

$ 'SHELL' e $ 'LANG' non * non * "falliscono". Il simbolo del dollaro in $ 'ha una funzione diversa. Direi che '\' 'è * un * modo corretto. – jox

-1

Non troverete un modo più veloce o più efficiente rispetto:

eval RESULT=\$\'$STRING\' 

Per uno, questo è il tipo di cosa che eval è lì per, e si evita il costo folle di generando un sottoprocesso dappertutto, come sembrano suggerire le risposte precedenti. Il tuo esempio:

$ foo='\u25b6' 
$ eval bar=\$\'$foo\' 
$ echo "$bar" 
▶ 
+0

Questo è un fraintendimento di ciò che la sintassi significa in Bash. '$ '...'' è una [stringa in stile C] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) che obbedisce a diverse regole di quotatura rispetto alle stringhe normali, come delineato nelle altre risposte in questa pagina. – tripleee

Problemi correlati