heredoc에서 변수 전달 및 설정


18

여러 원격 컴퓨터에서 여러 가지 작업을 수행해야하는 스크립트가 있습니다. heredoc 이이 작업을 수행 할 것이라고 생각했지만 스크립트의 다른 곳에 정의 된 변수 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 내에서 변수를 모두 사용하는 방법에 대한 힌트가 있습니까?

감사.

답변:


27

간단히 말해서 다음을 사용하십시오.

  • 인용되지 않은 heredoc 키워드 (예 : EOF
  • 외부 (예 : 로컬 ) 변수에 대한 일반 달러 문자 (예 :$FOO
  • 내부 (예 : 원격 ) 변수에 대해 이스케이프 처리 된 달러 문자\$BAR

당신은 히어 닥 키워드를두면 (즉 EOF) 그 때문에 히어 닥 몸이 로컬로 처리 한 후 인용 부호로 둘러싸 $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"

1
대단해! 나는 이것을 알아 내려고 여러 해를 보냈다. 이 솔루션에 대해 대단히 감사합니다.
trubliphone
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.