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
Cygwin で Ctrl-C が効かない

Cygwin 上でCtrl-Cが効かないという話がネット上に転がっていて、最近の …

no image
アイソレーションレベル

データベースはあまり詳しくないので、メモ書き。 SQL-92の仕様では、アイソレ …

no image
sendip

ネットワークのテストをしたいとき、任意のパケットを送出したい場合があります。Wi …

no image
IPv6試してみました @ RHEL5

自分自身は表す(ipv4では127.0.0.1) 方法は、 ::1 だそうです。 …

no image
Portable Ubuntu for Windows

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

no image
携帯動画変換君がqt3gppflatten.exeでエラー

なぜか最近携帯用の着うたを携帯動画変換君で3gpに変換しようとすると、qt3gp …

no image
cygwin@Windows 7 64bit

Windows 7 64bit にcygwin 1.7を入れてみました。 結果、 …

no image
Windowsの管理機能を集約@Windows 7

Windows 7でフォルダ名に特殊名をつけると、コントロールパネルのよう、いや …

no image
表示言語を英語に変更@Windows 7 Ultimate RC

通常日本でPCを購入すると、日本語版のWindowsが付属してきます。 しかし、 …

no image
異なるポート間でポートフォワーディング@NEC Aterm のルーター

NEC Aterm系のルーターは、ポートマッピングという機能があります。 通常の …