동일한 명령의 각 출력을 다른 변수에 저장

동일한 명령의 각 출력을 다른 변수에 저장
#!/bin/bash

SERVERLABEL=( 11011-22022 33033-44044-10101 55055-10001-20002 )

    for vmlabel in "${SERVERLABEL[@]}"
    do 
        linode-cli linodes list | grep $vmlabel | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
    done

위는 내 스크립트입니다. 내가 원하는 것은 각 가상 머신의 ipv4를 다른 환경 변수에 저장하는 것입니다.

ipv4_11011-22022
ipv4_33033-44044-10101
ipv4_55055-10001-20002

저는 bash 스크립팅이 처음입니다. 누구든지 도와주실 수 있나요?

답변1

사용연관 배열:

#!/bin/bash

SERVERLABEL=( 11011-22022 33033-44044-10101 55055-10001-20002 )

declare -A ips # declare an associative array explicitly 

for vmlabel in "${SERVERLABEL[@]}"
do 
    ips[ipv4_$vmlabel]=$(
        linode-cli linodes list |
            grep -F -- "$vmlabel" |
            grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
    )
done

이것을 줄일 수 있습니다하지정규식

linode-cli linodes list |
    grep -F -- "$vmlabel" |
    perl -MRegexp::Common -lne 'print for /$RE{net}{IPv4}/g'

더 읽기 쉽고 유지 관리하기가 더 쉽습니다. 그렇지 않습니까?

또는 자체적으로 수행할 수 있는 grep작업 을 건너뛰는 경우도 있습니다.perl

linode-cli linodes list |
    perl -MRegexp::Common -lnse '
        if (/\Q$vmlabel\E/) {
            print for /$RE{net}{IPv4}/g
        }' -- -vmlabel="$vmlabel"

perl한 단계 더 나아가서 모든 작업을 (또는 해당 문제에 대한 적절한 프로그래밍 언어)로 수행 bash하면 .하나의전화 linode-cli해서 더욱 안정적이고 효율적으로 만드세요.

획득한 데이터 표시

printf '%s\n' "${!ips[@]}"                     # keys
printf '%s\n' "${ips[@]}"                      # values
printf '%s\n' "${ips[ipv4_55055-10001-20002]}" # display only one key/value pair

grepor 는 perl부분 문자열과 일치하므로 $vmlabela 는 예를 들어 다음을 포함하는 모든 줄 grep -F -- 11011-22022과 일치합니다 . 이를 방지하기 위해 옵션을 추가할 수도 있습니다 .11011-22022211011-220221-wgrep

관련 정보