如何在shell脚本中使用远程服务器上的远程变量数组?

时间:2013-10-28 16:14:52

标签: shell ssh variable-expansion

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

#!/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,我需要使用远程变量访问此本地数组,以便我在脚本中进一步工作..

1 个答案:

答案 0 :(得分: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 - 分隔的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引用的区别。第一个允许参数和shell扩展,第二个不允许。这就是为什么第一个中的echo行需要引用,以确保参数扩展在服务器端而不是客户端发生。