![Bash:循环遍历字符串](https://linux22.com/image/5041/Bash%EF%BC%9A%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我有一个变量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
为了有效地表格化这些信息,我还需要将值存储NA
在VmacN
变量中,其中可用的 MAC 地址较少(例如,对于具有 1 个 NIC 的计算机,Vmac1
将是AA:BB:CC:DD
,而Vmac2
通过Vmac5
will 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