다양한 원격 시스템에서 다양한 작업을 수행해야 하는 스크립트가 있습니다. heredoc이 이 문제를 해결할 것이라고 생각하지만 스크립트의 다른 곳에 정의된 변수를 사용할 수 없습니다.그리고여기에 정의된 것입니다.
다음은 몇 가지 코드입니다.
#!/bin/sh
FOO="foo"
ssh some.remote.host << EOF
BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"
EOF
그러면 다음이 인쇄됩니다.
FOO=
바=바
그러나 EOF 줄을 다음과 같이 인용하면
ssh some.remote.host << "EOF"
다음과 같이 인쇄됩니다.
FOO=부자
바 =
사용방법에 대한 조언이 있으면둘 다Heredoc의 변수?
감사해요.
답변1
즉, 다음을 사용하십시오.
- 따옴표가 없는 구분 기호 키워드(예:
EOF
- 일반 달러 문자밖의(즉현지의) 변수(예:
$FOO
- 탈출하다달러 문자는내부에(즉외딴) 변수(예:
\$BAR
heredoc 키워드(예: EOF
)를 따옴표 없이 그대로 두면 heredoc 본문이 로컬로 처리되므로 $FOO
빈 문자열로 확장됩니다. 그러면 명령은 다음과 같습니다.foo
BAR
ssh
BAR="bar"
echo "FOO=foo"
echo "BAR="
heredoc 키워드를 인용하면 변수 확장이 억제되므로 명령은 ssh
다음과 같습니다.
BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"
원격 쉘 환경에서는 정의되지 않을 수 있으므로 FOO
표현식은 빈 문자열 "FOO=$FOO"
로 평가 "FOO=''"
되거나 FOO
설정됩니다.
두 변수를 모두 사용하려면 로컬로 정의된 변수에 대해 변수 확장이 발생하도록 heredoc 키워드의 인용을 해제한 다음 원격으로 확장하려는 변수를 이스케이프(백슬래시 사용)해야 합니다. 즉, 다음과 같습니다.
#!/bin/sh
FOO="foo"
ssh some.remote.host << EOF
BAR="bar"
echo "FOO=$FOO"
echo "BAR=\$BAR"
EOF
이 경우 ssh 명령(원격 서버에서 수신)은 다음과 같습니다.
BAR="bar"
echo "FOO=foo"
echo "BAR=$BAR"