스크립트를 처리하는 동안 다음 스크립트에 오류가 발생합니다.
file * | awk '{ ${1}=""; print substr(${0},2) }';
다음 두 스크립트는 모두 성공적으로 실행됩니다.
file * | awk '{ $"1"=""; print substr($"0",2) }';
그리고
file * | awk '{ $1=""; print substr($0,2) }';
매개변수 대체 에 관한 모든 것이 아닌가요 $1, ${1}, $"1"
? 내 awk
문법에 문제가 있는 걸까요?
답변1
awk
껍질이 아닙니다. awk
자체 문법, 구문 및 의미가 있습니다. 은 구문상 올바른 코드 ${1}
는 아니지만 와 는 둘 다 입니다 (그리고 에서는 동일합니다 ). 에서는 대체 항목이 아닙니다.awk
$1
$"1"
awk
awk
그 중 은 awk
현재 $1
입력 레코드의 첫 번째 필드를 나타내며 $0
전체 입력 레코드를 나타내며 셸에서는 $1
첫 번째 위치 매개변수(일반적으로 스크립트 또는 함수 명령줄의 첫 번째 매개변수)를 나타내며 $0
일반적으로 현재 쉘 또는 쉘 스크립트의 이름.
쉘 변수와 awk
변수도 완전히 별개입니다. 그렇기 때문에 셸에서 스크립트로 값을 "가져와야" 하는 경우 awk
명령줄 플래그를 사용하여 해당 변수를 설정해야 합니다.-v
awk
$ awk -v var="$var" '{...}'
awk
다음과 같이 스크립트에 쉘 변수 값을 제공 할 수도 있습니다 .
$ awk '{...}' var="$var"
이것은거의-v
변수가 var
모든 블록에서 비어 있다는 점을 제외하면 with 를 사용하는 것과 동일한 작업입니다 BEGIN
. 블록 BEGIN
이 실행됩니다앞으로입력 데이터 보기 및 변수 설정뒤쪽에그러한 블록의 실행.
너도 할 수 있어
$ awk '{...}' var="$value1" file1 var="$value2" file2
이로 인해 변수는 방금 처리된 쉘 변수의 값을 가져온 var
다음 방금 처리된 쉘 변수의 값을 가져옵니다.$value1
file1
$value2
file2
그렇다면문서이전 예의 이름 var="$value1"
( var="42"
예: 완벽하게 유효한 Unix 파일 이름)을 사용하면 파일은 다음과 같습니다.아니요처리됩니다. 또한 명령줄의 쉘 파일 이름 글로빙 패턴이 이름이 변수에 대한 할당처럼 보이는 파일을 선택하면 해당 할당이 스크립트에서 활성화됩니다 awk
.