グローバル変数があります$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
答え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"
- 解析されない
ls
- ALL_CAPS_VAR_NAMES を使用しないでください。
- いつもあなたを引用
"$variables"
- Bashの変数に追加
+=