Bash: 문자열을 반복합니다.

Bash: 문자열을 반복합니다.

다음과 같은 호출에서 수집 Vmac된 여러 MAC 주소의 값을 저장하는 변수가 있습니다 .wmic

Vmac=`wmic --delimiter="," --authentication-file=/path/to/file //IP-ADDR "Select AdapterType,MACAddress from Win32_NetworkAdapter" | grep "Ethernet" | awk -F, '{print $3}'| sort | uniq | tr '\n' ' '`

Vmac변수에 포함되는 값의 개수는 호스트마다 1~5개 범위에서 달라지는 것으로 관찰됐다 . 나는 그것들을 분리하여 VmacNN이 1에서 5 사이의 값을 가질 수 있는 변수에 저장해야 합니다 .

일부 호스트의 경우 MAC 주소가 하나만 있으므로 하나만 Vmac1사용할 수 있습니다. 4개의 NIC(및 MAC 주소)가 있는 호스트에는 및 Vmac1가 있습니다 Vmac2.Vmac3Vmac4

이 정보를 효율적으로 표로 작성하려면 사용 가능한 MAC 주소가 더 적은 변수 NA에도 값을 저장해야 합니다(예: NIC가 1개 있는 컴퓨터의 경우 NIC 가 4개 있는 컴퓨터의 경우 컴퓨터 , 만 가능합니다 ).VmacNVmac1AA:BB:CC:DDVmac2Vmac5NAVmac5NA

이를 위해 다음과 같은 코드를 만들고 테스트했습니다.

if [ ! -z "$Vmac" ]
then
        i=1
       for mac in $Vmac
        do
             declare "Vmac${i}"="$mac"
                ((i++))
        done
fi
printf "${Vmac1:-NA}"",""${Vmac2:-NA}"",""${Vmac3:-NA}"

산출:

3C:40:20:52:41:53 88:51:FB:3F:0D:81 C8:CB:B8:CC:5F:D2,NA,NA

만 인쇄하는 경우 Vmac1전체 MAC 주소(즉, 값 Vmac)가 인쇄됩니다.

제 생각에는 반복하는 동안 실수를 한 것 같습니다 Vmac.

문자열 값을 보유하는 변수를 반복하는 방법은 무엇입니까?

답변1

그냥 배열을 사용하세요. 예를 들어:

## read the MACs into an array
declare -a Vmac=( $(wmic --delimiter="," --authentication-file=/path/to/file \
            //IP-ADDR "Select AdapterType,MACAddress from Win32_NetworkAdapter" | 
             grep "Ethernet" | awk -F, '{print $3}'| sort | uniq | tr '\n' ' ' )

## Add NAs as appropriate
for((i=0;i<6;i++)); do 
    [ -z "${Vmac[i]}" ] && Vmac[i]="NA" 
done

표시하려면:

#!/bin/bash
declare -a vmac=( $(echo 3C:40:20:52:41:53 88:51:FB:3F:0D:81 C8:CB:B8:CC:5F:D2))
for((i=0;i<6;i++)); do 
    [ -z "${vmac[i]}" ] && vmac[i]="NA" 
done
echo "${vmac[@]}"

산출:

3C:40:20:52:41:53 88:51:FB:3F:0D:81 C8:CB:B8:CC:5F:D2 NA NA NA

관련 정보