2010-08-20 5 views
3

다음 코드에서는 쉘 varibale을 awk에 전달하려고합니다. 그러나 그것을 a.sh foo_bar로 실행하려고하면 "foo is not declared"가 출력되고 a.sh bar_bar로 실행하면 "foo is declared"라는 출력이 출력됩니다. awk에 버그가 있습니까? 아니면 여기서 뭔가 잘못하고 있습니까?awk에서 쉘 변수를 잘못 해석했습니다.

gawk-3.0.3을 사용하고 있습니다.

#!/bin/awk 

model=$1 

awk ' { 

     match("'$model'", /foo/) 
     ismodel=substr("'$model'", RSTART, RLENGTH) 
     if ( ismodel != foo) { 
     print " foo is not declared" 
     } else { 
     print " foo is declared" 
     } 
    } 
    ' dummy 

더미는 하나의 빈 줄이있는 파일입니다.

감사합니다, 쉘에서 변수에 전달하는

답변

1

이것은 버그는 아니지만 코드에 오류가 있습니다. 문제가있는 줄은 다음과 같습니다

다음 foo
if ( ismodel != foo) { 

"foo"을해야합니다. 지금 당신은 빈 변수와 비교하고 있습니다. 이는 성냥이있을 때 거짓을주고, 성냥이 없을 때를 거짓으로 만듭니다. 따라서 문제는 쉘 변수를 사용하는 방식이 아닙니다.

다른 답변자가 말한대로 awk에 인수를 전달하는 기본 방법은 -v 스위치를 사용하는 것입니다. 이것은 awk 스크립트를 별도의 파일에 저장하려고 할 때도 작동하며 모든 종류의 인용 문제를 방지합니다.

더미 파일의 사용법에 대해서도 확신하지 못합니다. 이것은 단지 예를위한 것입니까? 그렇지 않으면 파일을 생략하고 모든 코드를 BEGIN {} 블록에 넣어야합니다.

+0

감사합니다. 네가 말했던 것처럼 효과가있다. –

0

사용 -v 옵션

awk -v model="$1" '{ 
    match(model, /foo/) 
    ..... 
} 
' dummy 
2
당신은 인용 복잡한 대신에 AWK의 변수 통과를 사용해야합니다

:

awk -v awkvar=$shellvar 'BEGIN {print awkvar}' 

는 스크립트가 작성된 쉘 스크립트이지만 AWK 스크립트가 있습니다. 이 번호를 #!/bin/sh으로 변경할 수 있습니다.

+0

여기에 코드를 붙여 넣는 동안 내 실수 (#!/bin/awk 것). 변수를 -v 옵션을 사용하여 전달하면 문제가 해결 될 수 있습니다. 그러나 awk가 반대 방향으로 비교를 확인하는 이유는 동일합니다. 그리고 -v가 쉘 변수를 전달하는 유일한 옵션이면, awk는 항상 "foo가 선언되지 않았습니다".right를 출력해야합니다. –

관련 문제