BASH:读取时没有echo + condition =奇怪的行为

时间:2014-11-21 20:12:58

标签: regex bash if-statement while-loop

我有"如果声明"读取循环内部。\ 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
}

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

2 个答案:

答案 0 :(得分:1)

您的问题是,您的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)

答案 1 :(得分:0)

另一个工作示例:

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 }