2013-08-20 10 views
6

Ich möchte in meinem bashscript awk verwenden, und diese Linie funktioniert offenbar nicht:Flucht Dollarzeichen in bashscript (die awk verwendet)

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

Wie entkommen ich $1, so dass es nicht bekommt ersetzt durch das erste Argument des Skripts?

+8

Es wird nicht ersetzt werden. Es wird das erste Wort in '" $ line "' – user000001

+1

Der eigentliche Zweck dieser einfachen Anführungszeichen um das 'awk'" Programm "ist, sicherzustellen, dass bash nicht versucht, irgendeine Parametererweiterung durchzuführen, also wird Ihr Skript als funktionieren erwartet. –

+1

@CostiCiudatu das Wort ist Erweiterung – SheetJS

Antwort

8

Ihr Skript (mit einfachen Anführungszeichen um den awk-Skript) wird wie erwartet:

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

$ ./script-single test 
foo 

Die folgende jedoch wird Pause (das Skript gibt eine leere Zeile):

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

$ ./script-double test 
​ 

Beachten Sie die Anführungszeichen um das awk Programm.

Da die doppelten Anführungszeichen die $1 Variable erweitern, wird der awk Befehl bekommt das Skript {print test}, die den Inhalt des awk-Variable druckt test (die leer ist). Hier ist ein Skript, das zeigt, dass:

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

$ ./script-var test 
baz 

Related reading: Bash Reference Manual - Quoting und Shell Expansions

+1

+1 für * die * Befürchtung in der Frage. – devnull

+0

@cmbuckley wie man dem Dollarzeichen ausweicht, wenn es innen ist: ''{print $ line," $ 1}' ' – tachomi

4

Wie zur Zeit geschrieben, der $ 1 nicht ersetzt werden (da es innerhalb von Strings in einfachen Anführungszeichen, bash wird es nicht analysieren)

Wenn Sie awk "{print $1}" schreiben, bash die $1 innerhalb des Strings in doppelten Anführungszeichen

Hinweis erweitern, dass die variablen Erweiterungsregeln hängen von der äußersten l Evel der Notierung, so wird die $1 in "awk '{print $1}'" erweitert werden