10
initiate () {
read -p "Location(s) to look for .bsp files in? " loc
find $loc -name "*.bsp" | while read
do
    if [ -f "$loc.bz2" ]
    then
        continue
    else
        filcount=$[$filcount+1]
        bzip $loc
    fi
    if [ "$scan" == "1" ]; then bzipint $loc
    fi
    echo $filcount    #Correct counting
    echo $zipcount    #Correct counting
    echo $scacount    #Correct counting
    echo $valid       #Equal to 1
done

echo $filcount    #Reset to 0
echo $zipcount    #Reset to 0
echo $scacount    #Reset to 0
echo $valid       #Still equal to 1
}

bzip2ディレクトリ内のすべての.bspファイルを圧縮するために使用するbashシェルスクリプトを作成しています。このスクリプトには、合計 (ファイル、成功した zip、成功した整合性スキャン) をカウントするための変数がいくつかありますが、問題が発生したようです。

およびfind $loc -name "*.bsp"を与えるファイルがなくなると、をゼロに設定し、および(これらはすべて、 内で変更 (増加) されます (中に呼び出されます) または( 内でも呼び出されます)。while readwhile read$filcount$zipcount$scacountinitiate ()bzip ()initiate ()bzipint ()initiate ()

内部で変数が変更されているか、initiate ()そこからアクセスされる他の関数と関係があるかどうかをテストするために、 echo$validを使用しました。initiate ()$filcount$zipcountinitiate ()initiate ()

興味深いことに、$validinitialize 内の他の変数のように 0 にリセットされません。

読み取りが終了しているときに変数が魔法のようにリセットされる理由を誰か教えてもらえますか?

4

3 に答える 3

11

バッシュを使用する場合

while read
do
    if [ -f "$REPLY.bz2" ]
    then
        continue
    else
        filcount=$[$filcount+1]
        bzip $REPLY
    fi
    if [ "$scan" == "1" ]; then bzipint $REPLY
    fi
    echo $filcount    #Correct counting
    echo $zipcount    #Correct counting
    echo $scacount    #Correct counting
    echo $valid       #Equal to 1
done < <(find $loc -name "*.bsp")
于 2011-09-06T02:45:10.877 に答える
9

私は昨日この問題に遭遇しました。

問題はあなたがやっているということですfind $loc -name "*.bsp" | while read。これにはパイプが含まれるためwhile read、スクリプトの残りの部分と同じbashプロセスでループを実際に実行することはできません。bashは、のstdoutをループfindのstdinに接続できるように、サブプロセスを生成する必要があります。while

これはすべて非常に巧妙ですが、ループ内に設定された変数がループの後に表示されないことを意味します。これは、while私が書いていたループの目的全体を完全に無効にしました。

パイプを使用せずにループに入力をフィードするか、変数を使用せずにループから出力を取得することができます。私は、一時ファイルへの書き込みとループ全体のラップの両方を含む恐ろしい嫌悪感に終わりました$(...)

var="$(producer | while read line; do
    ...
    echo "${something}"
done)"

これにより、ループからエコーされたすべてのものにvarが設定されました。私はおそらくその例の構文を台無しにしました。現時点では、自分が書いたコードが手元にありません。

于 2011-09-05T23:28:02.407 に答える