私のスクリプトの目的はfile
。wc
私の端末で実行されるスクリプト:
C=0; cat file | while read line ; do C=$[ $C + 1 ] ; done ; echo $C
私はいつも変数を0
初期化する数字や何かを取得します。C
私の教科書では、各パイプに対してすべての親変数を継承する新しい子プロセスが作成されていますが、子が死んだ場合、父親はまだ以前の値を「見る」とこの動作について説明します。私は同意します。
C=0; cat file
私が理解していないのは、間に1つのパイプしか見えないということですwhile read line ; do C=$[ $C + 1 ] ; done ; echo $C
。それでは、2番目の部分echo
も子によって実行されるようですが、なぜ誤った値が印刷されるのでしょうか。C
同じパイプに属しているので、子が変数を増やして正しい値を印刷してはいけませんか?
答え1
C=0; cat file
私が理解していないのは、間に1つのパイプしか見えないということですwhile read line ; do C=$[ $C + 1 ] ; done ; echo $C
。
いいえ、そう解釈されません。実際には3つの「パイプ」があります。
C=0
cat file | while read line ; do C=$[ $C + 1 ] ; done
echo $C
(もちろん、最初と3番目は縮退した単一命令パイプラインですが、技術的にはまだそうです。の順序1つ以上コマンドは制御演算子「|」で区切られます。)
つまり、最初と最後のセミコロンはパイプを区別します。その間にあるwhile
からdone
while
複合コマンド。
複合コマンドを持たない簡単な例:
$ echo hello | tr a-z x ; echo you | tr a-z y
xxxxx
yyy
hello
ここでは、最初の項目にのみ移動し、tr
2you
番目の項目、つまりセミコロンで区切られたパイプにのみ移動することが簡単にわかりますtr
。
質問私の変数が1つの「読み込み中」ループではローカルですが、一見似ている他のループではローカルではないのはなぜですか?C
ループから更新された値を出力できるように、実行したい操作を実行するためのいくつかのメソッドが含まれています。