2014-11-21 43 views
1

我有一个问题 “if语句”,而内部读循环\ nBASH:同时读取而不回波+条件=奇怪的行为

实施例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后加入后回声$线:\ 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 
} 

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

+0

因为它打印两次。在第二个例子中改变第87行echo $ line“twice”是一个证明。 – ForColleague 2014-11-21 20:16:00

+0

谢谢,看起来更优雅,会提高效率。 – ForColleague 2014-11-21 20:23:11

+0

你应该评论答案而不是问题(如果你真的喜欢它,可能会赞成并接受) – keyser 2014-11-21 20:23:48

回答

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) 
+0

感谢似乎在while循环之前定义的变量以及在循环结束时由<<<到'done'提供的变量。 – ForColleague 2014-11-21 20:42:41

+0

@ForColleague我的例子工作原样在bash中。如果它不适合你,那么你的shell可能不支持'<('“Process Substitution”或其他什么东西。这里的字符串(如你的答案)也可以工作,但需要将文件内容读入内存这样做的方式你也没有提供任何东西来完成你正在重定向的标准输入读取然后读取 – 2014-11-21 20:49:44

+0

是的,它也可以工作谢谢你我看到的例子不那么优雅。对于我来说,这整个bash行为都是有问题的。 – ForColleague 2014-11-21 21:11:01

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 }