下面的脚本让您将一堆vlans写进数组中,然后我想用它来删除另一段配置,其中一行写着"dhcp窥探“。
$ 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但我不知道该怎么解决。
发布于 2022-12-23 14:19:39
实际上,oldvlans=("${oldvlans[@]/$del}")并没有从数组中删除任何元素,它只是从现有元素中删除给定的字符串。而且,它也会匹配元素中间给定的字符串,例如,有del=790,就会将1790转换为1。
我认为除了构建一个新的数组之外,没有其他更好的方法来过滤数组中的值:
a=(111 222 333)
b=()
for x in "${a[@]}"; do
if [[ "$x" != 222 ]]; then
b+=("$x")
fi
done
printf "<%s> " "${b[@]}"; echo
# prints <111> <333>当然,如果您有一个要删除的值列表,那么至少需要一个测试来查看数组中是否存在某个元素,这在Bash中也不简单。
您也许可以使用稀疏数组,将活动数据放在键/索引中:
declare -a vlans=()
# fill the array (from a string here)
while read v; do
vlans+=(["$v"]=1)
done <<< (您也可以使用关联数组,但键将以未定的顺序出现。)做这样的事情可能会更好地用其他编程语言,IMO。111\n790\n1790\n'
# remove these two
for r in 790 999; do
unset "vlans[$r]"
done
printf "<%s> " "${!vlans[@]}"; echo
# prints <1790> <111> (您也可以使用关联数组,但键将以未定的顺序出现。)
做这样的事情可能会更好地用其他编程语言,IMO。
https://unix.stackexchange.com/questions/729425
复制相似问题