Bash:文字列を繰り返します。

Bash:文字列を繰り返します。

次の呼び出しで収集された複数のVmacMACアドレスの値を格納する変数があります。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アドレスが1つしかないため、1つしかVmac1使用できません。 4つのNIC(およびMACアドレス)を持つホストにはおよびがVmac1ありますVmac2Vmac3Vmac4

この情報を効率的に表にするには、使用可能なMACアドレスが少ない変数NAにも値を保存する必要があります(たとえば、1台のNICを持つコンピュータの場合は4台のNICを持つコンピュータの場合のみ)。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

のみ印刷する場合は、Vmac1MACアドレス全体(つまり値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

関連情報