- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:変数をループ内で変更しループ外でも参照したい)
変数をループ内で変更しループ外でも参照したい
このQ&Aのポイント
- 変数をループ内で変更し、ループ外でも参照したい場合について質問します。Linuxのシェルスクリプトでループ内で変数の値を変更してもループ外でその変更が反映されない問題にぶつかりました。パイプを使用したループでは変数のスコープが異なる為、変更した値をループ外で参照することができませんでした。
- 現在の回避策として、フラグファイルを使用する方法や一時ファイルを作成して行をスキップする方法を検討していますが、これらの方法はエレガントではありません。そこで、パイプを使用したループ内で変更した変数の値をループ外で参照する方法や、1行をスキップする方法が他にあるのかを質問したいと思います。
- また、現在使用している方法として、`awk "(NR>=2){print}" ${FILE}`という方法で1行をスキップしていますが、もっと適切な方法があれば教えていただきたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
単に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
お礼
# 単に1行とばすだけなら # tail -n +1 ${FILE} # で十分。 tailでできるんですね。 「tail -n +2 ${FILE}」で実現できました。 ありがとうございました。 # if […]; の判定の部分が別の方法でできるなら サンプルでは記述していないのですが実はループ内で、 他にも処理をしています。また、この部分は2重ループの中身です。 記述しているループ部分では 行をスペース区切りで分解し、1番目のフィールドに記述されている 正規表現に該当した場合には、2番目のフィールドの文字列を 外側のループの対象の文字列の後ろに付加し標準出力する、 という処理を行なっています。 やや複雑で説明が面倒なのと、伝わりにくそうだったので 問題となっている部分だけをピックアップして質問しました。 隠された全体が多く説明不足な質問ですみません。 awkは複数行にわたるようなスクリプトはあまり書きたくない と(なんとなく)思っていました。でも、awkのほうが (はるかに)適しているように感じました。 awkで記述する方向でも考えてみます。 参考になりました。ありがとうございました。