質問: 変数をループ内で変更しループ外でも参照したい 変数をループ内で変更しループ外でも参照したい linuxのシェルを作成している最中にちょっとした壁にぶつかりました。 元々は以下のような感じの処理でした。 (a)------------------ flag=false awk "(nr>=2){print}" ${file} | while read line_str do if [...]; then flag=true fi done -------------------- 状況によってflagの値を変更し、あとの処理で flagの値に応じて異なる処理を行ないます。 で、少し調べたところパイプすると別プロセスになるので云々と あったのでループの前の定義でも中でも「export flag」と 書いてみたのですがダメでした。そういうもんじゃないのかと。 元々は、最初の1行は読み飛ばしたいという要望を持っていたので このような記述だったのですが、少し不本意ですが、 読み込むファイルの1行目も処理対象に含めることにした上で 以下のような記述に変更したところ一応動きました。 (b)------------------ while read line_str do flag=true done < ${file} -------------------- 対処療法として今はこのようなコードにしましたが完全ではありません。 今自分の知識の中で実現可能な方法だと以下のような感じです。 ・フラグファイルを使用する ・1行読み飛ばした一時ファイルを作成しそれを使う ・読み込むファイルの仕様を変更し1行目のヘッダを削除する ・(b)の方法で読み込み、ループ内でカウンタを持ち、最初だけ continueする どれでも一応実現は可能ですが、エレガントではありません。 そこで質問することにしました。 以下のどちらかもしくはそれ以外で私の希望を実現する方法を 教えてください。よろしくお願いします ・パイプを使用したループでループ内で変更した変数の値を取得する方法 ※(シェルの制約で出来ないのであれば、その旨を知りたいです) ・パイプを使用せず、1行読み飛ばす方法 ※そもそも1行読み飛ばす方法で 「awk "(nr>=2){print}" ${file}」 と書いていますが、これは妥当でしょうか? よりよい記述があればあわせて教えてください。 よろしくお願いします。
回答: 単に1行とばすだけなら tail -n +1 ${file} で十分。 if [...]; の判定の部分が別の方法でできるなら(例えば、 grep + 正規表現で判定できる) if ( tail -n +1 ${file} | grep -q '正規表現' ) then flag=true else flag=false fi awk使っているのなら、判定もawkでやってしまうとか if awk ' begin {flag=1} (nr>=2){ if ([....での条件判定相当のもの..]) { flag=0;exit ; } } end { exit flag; } ' ${file} then flag=true else flag=false fi