0

这就是我想要做的......

#!/bin/bash

array_local=(1 2 3 4 5)

ssh user@server << EOF
index_remote=1
echo \$index_remote
echo \${array_local[\$index_remote]}  
EOF

当我尝试运行上述脚本时,我得到的 O/P 为 1 和一个空值(空格)。我希望 ${array_local[$index_remote} 值为 2 而不是 null,我需要使用远程变量访问这个本地数组,以便在脚本中进一步工作。

4

1 回答 1

0

<<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第一行需要引用,以确保参数扩展发生在服务器端而不是客户端。

于 2013-10-28T16:34:35.143 回答