如何在定界文档部分中设置和扩展变量

问题描述 投票:0回答:3

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

count=0

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

这不起作用,因为“输出”没有设置为任何内容。

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

count=0

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

也没有用。 $output 被设置为“string2”,因为 $count 没有扩展。

如何使用从父脚本扩展变量的定界文档,并且设置自己的变量?

bash sh heredoc
3个回答
4
投票

您可以使用:

count=0

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

我们使用

\$output
,以便它在远程主机上而不是在本地扩展。


3
投票

最好不要使用 stdin(例如使用此处文档)将命令传递给 ssh

如果您使用

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

# Use a *literal* here-doc to read the script into a *variable*, $script. # Note how the script references parameter $1 instead of local variable $count. read -d '' -r script <<'EOF' [[ $1 == '0' ]] && output='zero' || output='nonzero' echo "$output" EOF # The variable whose value to pass as an argument. # With value 0, the script will echo 'zero', otherwise 'nonzero'. count=0 # Use `set -- '$<local-var>'...;` to pass the local variables as # positional arguments, followed by the script code. ssh localhost "set -- '$count'; $script"
    

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 [email protected] <<ENDSSH count=$localcount # count=1 #here will be inserted the above prepared commands $commands ENDSSH

将打印类似以下内容:

1 - /usr/bin:/bin:/usr/sbin:/sbin
    
© www.soinside.com 2019 - 2024. All rights reserved.