嵌套 for 循环 shell 脚本

时间:2021-06-03 11:34:10

标签: bash shell

#!/bin/bash
hostnames='admin node1 node2 node3'
passwords='1234 1235 1236 1237'
for i in $hostnames
do
  for j in $passwords
  do
    sshpass -p $j  ssh-copy-id root@$i -p 22
  done
done

在运行此脚本时,我意识到主机名中的每个元素都使用密码进行了尝试。

如何使主机名中的第一个元素与密码中的第一个元素匹配,然后将第二个元素与第二个元素相匹配,以此类推,而不是将主机名中的每个元素与密码中的每个元素匹配?

还有可能从文件中获取主机名和密码,而不是像我在代码中那样声明它们吗?

1 个答案:

答案 0 :(得分:0)

使用数组,并迭代索引而不是元素。

hostnames=(admin node1 node2 node3)
passwords=(1234 1235 1236 1237)

for i in "${!hostnames[@]}"; do
    sshpass -p "${passwords[i]}" ssh-copy-id root@"${hostnames[i]}" -p 22
done

或者,类似于 Biffen 在评论中的建议:

while read -r host password; do
    sshpass -p "$password" ssh-copy-id root@"$hostname" -p 22
done <<EOF
admin 1234
node1 1235
node2 1236
node3 1237
EOF