проходження та встановлення змінних у гередоку


18

У мене є сценарій, який повинен робити багато різних речей на багатьох різних віддалених машинах. Я думав, що гередок буде працювати для цього, але я не в змозі використовувати змінну, визначену в іншому сценарії, та ту, яку визначено в гередоку.

Ось код:

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=$BAR"
EOF

Це друкує лише наступне:

ФОО =

BAR = бар

Якщо я цитую рядок EOF так: ssh some.remote.host << "EOF" він друкує лише наступне:

FOO = foo

БАР =

Будь-які підказки про те, як я можу використовувати обидві змінні всередині heredoc?

Спасибі.

Відповіді:


27

Коротше кажучи, використовуйте:

  • без котирування ключових слів heredoc, наприклад, 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"

1
Це неймовірно! Я витратив віки, намагаючись зрозуміти це. Дуже дякую за це рішення.
trubliphone
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.