我有一个全局变量$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"
或使用zsh
or 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"
- 不解析
ls
- 不要使用 ALL_CAPS_VAR_NAMES
- 总是引用你的
"$variables"
- 在 bash 中,附加到变量
+=