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的范围内变化。我必须将它们分开并将它们存储到一个变量中VmacN,其中 N 可以取 1 到 5 之间的值。

对于某些主机来说,只能有一个 MAC 地址,因此它只有一个Vmac1可用。而具有 4 个 NIC(以及 MAC 地址)的主机将具有Vmac1Vmac2和。Vmac3Vmac4

为了有效地表格化这些信息,我还需要将值存储NAVmacN变量中,其中可用的 MAC 地址较少(例如,对于具有 1 个 NIC 的计算机,Vmac1将是AA:BB:CC:DD,而Vmac2通过Vmac5will be NA。而对于具有 4 个 NIC 的计算机,仅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

相关内容