다른 스크립트를 작성하는 스크립트를 작성하는 코드가 있습니다.
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 }'