【问题标题】:Analyze a piece of code分析一段代码
【发布时间】:2014-01-25 08:24:45
【问题描述】:

我正在分析以下代码。而且我听不懂这行:

while read processinfo

processinfo 是什么?我可以使用任何名称而不是 processinfo 还是在某个地方定义了 processinfo?在读取邮件地址时使用“邮件地址”也是如此。请帮忙。

#!/bin/bash

serverlist=/home/path/serverlist.txt
emaillistfile=/home/path/emaillist

    cat $serverlist |  while read processinfo
      do

           processNameCount=`ps -ef | grep "$processinfo" | grep -v grep | head -1 | awk '{print $2}'|wc -l`

           if [[ $processNameCount -eq "0" ]]
             then
               cat $maillistfile | while read mailaddress
                 do
                   mailx -s "$processName  not running - `date`" $mailaddress 
                 done
           fi
    done

【问题讨论】:

  • processinfo 是他们正在使用的一个变量,它包含来自$serverlist 的每次一行。

标签: bash unix properties while-loop


【解决方案1】:

processinfo 是一个由代码命名的变量。但是,这个循环的开头真的应该重写:

  while IFS=, read processName processLog foo; do
    processNameCount=...
    ... 
  done < $serverlist

毫无疑问,应该进行其他更改,但是 UUOC 和使用 read 来获取随后用 echocut 解析的整行是一个不可忽视的讽刺。

【讨论】:

  • 另外,processNameCount 分配既尴尬又低效。它真正做的只是相当于pidof "$processName" | wc -w
【解决方案2】:

该行从文件$serverlist 读取输入并将每一行存储在名为processinfo 的变量中

【讨论】:

    【解决方案3】:

    processinfo 是一个变量,用于存储$serverlist 的所有行(包括空行),这意味着只是将文件内容保存在缓冲区中。它在迭代期间一次存储一行,并执行到您从文件中读取的最后一行。然后你在进一步的操作中使用相同的。这个processinfo 不能在您的while 构造中修改。

    【讨论】:

      【解决方案4】:

      这个结构:

      cat file | while read varname; do <code>; done
      

      表示“对于文件file中的每一行,执行&lt;code&gt;$varname的值等于该行的内容”。

      read 是一个 bash 公告,它从标准输入读取单行并将其拆分为字段。在这种情况下,标准输入由命令cat提供,并且只有一个字段,因此整行分配给processinfo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 2019-07-23
        • 2015-07-30
        • 1970-01-01
        • 2012-10-27
        • 2011-08-14
        • 2011-05-04
        相关资源
        最近更新 更多