매개변수가 여러 번 확장되는 것을 방지

매개변수가 여러 번 확장되는 것을 방지

다른 스크립트를 작성하는 스크립트를 작성하는 코드가 있습니다.

    cat > step1.sh <<-EOF  
        *other commands*  
            cat > step2.sh <<-EOF4 
                if [ -f PM.log ]; then
                    awk '/testphrase/{ f=1;r=""; next }f && /testphrase2/{f=0}f{ r=(r=="")? $0: r RS $0 }END{ print r }' PM.log > tmp1.log
                    checkfree=($(cat tmp1.log))
                    wait 
                    sed -i '$ d' tmp${mold}.log
                    wait
                fi
        EOF4
        qsub step2.sh
EOF
qsub step1.sh

5행과 6행($(cat tmp1.log))에서 "$0"을 사용하여 매개변수 확장을 방지하려고 합니다. $ 앞에 "\"를 사용하면 매개변수 확장이 한 번 방지된다는 것을 알고 있습니다.

\$0 

그런데 이 스크립트는 다른 스크립트로 작성한 것이기 때문에 이중, 삼중 확장을 방지하기 위해 각 스크립트를 작성하면서 어떻게 해야 할지 모르겠습니다.

또한 파일 끝 표시를 편집할 수 있다는 것도 알고 있지만 파일의 다른 매개변수(8행의 Mold 등)를 확장하고 싶기 때문에 그렇게 할 수도 없습니다.

이러한 특정 용어가 매번 확장되는 것을 어떻게 막을 수 있나요?

답변1

줄 끝 표시를 인용하면 이 작업이 수행됩니다. 첫 번째 줄에 다음을 인용하세요.

cat > run1.sh <<-"EOF"

답변2

다음 예제 스크립트를 고려하십시오(모든 들여쓰기는 리터럴 탭입니다).

#!/bin/sh

var='hello'

cat >script1.sh <<-END_SCRIPT1
        #!/bin/sh
        echo 'This is script1 ($var)'
        printf '\$0 is "%s"\n' "\$0"

        cat >script2.sh <<END_SCRIPT2
                #!/bin/sh
                echo 'This is script2 ($var)'
                printf '\\\$0 is "%s"\n' "\\\$0"
        END_SCRIPT2
END_SCRIPT1

외부 here-document에서는 문서를 작성하는 스크립트 가 확장되지 않도록 $in 을 이스케이프 처리해야 합니다."$0""\$0"

내부 here-document를 작성할 수 있으려면 외부 here-document가 작성되고 있는지 확인해야 합니다 "\$0". 백슬래시를 이스케이프해야 \\문자열이 "\\\$0".

위의 스크립트는 script1.sh다음과 같이 작성되었습니다.

#!/bin/sh
echo 'This is script2 (hello)'
printf '\$0 is "%s"\n' "\$0"
END_SCRIPT2
printf '$0 is "%s"\n' "$0"

이 출력 실행

This is script1 (hello)
$0 is "script1.sh"

...그리고 script2.sh생성:

#!/bin/sh
echo 'This is script2 (hello)'
printf '$0 is "%s"\n' "$0"

<<END_SCRIPT2생성되는 대신 내부 here-document가 사용된다는 점에 유의하세요 <<-END_SCRIPT2. 외부 여기 문서를 생성할 때 모든 선행 탭이 소진됩니다( 보기에서 분명함 script1.sh).


wait그런데, 백그라운드 프로세스가 실행되고 있지 않은 것 같으므로 코드에서 두 번 호출할 필요가 없습니다 .

조건이 유지되지 않기 때문에 코드 awk도 잘못되었습니다 . 일치하는 항목이 f && /testphrase2/있으면 then 이 실행되어 코드가 다음 입력 줄로 계속 진행됩니다. 일치하지 않으면 일치 하지 않습니다. /testphrase/next/testphrase//testphrase2/

다음을 시도해 볼 수 있습니다.

awk '!f && /testphrase/  { f = 1; r = "" }
     f  && /testphrase2/ { f = 0 }
     f                   { r = (r == "" ? $0 : r RS $0) }
     END                 { print r }'

관련 정보