다음과 같은 호출에서 수집 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개 범위에서 달라지는 것으로 관찰됐다 . 나는 그것들을 분리하여 VmacN
N이 1에서 5 사이의 값을 가질 수 있는 변수에 저장해야 합니다 .
일부 호스트의 경우 MAC 주소가 하나만 있으므로 하나만 Vmac1
사용할 수 있습니다. 4개의 NIC(및 MAC 주소)가 있는 호스트에는 및 Vmac1
가 있습니다 Vmac2
.Vmac3
Vmac4
이 정보를 효율적으로 표로 작성하려면 사용 가능한 MAC 주소가 더 적은 변수 NA
에도 값을 저장해야 합니다(예: NIC가 1개 있는 컴퓨터의 경우 NIC 가 4개 있는 컴퓨터의 경우 컴퓨터 , 만 가능합니다 ).VmacN
Vmac1
AA:BB:CC:DD
Vmac2
Vmac5
NA
Vmac5
NA
이를 위해 다음과 같은 코드를 만들고 테스트했습니다.
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