下面的脚本让你将一堆 vlan 写入一个数组,然后我想用它来删除另一条关于“dhcp snooping”行的配置
$ cat nm
#!/bin/bash
echo "enter old vlans"
while read line
do
oldvlans=("${oldvlans[@]}" $line)
done
delete=790
for del in ${delete[@]}
do
oldvlans=("${oldvlans[@]/$del}")
done
printf -v joinedoldvlans '%s,' "${oldvlans[@]}"
echo "no ip dhcp snooping vlan ${joinedoldvlans%,}"
$ ./nm
enter old vlans
119
790
999
no ip dhcp snooping vlan 119,,999
我现在的问题是格式。我希望最后一行的输出看起来像这样:
no ip dhcp snooping vlan 119,999
但我不确定如何解决它。
好吧,
oldvlans=("${oldvlans[@]/$del}")
实际上并没有从数组中删除任何元素,它只是从现有元素中删除给定的字符串。此外,它也会从元素的中间匹配给定的字符串,例如,有del=790
, 会1790
变成 just1
。我认为除了构建一个新值之外,没有更好的方法从数组中过滤值:
当然,如果您有一个要删除的值列表,您至少需要进行测试以查看某个元素是否存在于数组中,而这在 Bash 中也不简单。
您也许可以改用稀疏数组,将活动数据放在键/索引中:
(您也可以使用关联数组,但键会以不确定的顺序出现。)
做这样的事情在其他一些编程语言 IMO 中可能会做得更好。