外部スクリプトを強化するために、以下の関数を使用しています。主な目的は、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