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

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

グローバル変数があります$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

答え2

@cuonglmがあなたの質問に対する答えを提供します。しかし、あなたの質問解析中の出力ですls。以下を行う必要があります。

email="..."
for file in *; do
    t=$(calculate_last_backup "$file")
    if some_condition_with "$t"; then
        email+="some text"
    fi
done
do_something_with "$email"

関連情報