読み取りを使用してインターフェイス情報を取得することはできません。

読み取りを使用してインターフェイス情報を取得することはできません。

次のリンクには、システム情報を取得するスクリプトがあります。

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

おすすめ記事