在 bash 中创建包含所有网络接口的数组

在 bash 中创建包含所有网络接口的数组

我想在 Bash 中创建一个数组来包含所有活动的网络接口。

我已经设法创建一个 for 循环来打印它们,但是当我尝试创建数组时,它只包含最后一个lo接口,而不包含另一个接口。这是我的代码:

#!/bin/bash

for iface in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF)
do
           printf "$iface%s\n"
           declare -a array_test=["$iface"]
done
for i in "${array_test[@]}"; do echo "$i"; done

这是我的输出:

eno1
eno2
eno3
lo
[lo]

另外,如何从数组中排除 lo localhost 接口?

答案1

这是一个解决方案,分配列表,然后向其中添加项目:

#!/bin/bash

array_test=()
for iface in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF)
do
        printf "$iface\n"
        array_test+=("$iface")
done
echo ${array_test[@]}

如果您希望输出每行显示一项:

for i in "${array_test[@]}"; do echo "$i"; done

要从输出中删除 localhost:

if [ "$iface" != "lo" ] 
then
    array_test+=("$iface")
fi

答案2

我的尝试:

readarray -t interfaces < <(ip l | awk -F ":" '/^[0-9]+:/{dev=$2 ; if ( dev !~ /^ lo$/) {print $2}}')
for i in "${interfaces[@]// /}" ; do echo "$i" ; done

答案3

bash将从您提供的任何空白分隔(空格、制表符、换行符)列表构造一个数组。例如array=(a b c)。我们可以使用命令替换 ( $()) 来生成这样的空白分隔列表。例如:

$ ifaces=( $(ip addr list | awk -F': ' '/^[0-9]/ {print $2}') )

现在打印出我们刚刚创建的数组:

$ declare -p ifaces
declare -a ifaces=([0]="lo" [1]="eth0" [2]="eth1" [3]="br1" [4]="br0" [5]="ppp0")

要排除lo

$ ifaces=( $(ip addr list | awk -F': ' '/^[0-9]/ && $2 != "lo" {print $2}') )
$ declare -p ifaces
declare -a ifaces=([0]="eth0" [1]="eth1" [2]="br1" [3]="br0" [4]="ppp0")

如果您确实想使用ifconfig而不是ip,请尝试以下操作:

ifaces=( $(ifconfig | awk -F':'  '/^[^ ]*: / && $1 != "lo" {print $1}') )

答案4

如果您有“-j”支持ip(json 输出),则使用出色的 jq公用事业;

# ip -j addr show | jq -r .[].ifname
lo
eth0
eth1
tunl0
gre0
gretap0
erspan0
ip_vti0
ip6_vti0
sit0
ip6tnl0
ip6gre0
dummy0
kube-ipvs0
cbr0
vethfbcab624

(来自 kubernetes 节点的示例)

相关内容