次の呼び出しで収集された複数の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アドレスが1つしかないため、1つしかVmac1
使用できません。 4つのNIC(およびMACアドレス)を持つホストにはおよびがVmac1
ありますVmac2
。Vmac3
Vmac4
この情報を効率的に表にするには、使用可能なMACアドレスが少ない変数NA
にも値を保存する必要があります(たとえば、1台のNICを持つコンピュータの場合は4台のNICを持つコンピュータの場合のみ)。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