Короче говоря, используйте:
- ключевые слова 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"