2014-04-23 55 views
0

當談到shell腳本,我是一個新手。我究竟做錯了什麼?試圖從shell腳本中的命令測試零長度輸出

我想grep一個正在運行的日誌文件,並採取行動,如果grep返回數據。

# grep for "success" in the log which will tell us if we were successful 
tail -f file.log | grep success > named_pipe & 

# send signal to my server to do something 
/bin/kill -10 $PID 

timeout=0; 
while : ; do 
    OUTPUT=$(cat < named_pipe) 
    if test [-n] $OUTPUT 
     then 
      echo "output is '" $OUTPUT "'" 
      echo_success 
     break; 
    else 
     timeout=$((timeout+1)) 
     sleep 1 
     if [ $timeout -ge $SHUTDOWN_TIMEOUT ]; then 
      echo_failure 
      break 
     fi 
    fi 
done 

我發現,即使 「成功」 是不是在日誌中,測試[-n] $ OUTPUT返回true。這是因爲顯然OUTPUT等於「」。爲什麼輸出一個空格而不是空的?

我該如何解決這個問題?

回答

2

下面是你的問題更小的測試案例:

output="" 
if test [-n] $output 
then 
    echo "Why does this happen?" 
fi 

這是因爲當$output爲空或空白,它擴展到什麼,你只要運行test [-n]

test foofoo非空時爲true。不要緊,你的foo是一個方括號中的標誌。

正確的方式做到這一點是沒有括號,並與報價:

if test -n "$output" 
then 
    ... 
fi 

至於爲什麼$OUTPUT是一個單一的空間,這是簡單的:它不是。 echo只是寫出它的參數分隔爲空格,並且您指定了多個參數。正確的代碼是echo "output is '$OUTPUT'"

+0

謝謝。顯然,這個腳本有很多問題。不幸的是,即使有了改進,我顯然仍然沒有成功地寫入和讀取這個管道。我可以打開另一個終端,並在運行時成功執行「tail -f file.log | grep success」。但在我的腳本中,'如果test -n「$ OUTPUT」'從不返回true。 – vmayer

+0

哦,我剛剛意識到有一個「mkfifo named_pipe」,我相信我應該打電話... – vmayer

+0

我意識到我在這裏有一個額外的問題。基本上,named_pipe從未被刷新,因爲只有少量的數據被插入。所以,我決定改變一些東西去尾隨整個日誌文件,然後管道,然後從管道grep「成功」。由於某種原因,我還有更好的運氣管道進入臨時文件,而不是使用命名管道。 – vmayer