<<EOF
结果变量扩展发生在本地机器上,但您只i
在远程机器上定义了变量。您需要仔细考虑要在哪里进行扩展。您没有在您的问题中解释值i
是定义客户端还是服务器端,但我从您随后的评论中猜测您希望它在服务器端完成。在这种情况下,您需要将数组内容传递给ssh
,这需要仔细引用:
ssh hostname@server <<EOF
i=1
eval `typeset -p array_local`
echo \${array_local[\$i]}
EOF
typeset -p array_local
将输出字符串
declare -a array_local='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'
由于这是在反引号内,它将在EOF
-delimited heredoc 内扩展客户端,然后由eval
. 换句话说,它相当于:
ssh hostname@server <<'EOF'
i=1
declare -a array_local='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'
echo ${array_local[$i]}
EOF
请注意EOF
两个示例之间引用的差异。第一个允许参数和外壳扩展,第二个不允许。这就是为什么echo
第一行需要引用,以确保参数扩展发生在服务器端而不是客户端。