Bash関数内の変数生成の動作

Bash関数内の変数生成の動作

外部スクリプトを強化するために、以下の関数を使用しています。主な目的は、ifconfigおよびpingテスト出力から一部のデータを返すことです。追加の「パイピング」を実行し、他の情報と再接続するために、変数を使用して同じ関数で設定しようとしています。しかし、私はこのような行動をとります。基本的に私がやりたいことは次のとおりです。

    > for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f 3 | cut -d: -f2) ; do ping -c1 $i | grep packet | a=`echo $i-$(cut -d,
    -f3)` | echo $a; done  
4  
4  
4  
4

ご覧のとおり、各反復は数字4を返します。

変数属性のみを削除すると、最初に変数「a」が設定されていると予想される出力が得られます。

> for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f 3 | cut -d: -f2) ; do ping -c1 $i | grep packet | echo $i-$(cut -d, -f3); done
10.0.2.15- 0% packet loss
192.168.0.2- 0% packet loss
10.0.2.100- 0% packet loss
127.0.0.1- 0% packet loss
  • 最初の関数コードの実行で数字4が出力されるのはなぜですか?
  • 同じ関数内で変数を設定し、パイプの後に再エコーする方法は?それは可能ですか?

ありがとうございます!

答え1

 for i in $(...) ; do ... | a=`...` | echo $a; done

最初の関数コードの実行で数字4が出力されるのはなぜですか?

なぜなら、 とa=`...`echo $a異なるサブシェル/サブプロセスで実行されるからです。すべてのシェルから印刷a=1; a=3 | echo $aされます。1子シェルから親シェルに変数を渡すことはできません。

同じ関数内で変数を設定し、パイプの後に再エコーする方法は?それは可能ですか?

カント。パイプの前にデフォルトのスクリプトで設定しない限り。

答え2

再構成されたパイプラインの最後の部分を使用すると、必要なものが得られるsedと思います。スクリプトは標準入力全体を一致させ、それをsed出力(標準入力の)の3番目のフィールドが次の値に置き換えます。例えば、$i-ping

$ for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f3 | cut -d: -f2); do \
    ping -c1 $i | grep packet | cut -d, -f3 | sed "s/\(.*\)/$i - \\1/"; \
done
123.145.167.189 -  0% packet loss
127.0.0.1 -  0% packet loss

関連情報