通过 SSH 按索引遍历数组

Iterate over array by index over SSH

对于以下代码:

array1=( "Germany" "Vietnam" "Argentina" )
array2=( "Europe" "Asia" "America" )
       
sshpass -p $IPA_PASS ssh -tt -o StrictHostKeyChecking=no $IPA_NAME@$TARGET "sudo su - jboss <<'EOF'
for i in "${!array1[@]}"
do
    echo $i
    echo ${array1[$i]} "is in" ${array2[$i]}
done
EOF
"

我想要输出:

0
Germany is in Europe
1
Vietnam is in Asia
2
Argentia is in America

但我得到:

0
Germany is in Europe
1
Germany is in Europe
2
Germany is in Europe

因此索引打印正确,但通过 SSH 从数组中获取的值始终是第一个元素。这怎么能分别是第一、第二、第三元素呢?

在 EOF 语句中不通过 SSH 传递时,for 循环工作正常,但脚本需要 运行 通过 SSH。

这是一个使用 bash 进行本地测试的工作示例。您可以通过 ssh / sudo 交换两个 bash 命令:

bash -c "bash <<EOF
array1=( \"Germany\" \"Vietnam\" \"Argentina\" )
array2=( \"Europe\" \"Asia\" \"America\" )
for i in \${!array1[@]}
do
echo \$i
echo \${array1[\$i]} is in \${array2[\$i]}
done
EOF
"

您也可能考虑将工作脚本传输到您的远程计算机并在那里执行它以逃避 quoting-madness。

你可以使用declare -p传递两个数组的定义:

array1=( "Germany" "Vietnam" "Argentina" )
array2=( "Europe" "Asia" "America" )

sshpass -p $IPA_PASS ssh -o StrictHostKeyChecking=no $IPA_NAME@$TARGET sudo -u jboss bash\
    < <(declare -p array1 array2; cat <<'EOF'
        for i in "${!array1[@]}"
        do
            echo $i
            echo ${array1[i]} "is in" ${array2[i]}
        done
EOF
        )