읽기를 사용하여 인터페이스 정보를 얻을 수 없습니다.

읽기를 사용하여 인터페이스 정보를 얻을 수 없습니다.

다음 링크에는 시스템 정보를 가져오는 스크립트가 있습니다.

z3bra의 블로그

구체적으로,

network() {

   read lo int1 int2 <<< `ip link | sed -n 's/^[0-9]: \(.*\):.*$/\1/p'`

   if iwconfig $int1 >/dev/null 2>&1; then
       wifi=$int1
       eth0=$int2

   else
      wifi=$int2
      eth0=$int1

   fi

   ip link show $eth0 | grep 'state UP' >/dev/null && int=$eth0     ||int=$wifi

#int=eth0

    ping -c 1 8.8.8.8 >/dev/null 2>&1 && 
        echo "$int connected" || echo "$int disconnected"
}

방금 실행하면 :

ip link | sed -n 's/^[0-9]: \(.*\):.*$/\1/p'

(예상대로) 인터페이스 목록을 얻습니다.

하지만 내가 실행하면

 read lo int1 int2 <<< `ip link | sed -n 's/^[0-9]: \(.*\):.*$/\1/p'`

나는 아무것도 얻지 못했습니다. $lo, $int1, , 를 확인해 보니 $int2여전히 아무 것도 없었습니다. 읽기가 예상대로 진행되지 않는 것 같습니다.

이 문제를 해결하기 위한 제안이 있는 사람이 있습니까? 나는 그것을 디버깅하는 방법을 실제로 알기에는 읽기에 대해 충분히 알지 못합니다.

답변1

for배열과 함께 -loop를 사용해 보세요 read.

for link in `ip link | sed -n 's/^[0-9]: \(.*\):.*$/\1/p'`
do
    int[${#int[*]}]=$link
done

따라서 쉘이 배열을 지원하지 않으면 다음을 받게 됩니다 ${int[1]}.${int[2]}

i=0
for link in `ip link | sed -n 's/^[0-9]: \(.*\):.*$/\1/p'`
do
    eval int$i=$link
    let i+=1
done

관련 정보