awk
각 함수 인수에 대해 do 루프를 사용하여 실행하려는 bash 스크립트에 구현이 있습니다 . 각 인수는 여러 줄의 문자열로 구성됩니다.
for arg in "$@"; do
done
<<< "$@"
이는 모든 함수 매개변수를 전달하기 위한 awk 구현입니다 .
내가 원하는 것은 arg
모든 매개변수를 동일하게 전달하는 대신 각 매개변수를 개별적으로 사용하는 것입니다 "$@"
.
awk '
BEGIN {
kl=0
kmd="tput sgr0"
rst = ( (kmd | getline outp) > 0 ? outp : "<" "sgr0" ">" )
close(kmd)
ka = "Wht 15 Grn 34 Blu 39 Ylw 11 Red 196 Amb 214"
kb = "Cyn 51 Mgn 201 Syp 39 Code 39"
ks = sprintf("%s %s", ka, kb)
n = split(ks, kaggr) # split makes kaggr start at index 1
for ( i=1; i<n; i+=2 ) {
knam = kaggr[i] ":"
knum = kaggr[i+1]
kmd=sprintf("%s%d\n", "tput bold; tput setaf ", knum)
tseq[knam] = ( (kmd | getline outp) > 0 ? outp : "<" knam ">" )
close(kmd)
}
}
## Detect keyword in index of array tseq, tseq[indx].
($1 in tseq) { kl=1 ; ctp=$1 ; next }
/Rst:/ { kl=0 ; next } # Reset colour rendition
kl { print tseq[ctp] $0 rst } # Print with specified colour
!kl { print } # Use terminal text colour
' <<< "$@"
이전 작업에서는 파이프라인에 루프가 있을 때 변수가 사라지는 문제가 있었습니다. 자세한 내용은 [https://mywiki.wooledge.org/BashFAQ/024][1]을 참조하세요.
변수가 사라지는 문제는 awk의 파이핑에 실제로 중요하지 않다고 생각합니다.
답변1
루프가 루프 변수로 사용되고 있는 것 같습니다 . 해당 변수를 사용하여 해당 변수의 내용을 코드로 리디렉션 arg
할 수 있어야 합니다 .<<<"$arg"
awk
for arg do
awk '...as in the question...' <<<"$arg"
done
또는 더 많은 입력을 하고 싶고 주위에 큰따옴표를 추가하는 것을 기억한다면 $@
,
for arg in "$@"; do
awk '...as in the question...' <<<"$arg"
done
다음을 사용하여 표준 입력으로 데이터를 전달할 수도 있습니다 printf
. 이렇게 하면 루프가 POSIX와 호환됩니다( <<<
여기서는 문자열 리디렉션이 표준이 아닙니다).
for arg do
printf '%s\n' "$arg" | awk '...as in the question...'
done
이러한 모든 루프 변형은 여러 줄인지 여부에 관계없이 awk
list 의 각 목록 요소에 대해 코드를 한 번 실행합니다 ."$@"
awk
문제는 코드 입력 관리에 있기 때문에 실제로 귀하의 코드를 보지 않았습니다 .