모든 활성 네트워크 인터페이스를 포함하는 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
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
(쿠버네티스 노드의 예)