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[@]}

出力に 1 行に 1 つの項目を表示するには、次のようにします。

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

ip「-j」サポート(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

(クーバーネティスノードの例)

関連情報