bash - 嵌套 for 循环 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
在运行此脚本时,我意识到主机名中的每个元素都使用密码进行了尝试。
如何使主机名中的第一个元素与密码中的第一个元素匹配,然后将第二个元素与第二个元素匹配,依此类推,而不是将主机名中的每个元素与密码中的每个元素匹配?
是否可以从文件中获取主机名和密码,而不是像我在代码中那样声明它们?
解决方案
使用数组,并迭代索引而不是元素。
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
推荐阅读
- mqtt - 如何使用 IP 配置 mosquitto 代理
- reactjs - Django + React中的用户登录
- cypress - 尝试在 cypress 中上传文件时出错
- rust - 由于需求冲突,无法推断出合适的寿命
- python - 遍历 df 的行并检查行中的任何值是否具有“列表”类型
- javascript - 使用 api 在反应中返回一个嵌套对象,该对象位于数组中
- c# - C# - 传入
- java - 如何在 Android 中设置 ProgressBar 的启用/禁用状态?
- java - mysql jdbc驱动中的通信链路故障
- python - 如何在 Python 中使用 JWK 解码 JWT 令牌