AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 437484
Accepted
Basil
Basil
Asked: 2012-10-12 12:24:11 +0800 CST2012-10-12 12:24:11 +0800 CST 2012-10-12 12:24:11 +0800 CST

while 循环从 grep 中读取多行

  • 772

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

unix
  • 2 2 个回答
  • 5752 Views

2 个回答

  • Voted
  1. Best Answer
    Basil
    2012-10-13T06:07:57+08:002012-10-13T06:07:57+08:00

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

    当我不得不从一次for从 grep 读取单个变量的循环更改为while read var1 var2允许我读取多个变量的循环时,我能够通过使用括号来保留我在 while 循环中操作的临时变量定义一个明确的子shell。这是一个例子:

    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 的末尾被销毁。

    • 4
  2. poige
    2012-10-12T12:40:31+08:002012-10-12T12:40:31+08:00

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

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

相关问题

  • Windows 有符号链接吗?

  • 控制 UNIX 目录内容用户组所有权

  • 在命令行上从 csv 文件中过滤带有空格字符的字段

  • 如何将 VAR 从子 shell 导出到父 shell?

  • 查找文件大小(以 MB 为单位)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve