如何将文件中的值分配给for循环中的变量

如何将文件中的值分配给for循环中的变量

我有一个文件 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

相关内容