구분된 문서에서 변수 전달 및 설정

구분된 문서에서 변수 전달 및 설정

다양한 원격 시스템에서 다양한 작업을 수행해야 하는 스크립트가 있습니다. 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빈 문자열로 확장됩니다. 그러면 명령은 다음과 같습니다.fooBARssh

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"

관련 정보