グローバル変数があります$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"
または同じシェルプロセスで実行されるか、またはzsh
をksh
使用してください。cmd2