我正在 AIX 5.3 中编写一个脚本,它将循环遍历 a 的输出df
并根据另一个配置文件检查每个卷。如果该卷出现在配置文件中,它将设置一个标志,稍后在脚本中需要该标志。如果我的配置文件只有一列并且我使用了一个for
循环,那么这将非常有效。但是,我的问题是,如果我使用while read
循环在每行中填充多个变量,则我在while
和之间设置的任何变量done
都将被丢弃。
例如,假设 /netapp/conf/ExcludeFile.conf 的内容是一堆行,每行包含两个字段:
volName="myVolume"
utilization=70
thresholdFlag=0
grep volName /netapp/conf/ExcludeFile.conf | while read vol threshold; do
if [ $utilization -ge $threshold ] ; then
thresholdFlag=1
fi
done
echo "$thresholdFlag"
在此示例中,thresholdFlag 将始终为 0,即使卷出现在文件中并且其利用率大于阈值也是如此。我可以echo "setting thresholdFlag to 1"
在那里添加一个,看到回声,它仍然会在最后回声 0。
有没有一种干净的方法可以做到这一点?我认为我的 while 循环是在一个子 shell 中完成的,我对其中的变量所做的更改实际上是对局部变量进行的,这些局部变量在done
.
Zoredache 在聊天中向我指出了这一点,poige 在他的回答中提到了这一点:这个问题可以用子 shell 解决。
当我不得不从一次
for
从 grep 读取单个变量的循环更改为while read var1 var2
允许我读取多个变量的循环时,我能够通过使用括号来保留我在 while 循环中操作的临时变量定义一个明确的子shell。这是一个例子:如果没有括号,您将始终回显总和为 0。有了它们,您将在 grep 的第一个匹配行中回显前两个值的总和。
此外,正如 Poige 在另一个答案中指出的那样,您可以使用子 shell 来填充范围内的变量,如下所示:
在这种情况下,您在最后回显的 var 的值将是您在循环中计算的最后一个总和,即使 sum 在子 shell 的末尾被销毁。
至少有两种方法——返回 Err 代码并检查它,或者包装你的子 shell 代码: