2013-08-20 10 views
6

voglio usare awk nel mio bashscript, e questa linea chiaramente non funziona:fuga simbolo del dollaro in bashscript (che utilizza awk)

line="foo bar" 
echo $line | awk '{print $1}' 

Come Escape $1, in modo da non ottiene sostituito con il primo argomento della sceneggiatura?

+8

Non sarà sostituito. Sarà la prima parola in '" $ line "' – user000001

+1

Lo scopo delle citazioni singole attorno al programma "awk'" "è assicurarsi che bash non tenti di eseguire alcuna espansione dei parametri, quindi lo script funzionerà come previsto. –

+1

@CostiCiudatu la parola è espansione – SheetJS

risposta

8

Lo script (con singole virgolette lo script awk) funzionerà come previsto:

$ cat script-single 
#!/bin/bash 
line="foo bar" 
echo $line | awk '{print $1}' 

$ ./script-single test 
foo 

Di seguito, invece, sarà pausa (lo script darà una riga vuota):

$ cat script-double 
#!/bin/bash 
line="foo bar" 
echo $line | awk "{print $1}" 

$ ./script-double test 
​ 

Notare le doppie virgolette sul programma awk.

Perché le virgolette doppie espandere la variabile $1, il comando awk otterrà lo script {print test}, che stampa il contenuto della variabile awk test (che è vuoto). Ecco uno script che dimostra che:

$ cat script-var 
#!/bin/bash 
line="foo bar" 
echo $line | awk -v test=baz "{print $1}" 

$ ./script-var test 
baz 

lettura correlati: Bash Reference Manual - Quoting e Shell Expansions

+1

+1 per * capire * l'apprensione nella domanda. – devnull

+0

@cmbuckley come sfuggire al simbolo del dollaro quando è all'interno: ''{print" $ line, "$ 1}" ' – tachomi

4

Come attualmente scritta, il $ 1 non sarà sostituito (dal momento che è all'interno della stringa tra apici singoli, bash non analizzarlo)

Se si scrive awk "{print $1}", bash si espanderà la $1 all'interno della stringa doppio citato

noti che le norme di espansione variabili dipendono l esterno evita di quotare, quindi il $1 in "awk '{print $1}'" sarà espanso

Problemi correlati