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
レスキューモードでLVMを認識させる@RHEL5

以下のコマンドでレスキューモードでLVMのボリュームグループを認識できます。 # …

no image
ドメイン名一覧をドメイン毎にソート(文字列の反転)@bash

Webページのアクセス解析をドメイン毎に集計してみようと思って、IPを抜き出しホ …

no image
デフォルトサーバ証明書の更新 @ CentOS 4

インストール時に自動的にインストールされるApacheのSSLの証明書を更新する …

no image
PostgreSQL 9.0 レプリケーション機能を使ってみる @ RHEL5 x86_64

PostgreSQL 9.0 がリリースされましね。早速目玉機能の一つである、レ …

no image
apt系コマンド

インストールの管理にDebian系ではaptを使いますが、すぐ忘れてしまうのでメ …

no image
ログアウトしてもプロセスを止めないようにする@bash

bash上で何かプログラムを走らせている時に、ログアウトしてもプロセスを動かし続 …

no image
お使いの端末はこのアイテムに対応していません@Android Market

Android Market が最近アップデートされて、見た目ががらりと変わりま …

no image
Portable Ubuntu for Windows

Portable Ubuntu for Windowsなるものがあるらしいです。 …

no image
ポート監視やwatchdogで簡易サーバ監視@CentOS 5

アカウント共有型のレンタルサーバならサーバが落ちても、管理者の方が監視してくれて …

no image
createrepoコマンド@ RHEL5

createrepoコマンドはyumのリポジトリを作成するためのコマンドです。 …