ループ内のグローバル変数にリンクしますか? [コピー]

ループ内のグローバル変数にリンクしますか? [コピー]

グローバル変数があります$EMAIL。複数のファイルを繰り返しながら、条件を満たす各ファイルに追加して$EMAILレポートを生成しようとしています。

問題は、$EMAILループ内でオーバーライドすると$EMAILループの繰り返し範囲内でのみ変更されることです。グローバルバージョンは$EMAILまだ空です。

私のプログラムの単純化されたバージョンは次のとおりです。

#!/usr/bin/env bash

EMAIL="I echo without 'nope'"
ls | while read line; do
  if [ 73523 -lt 86400 ]
  then
    echo "Hasn't been backed up in over a day"
    EMAIL="$EMAIL nope"
  fi
done

echo $EMAIL

$EMAILループ内で追加できるようにスクリプトを変更するにはどうすればよいですか?


編集/更新

この例をもっと簡単にしたかったので変更してみました。

ls | while read line; do

到着する:

for i in {1..2}; do

nopeこの変更がに追加されるのは奇妙です$EMAIL。ここで何が間違っているのか、私が誤解したのでしょうか?

ベストアンサー1

存在する:

cmd1 | cmd2

bash子シェルで実行されるため、cmd2変数の変更は親シェルには表示されません。

あなたはできます:

#!/usr/bin/env bash

EMAIL="I echo without 'nope'"
while read line; do
  if [ 73523 -lt 86400 ]
  then
    echo "Hasn't been backed up in over a day"
    EMAIL="$EMAIL nope"
  fi
done < <(ls)

echo "$EMAIL"

または同じシェルプロセスで実行されるか、またはzshksh使用してください。cmd2

おすすめ記事