2013-08-20 5 views
6

내가 내 bashscript에서 AWK를 사용하려면,이 라인이 명확하게 작동하지 않습니다 : 그것은하지 않도록탈출 달러 기호

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

가 어떻게, $1을 탈출 할 스크립트의 첫 번째 인수로 대체 되었습니까? 합니다 (awk 스크립트 주위에 작은 따옴표 포함)

+8

에서 $1는 확장 될 것입니다. ''$ line "'의 첫번째 단어가 될 것입니다. – user000001

+1

'awk'"프로그램 "을 둘러싼 작은 따옴표의 목적은 bash가 매개 변수 확장을 시도하지 않으므로 스크립트가 다음과 같이 작동한다는 것입니다. 예상했다. –

+1

@CostiCiudatu 단어 확장입니다 – SheetJS

답변

8

스크립트가 예상대로 작동합니다

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

$ ./script-single test 
foo 

다음을하지만, 것이다 휴식 (스크립트를 출력 빈 줄) :

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

$ ./script-double test 
​ 

awk 프로그램 주위에 큰 따옴표가 표시되어 있습니다.

따옴표가 $1 변수를 확장하기 때문에, awk 명령은 (비어있는)이 AWK 변수 test의 내용을 인쇄 스크립트 {print test}을 얻을 것이다. 여기에 표시하는 스크립트입니다 그 :

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

$ ./script-var test 
baz 

관련 독서 : Bash Reference Manual - QuotingShell Expansions

+1

+1에 대한 질문에 * 걱정 *. – devnull

+0

@cmbuckley 달러 기호가 안에있을 때 달러 기호를 벗어나는 방법 :''{print "$ line,"$ 1} "' – tachomi

4

로서 현재 기록은 $ 1 교체되지 않습니다 (이 단일 인용 문자열 내에서 이후, bash는 그것을 구문 분석하지 않습니다)

당신이 awk "{print $1}" 작성하는 경우, bash는 변수 확장 규칙이 바깥 쪽 리터에 의존한다는 이중 인용 된 문자열 내에서

주를 $1을 확장합니다 따옴표를 붙이십시오, 따라서