附加到循环内的全局变量?

附加到循环内的全局变量?

我有一个全局变量$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在子 shell 中运行cmd2,因此更改变量对父 shell 不可见。

你可以做:

#!/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"

或使用zshor ksh,它将cmd2在同一个 shell 进程中运行。

答案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"

相关内容