1

私はより大きなスクリプトを持っていますが、この小さなスクリプトは問題を示しています:

#!/bin/bash
x=0
if [[ $x == 0 ]]
then
   ls | while read L
   do
     x=5
     echo "this is a file $L and this is now set to five --> $x"
   done
fi
echo "this should NOT be 0 --> $x" 

変数が while ループの外側に設定されている場合、期待どおりに機能します。bash のバージョンは 3.2.25(1)-release (x86_64-redhat-linux-gnu) です。これが明らかなことだとしたら、私はとてもばかげていると感じるでしょう。

4

1 に答える 1

3

5 に設定されているのxはサブシェル (パイプラインの一部であるため) であり、サブシェルで発生したことは親シェルには影響しません。

でプロセス置換を使用すると、サブシェルを回避して、期待した結果を得ることができますbash

#!/bin/bash
x=0
if [[ $x == 0 ]]
then
   while read L
   do
     x=5
     echo "this is a file $L and this is now set to five --> $x"
   done < <(ls)
fi
echo "this should NOT be 0 --> $x"

現在、whileループはメイン シェル プロセスの一部であるため (lsサブプロセスにあるのは のみ)、変数xが影響を受けます。

ls別の時間の出力を解析するメリットについて議論できます。それは主に質問の問題に付随しています。

別のオプションは次のとおりです。

#!/bin/bash
x=0
if [[ $x == 0 ]]
then
   ls | 
   {
   while read L
   do
     x=5
     echo "this is a file $L and this is now set to five --> $x"
   done
   echo "this should NOT be 0 --> $x"
   }
fi
echo "this should be 0 still, though --> $x"
于 2013-08-28T14:54:40.850 に答える