While 循环从 grep 读取多行

While 循环从 grep 读取多行

我正在 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

答案1

Zoredache 在聊天中向我指出了这一点,poige 在他的回答中也提到了这一点:这个问题可以用子shell 来解决。

当我必须从for每次从 grep 读取单个变量的循环更改while read var1 var2为允许我读取多个变量的循环时,我能够通过使用括号定义显式子 shell 来保留我在 while 循环中操作的临时变量。以下是示例:

sum=0

grep volume configfile | head -n1 | (while read var1 var2; do
  let sum=var1+var2
done

echo "The sum is $sum.")

如果没有括号,则始终会显示总和 0。有了括号,则会显示 grep 的第一个匹配行中前两个值的总和。

此外,正如 Poige 在另一个答案中指出的那样,您可以使用子 shell 来填充范围内的变量,如下所示:

var=$( cat file | while read a b; do
    sum=a+b
    echo "$sum"
done)

echo "$var"

在这种情况下,您在最后回显的 var 的值将是您在循环中计算的最后一个总和,即使 sum 在子 shell 末尾被破坏。

答案2

至少有两种方法 - 返回 Err 代码并检查它,或者包装你的子 shell 代码:

Res=$(cat /etc/hosts | while read h _rest; do
    [ "$h" = 'fe00::0' ] && echo 'Found'
done
)
echo $Res

相关内容