パイプを使ったループの中で使用した変数をループ外で参照できない@bash
2013/07/15
bashでパイプを使って以下のような処理をすると、ループ内の変数の値をループ外で参照できないようです。
#!/bin/bash HOGE="hoge" echo -e "$HOGE" | while read I ; do HOGE="$HOGE $I" echo "$HOGE" done echo "$HOGE"
上記を実行すると結果は以下のようになります。
hoge hoge hoge
原因はパイプを使うと、パイプの先は別プロセスで処理されるためのようです。つまり上記では、呼び出し元の$HOGEに入っている”hoge”は呼び出し先で参照でき、結果は”hoge hoge”になりますが、ループの外、つまり呼び出し元では呼び出し先の処理が反映されないので、”hoge”になります。
なので、対策は面倒ですが一度ファイルに書き出すのがベストな気がします。
#!/bin/bash HOGE="hoge" echo -e "$HOGE" | while read I ; do HOGE="$HOGE $I" echo "$HOGE" > tmp done HOGE=`cat tmp`
336px
関連記事
-
-
KVMのコンソールに接続する@RHEL6 on Fedora14 KVM
KVM上で仮想OSを動かしている場合、コンソールに接続するには、少し設定を変更す …
-
-
Windows アップデートで使用するプロキシを設定@Windows Vista
Windows XPでは、proxycfgコマンドで、Windowsアップデート …
-
-
シェルで逐一時間表示@bash
デバッグを目的に、 逐一コマンド実行時に時間を表示させたい場合があります。 $ …
-
-
OpenStackをインストール中にはまった@Ubuntu 12.04
OpenStack は様々なコンポーネントがあるため、インストールのための支援ツ …
-
-
ファイルサーバへのアクセスが異常に遅い@Windows XP or Vista
Windowsからファイルサーバ上のファイルにアクセスしようとすると、異常に遅い …
-
-
USB3.0 メモリ (Super Talent Express DUO ST3U32EDB)
32GBのUSB3.0 のメモリが安かったので買ってみた。そろそろ東芝のUSB3 …
-
-
Google Play Music で音楽が同期できない@Android 4.0
Google Play Music の Android アプリで、音楽が同期でき …
-
-
VMware Player 3.0 でのネットワーク設定
VMware Player 3.0 にはネットワーク設定の画面がついていないので …
-
-
VMWare Server 2.0のディスクイメージを1.0で使う
VMWare Server 2.0がリリースされて随分たちましたが、2.0系のデ …
-
-
JSPのJSTLとJSFの混在 – Unified EL(Expression Language)
JSFだけでJSPを書いていると、JSPのタグも使いたくなることがあります。今回 …
- PREV
- Sony NW-S746 (S740シリーズ)購入
- NEXT
- MP3のジャケット自動取得と埋め込み