Bash 스크립트에서 2개의 변수를 반복합니다.

Bash 스크립트에서 2개의 변수를 반복합니다.

API를 사용하려고 합니다. 2개의 변수를 대체하거나 활용하려면 일종의 "for 루프"를 수행해야 합니다.

가짜로...

# Declare New Servers
newserver=(
box001
box002
box003
box004
box005
)


# Declare hostnames
newhostname=(
box001.domain.com
box002.domain.com
box003.domain.com
box004.domain.com
box005.domain.com
)

NEWSERVER 및 NEWHOSTNAME을 교체해야 합니다.

http://server/api/duplicateobject.htm?id=2928&name=NEWSERVER&host=NEWHOSTNAME&targetid=3120

그래서 그것은 다음과 같습니다

http://server/api/duplicateobject.htm?id=2928&name=box001&host=box001.zcloud.com&targetid=3120

나열된 모든 호스트를 반복하는 데 필요합니다.

답변1

표준은 잘 정의되어 있지 않지만 여기에는 다음과 같은 것이 있습니다.할 것입니다 :

hosts=(
box001:box001.domain.com
box002:box002.domain.com
box003:box003.domain.com
box004:box004.domain.com
box005:box005.domain.com
)

uri="http://server/api/duplicateobject.htm?id=2928&name=NEWSERVER&host=NEWHOSTNAME&targetid=3120"

for host in "${hosts[@]}"; do
    IFS=":" names=( $host )
    hosturi="${uri/NEWSERVER/${names[0]}}"
    hosturi="${hosturi/NEWHOSTNAME/${names[1]}}"
    echo "$hosturi"
done

산출:

http://server/api/duplicateobject.htm?id=2928&name=box001&host=box001.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box002&host=box002.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box003&host=box003.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box004&host=box004.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box005&host=box005.domain.com&targetid=3120

이점:

  • 어떤 서버 이름이 어떤 FQDN에 해당하는지 명확하게 확인하세요.
  • 순수한 bash이며 외부 항목을 사용하지 않습니다.

.

서버 이름이 항상 FQDN의 첫 번째 부분인 경우 배열이 더 간단해질 수 있으며 bash가 FQDN에서 서버 이름을 계산하도록 할 수 있습니다.

답변2

두 배열의 길이가 같고 각 배열의 동일한 인덱스에 액세스할 수 있기를 원하는 경우 다음 예를 참조하세요.

for ((i=0; i < ${#newserver[@]}; i++)); do 
  echo ${newserver[i]} ${newhostname[i]};
done;

답변3

위 배열 합계:

url="http://server/api/duplicateobject.htm?id=2928&name=NEWSERVER&host=NEWHOSTNAME&targetid=3120"
for ((i=0; i < ${#newserver[@]}; i++));
do
   echo $url | sed 's/NEWSERVER/'${newserver[i]}'/;s/NEWHOSTNAME/'${newhostname[i]}'/'
done

다음으로 이어진다:

http://server/api/duplicateobject.htm?id=2928&name=box001&host=box001.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box002&host=box002.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box003&host=box003.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box004&host=box004.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box005&host=box005.domain.com&targetid=3120

답변4

다음을 사용하는 경우 bash연관 배열을 사용할 수 있습니다 .

declare -A servers
servers=(
    [box001]=box001.domain.com
    [box002]=box002.domain.com
    [box003]=box003.domain.com
    [box004]=box004.domain.com
    [box005]=box005.domain.com
)

for server in "${!servers[@]}" ; do
    hostname="${servers[$server]}"
    # do something with $server and $hostname
done

서버가 반복되는 순서는 정의되지 않습니다. 위의 예에서 내 호스트 컴퓨터의 bash 버전에서 순서는 box001, box003, box002, box005 및 box004입니다. YMMV.

관련 정보