Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

パイプを使ったループの中で使用した変数をループ外で参照できない@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`

 - IT技術 ,

336px

Message

メールアドレスが公開されることはありません。

  関連記事

no image
KVMのコンソールに接続する@RHEL6 on Fedora14 KVM

KVM上で仮想OSを動かしている場合、コンソールに接続するには、少し設定を変更す …

no image
Windows アップデートで使用するプロキシを設定@Windows Vista

Windows XPでは、proxycfgコマンドで、Windowsアップデート …

no image
シェルで逐一時間表示@bash

デバッグを目的に、 逐一コマンド実行時に時間を表示させたい場合があります。 $ …

no image
OpenStackをインストール中にはまった@Ubuntu 12.04

OpenStack は様々なコンポーネントがあるため、インストールのための支援ツ …

no image
ファイルサーバへのアクセスが異常に遅い@Windows XP or Vista

Windowsからファイルサーバ上のファイルにアクセスしようとすると、異常に遅い …

no image
USB3.0 メモリ (Super Talent Express DUO ST3U32EDB)

32GBのUSB3.0 のメモリが安かったので買ってみた。そろそろ東芝のUSB3 …

no image
Google Play Music で音楽が同期できない@Android 4.0

Google Play Music の Android アプリで、音楽が同期でき …

no image
VMware Player 3.0 でのネットワーク設定

VMware Player 3.0 にはネットワーク設定の画面がついていないので …

no image
VMWare Server 2.0のディスクイメージを1.0で使う

VMWare Server 2.0がリリースされて随分たちましたが、2.0系のデ …

no image
JSPのJSTLとJSFの混在 – Unified EL(Expression Language)

JSFだけでJSPを書いていると、JSPのタグも使いたくなることがあります。今回 …