2014-11-21 76 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 }