【问题标题】:BASH: while read without echo + condition = strange behaviorBASH:读取时没有回显+条件=奇怪的行为
【发布时间】:2015-01-20 01:55:09
【问题描述】:

我在 while read 循环中遇到了“if 语句”的问题。\n

示例 1:

81 function processconfig2()
82 {
83     pattern='^monthly'
84     while read line
85     do
86         if [[ $line =~ $pattern ]]; then
87             echo $line
88         fi
89     done < /etc/logrotate.conf | awk '/^\/var\/log\/wtmp/, /^}/'
90     
91     exit 0
92 }

输出为空。\n 在第 89 行后添加 echo $line:\n

81 function processconfig2()  
82 {
83     pattern='^monthly'
84     while read line
85     do
86         if [[ $line =~ $pattern ]]; then
87             echo $line
88         fi
89         echo $line
90     done < /etc/logrotate.conf | awk '/^\/var\/log\/wtmp/, /^}/'
91  
92     exit 0
93 }

我得到了正确的输出(第 86 行的条件已正确处理):

/var/log/wtmp {
monthly
monthly
create 0664 root utmp
minsize 1M
rotate 1
}

请有人向我解释一下这种奇怪的行为。

【问题讨论】:

  • 因为它要打印两次。在第二个示例中更改第 87 行 echo $line"twice" 是一个证明。
  • 谢谢,看起来更优雅,会提高效率。
  • 你应该评论答案而不是问题(如果你真的喜欢它,可能会赞成并接受)

标签: regex bash if-statement while-loop


【解决方案1】:

另一个工作示例:

81 function processconfig2()
82 {
83     pattern='^monthly'
84     content=`awk '/^\/var\/log\/wtmp/, /^}/' /etc/logrotate.conf`
85     while read line 
86     do  
87         if [[ $line =~ $pattern ]]; then
88             echo $line"twice"
89         fi
90     done <<< "$content"
91     
92     exit 0
93 } 

【讨论】:

    【解决方案2】:

    您的问题是您的awk 过滤器位于读取循环的输出 上。因此,当您不回显整个文件时,您的输出不足以让 awk 匹配,因此它会丢弃所有输出。

    尝试不使用awk 过滤器以了解我的意思。

    或者将 awk 过滤器移动到 读取循环之前(我想这就是我的想法)。

    pattern='^monthly'
    while read line
    do
        if [[ $line =~ $pattern ]]; then
            echo $line
        fi
    done < <(awk '/^\/var\/log\/wtmp/, /^}/' /etc/logrotate.conf)
    

    【讨论】:

    • Thanks 似乎可以使用在 while 循环之前定义并由
    • @ForColleague 我的示例在 bash 中按原样工作。如果它对您不起作用,那么您的 shell 可能不支持 &lt;("Process Substitution" 或其他东西。这里的字符串(如您的答案)也可以工作,但需要以这种方式不将文件内容读入内存。此外,您没有向 done 提供任何内容,您正在重定向 read 然后从中读取的标准输入。
    • 是的,它也可以。谢谢。如您所见,我的示例不太优雅。 P.S 对我来说,这整个 bash 行为是不公平的。
    • @ForColleague 你觉得这怎么办?进程替换?这里的字符串?您最初的问题不是 bash 问题。
    猜你喜欢
    • 1970-01-01
    • 2013-05-10
    • 2019-02-05
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多