![如何将文件中的值分配给for循环中的变量](https://linux22.com/image/193384/%E5%A6%82%E4%BD%95%E5%B0%86%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%80%BC%E5%88%86%E9%85%8D%E7%BB%99for%E5%BE%AA%E7%8E%AF%E4%B8%AD%E7%9A%84%E5%8F%98%E9%87%8F.png)
我有一个文件 IP 文件,其中包含:
$cat serverList
server 1 = 192.168.1.1
server 2 = 192.168.1.2
server 3 = 192.168.1.3
server 4 = 192.168.1.4
server 5 = 192.168.1.5
我的 Bash 代码:
serverList="/home/user1/nic-test/server-list"
for i in $(cat $serverList | awk '{print $3}'); do
s1=`ssh user1@$i /etc/sysconfig/ha/getactive.sh`
if [[ $s1 == "NodeType: Active" ]]
then
activenode=$i
standbynode=$server2
node1=$server3
node2=$server4
node3=$server5
fi
done
我的逻辑:
- ssh 到列表中的所有服务器 IP 并找出活动节点。如果列表中的任何节点将处于活动状态,则将该 IP 分配给变量“activenode”
我无法做的是:一旦将活动节点 IP 分配给变量activenode
,我希望该文件中的其他 IPserverList
自动分配给其他变量(以任何顺序):
standbynode=$server2
node1=$server3
node2=$server4
node3=$server5
答案1
首先,awk
可以读取文件,不需要cat
其次,第三个字段是等号,用于$NF
最后一个字段
第三,也是最重要的,使用数组将使这变得更加容易:
mapfile -t servers < <(awk '{print $NF}' serverlist)
declare -p servers
输出
declare -a servers=([0]="192.168.1.1" [1]="192.168.1.2" [2]="192.168.1.3" [3]="192.168.1.4" [4]="192.168.1.5")
然后,为了实现你的目标,我会这样做:
#!/usr/bin/env bash
mapfile -t servers < <(awk '{print $NF}' serverlist)
for idx in "${!servers[@]}"; do
server=${servers[idx]}
s1=$(ssh user1@"$server" /etc/sysconfig/ha/getactive.sh)
if [[ $s1 == "NodeType: Active" ]]; then
activenode=$server
((standbyIdx = (idx + 1) % ${#servers[@]}))
standbynode=${servers[standbyIdx]}
unset 'servers[idx]' 'servers[standbyIdx]'
othernodes=( "${servers[@]}" )
break
fi
done
if [[ -z $activenode ]]; then
echo "No active nodes!"
exit 1
fi
declare -p activenode standbynode othernodes