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

私のバッシュコード:

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

私のロジック:

  • リスト内のすべてのサーバーIPにSSHを介して接続し、アクティブなノードを見つけます。リスト内のノードがアクティブになると、そのIPを "activenode"変数に割り当てます。

私ができないことは、アクティブなノードIPが変数に割り当てられると、activenodeファイル内の他のIPがserverList順序に関係なく他の変数に自動的に割り当てられることです。

standbynode=$server2
node1=$server3
node2=$server4
node3=$server5

答え1

まず、awkファイルを必要なく読み取ることができます。cat

$NF次に、3番目のフィールドは最後のフィールドに使用される等号です。

第三に、最も重要なことは、配列を使用するとこれがはるかに簡単になるということです。

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

関連情報