如何在heredoc部分中设置和扩展变量

时间:2017-03-29 18:43:40

标签: bash sh heredoc

我有一个需要从主脚本中调用现有变量的heredoc,设置自己的变量以便稍后使用。像这样:

count=0

ssh $other_host <<ENDSSH
  if [[ "${count}" == "0" ]]; then
    output="string1"
  else
    output="string2"
  fi
  echo output
ENDSSH

这不起作用,因为&#39;输出&#39;没有设置任何东西。

我尝试使用此问题的解决方案:

count=0

ssh $other_host << \ENDSSH
  if [[ "${count}" == "0" ]]; then
    output="string1"
  else
    output="string2"
  fi
  echo output
ENDSSH

它也没有用。 $ output设置为&#34; string2&#34;因为$ count没有扩展。

如何使用从父脚本扩展变量的heredoc,设置自己的变量?

3 个答案:

答案 0 :(得分:3)

您可以使用:

count=0

ssh -t -t "$other_host" << ENDSSH
  if [[ "${count}" == "0" ]]; then
    output="string1"
  else
    output="string2"
  fi
  echo "\$output"
  exit
ENDSSH

我们使用\$output使其在远程主机上展开,而不是在本地扩展。

答案 1 :(得分:1)

better not to use stdin(例如使用here-docs)将命令传递给IntTree

如果使用命令行参数来传递shell命令,则可以更好地分离本地扩展的内容和远程执行的内容:

MyTree

答案 2 :(得分:0)

你可以像@anubhava所说的那样转义变量,或者,如果转换得到太多的变量,你可以分两步完成:

# prepare the part which should not be expanded
# note the quoted 'EOF'
read -r -d '' commands <<'EOF'
if [[ "$count" == "0" ]]; then
    echo "$count - $HOME"
else
    echo "$count - $PATH"
fi
EOF

localcount=1
#use the unquoted ENDSSH
ssh me@nox.local <<ENDSSH
count=$localcount # count=1
#here will be inserted the above prepared commands
$commands 
ENDSSH

将打印如下内容:

1 - /usr/bin:/bin:/usr/sbin:/sbin