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둘째, 세 번째 필드는 마지막 필드 에 사용되는 등호입니다.

셋째, 가장 중요한 것은 배열을 사용하면 이 작업이 훨씬 쉬워진다는 것입니다.

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

관련 정보