답변:
실제로 POSIX에 있습니다 awk
(POSIX 2008 링크, 이전 버전에서도 가능했습니다). 옵션 섹션에 -v
설명되어 있고 다른 방법은 피연산자 섹션에 있습니다.
-v
마지막에 파일 이름으로 과제를 전달하는 것과 전달하는 것에 는 차이가 있습니다.
-v
:응용 프로그램은 대입 인수가 대입 피연산자와 동일한 형식인지 확인해야합니다. 지정된 변수 할당 은 BEGIN 패턴과 관련된 동작을 포함하여 awk 프로그램을 실행하기 전에 발생해야합니다 (있는 경우). 이 옵션을 여러 번 지정할 수 있습니다.
[...] 이러한 각 변수 할당 은 다음 파일을 처리하기 직전에 발생해야합니다 ( 있는 경우). 따라서 첫 번째 파일 인수 이전의 할당은 BEGIN 작업 (있는 경우) 후에 실행되고 마지막 파일 인수 이후의 할당은 END 작업 (있는 경우) 전에 발생합니다. 파일 인수가 없으면 표준 입력을 처리하기 전에 할당을 실행해야합니다.
예:
$ cat input
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
var=two input var=three input var=four
one
two
two
three
three
four
awk
보다 우선 순위를 부여했습니다 ... 이것은 주요한 결과입니다 즉. 에서 모든 파일 이름이 양식을 가지고 경우, 그것은 무시됩니다 및 변수가 설정됩니다 ...이 충돌을 피할 수있는 유일한 방법은 현재 작업 디렉토리에 그 파일 이름을 보장함으로써 것 같다 항상해야한다 접두어 상대 경로 :./var=three
-v
. 이는 구문이 도입 된 이유이기도 합니다. 당신은 생각해야 -v
향후, 할당을 할 수있는 좋은 방법으로 구문.
awk
경우 다음 catch를 사용할 수 있습니다.[ "$myfile" == "${myfile#/}" ] && myfile="./$myfile"
이것은 외부에서 변수를 설정하는 오래된 스타일입니다 awk
. 파일 이름이이면 어떻게되는지 모호 foo=cat
하므로 이후 버전에서는 -v
옵션이 추가되었습니다 . 이전 버전과의 호환성을 위해 작동해야하지만 보장 할 수는 없습니다. 그리고 내가 말했듯이, -v
옵션은 최신 버전이므로 모든 버전 awk
이 지원 하지는 않습니다 .
s answer](http://unix.stackexchange.com/a/34258/9537),
-v` 에서 설명한 바와 같이 인수 할당은 적용 시점이 다릅니다. 또한 -v
POSIX에 있으며 가장 오래된 awk
구현을 제외하고 모두 존재해야합니다 . 사용 ./
또는 제작하는 것은 반드시 파일 이름이 아닌 식별자 문자가 아마 명확하게 할 수있는 가장 신뢰할 수있는 방법입니다 포함되어 있습니다.