首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我从数组中删除值时,它会把printf弄乱,因为它是一个空空间,其中包含了数据。

当我从数组中删除值时,它会把printf弄乱,因为它是一个空空间,其中包含了数据。
EN

Unix & Linux用户
提问于 2022-12-23 13:28:54
回答 1查看 38关注 0票数 0

下面的脚本让您将一堆vlans写进数组中,然后我想用它来删除另一段配置,其中一行写着"dhcp窥探“。

代码语言:javascript
复制
$ 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

我现在遇到的问题是格式化。我希望最后一行的输出如下所示:

代码语言:javascript
复制
no ip dhcp snooping vlan 119,999

但我不知道该怎么解决。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-12-23 14:19:39

实际上,oldvlans=("${oldvlans[@]/$del}")并没有从数组中删除任何元素,它只是从现有元素中删除给定的字符串。而且,它也会匹配元素中间给定的字符串,例如,有del=790,就会将1790转换为1

我认为除了构建一个新的数组之外,没有其他更好的方法来过滤数组中的值:

代码语言:javascript
复制
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中也不简单。

您也许可以使用稀疏数组,将活动数据放在键/索引中:

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/729425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档