각 매개변수에 대한 awk 명령

각 매개변수에 대한 awk 명령

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

이러한 모든 루프 변형은 여러 줄인지 여부에 관계없이 awklist 의 각 목록 요소에 대해 코드를 한 번 실행합니다 ."$@"

awk문제는 코드 입력 관리에 있기 때문에 실제로 귀하의 코드를 보지 않았습니다 .

관련 정보