awk의 구문 오류

awk의 구문 오류
#!/usr/bin/awk

userinput='Hello World!'
userinput=$userinput awk '
    BEGIN {
        s = ENVIRON["userinput"] "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'

위의 코드를 실행할 때마다 다음 오류가 발생합니다.

awk: 명령. 1행: pass.awk
awk: cmd. 1행: ^ 구문 오류

#!/usr/bin/awk

awk '{
        s = $0 "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'

awk: 명령. 1행: pass.awk
awk: cmd. 1행: ^ 구문 오류

두 번 모두 같은 오류가 발생했습니다. 하지만 이 코드를 작성하고 터미널에서 실행하면 오류가 발생하지 않습니다. 이것은 나에게 조금 이상합니다. 왜냐면 나는 초보자이기 때문이다 awk. 이것이 오타일 수 있는지 잘 모르겠습니다. pass.awk이 방법으로 파일 이름을 .Run 으로 저장했습니다 awk pass.awk.awk pass.awk hello

답변1

여기에는 두 가지 문제가 있습니다. 우선 스크립트를 작성하려면 파일이 필요하기 때문에 셔뱅에서 사용해야 awk하며 , 이를 사용하는 것은 스크립트의 내용을 그대로 사용할 수 있는 해결 방법입니다 . 바라보다 :-fawkawkman awk

   -f progfile
             Specify  the pathname of the file progfile containing an awk
             program. A pathname of '-' shall denote the standard  input.
             If multiple instances of this option are specified, the con‐
             catenation of the files specified as progfile in  the  order
             specified  shall be the awk program. The awk program can al‐
             ternatively be specified in the command line as a single ar‐
             gument.

따라서 awkShebang에서 통역사로 사용하려면 다음이 필요합니다.

#!/bin/awk -f

BEGIN{print "hello world!"}

당신이 가지고 있는 것은 호출되는 쉘 스크립트 awk이므로 쉘 shebang이 필요합니다.

#!/bin/sh

awk 'BEGIN{ print "Hello world!"}'

다음 문제는 변수에 공백이 있지만 따옴표 없이 변수를 사용하고 있다는 것입니다. 쉘 스크립트에서는 항상 변수를 인용하십시오! 당신이 원하는 것은 다음과 같습니다.

userinput='Hello World!'
userinput="$userinput" awk '...

이제 첫 번째 (셸) 스크립트의 작업 버전은 다음과 같습니다.

#!/bin/sh

userinput='Hello World!'
userinput="$userinput" awk '
    BEGIN {
        s = ENVIRON["userinput"] "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'

스크립트가 절대 종료되지 않는다는 의미 while (1)이며 무한 루프입니다.

실제 awk스크립트인 두 번째 스크립트는 다음과 같습니다.

#!/usr/bin/awk -f

{
  s = $0 "\n"
  n = length(s)
  while (1)
    printf "%s", substr(s,int(1+rand()*n),1)
}

답변2

첫 번째 줄에서 awk 대신 쉘 인터프리터를 호출하도록 합니다.

#!/usr/bin/env bash

답변3

기본적으로 awk는 프로그램 코드를 포함하는 문자열을 명령줄의 첫 번째 인수로 예상합니다. 예를 들어

awk 'BEGIN{ print "hello" }'

만 인쇄됩니다 hello. 그래서 달리면

awk pass.awk

pass.awkawk 코드로 해석하려고 합니다 . dot은 유효한 awk 구문이 아니므로 오류가 발생합니다.

파일에서 코드를 읽으려면 awk -f foo.awk@terdon의 답변에 표시된 대로 를 사용하세요. (해시뱅 라인을 수정하고 그림과 같이 쉘 스텁을 제거해야 합니다.)

관련 정보