我有一个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 没有扩展。
如何使用从父脚本扩展变量的定界文档,并且设置自己的变量?
您可以使用:
count=0
ssh -t -t "$other_host" << ENDSSH
if [[ "${count}" == "0" ]]; then
output="string1"
else
output="string2"
fi
echo "\$output"
exit
ENDSSH
我们使用
\$output
,以便它在远程主机上而不是在本地扩展。
最好不要使用 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"
# 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