2011-09-23 168 views
0

這裏是我寫的腳本,但它似乎有問題,而!而假設將K的內容與SDATE進行比較,並且在它們不相等的情況下進入循環!while while循環的問題

for d in \ 
$(sed -nre 's/.*\[(..)\/(...)\/(....):(..:..:..) .*/\1 \2 \3 \4/p' thttpd.log | date +%s -f-); 
do echo $d >s1; done 

time=$(expr 60 \* 60 \* 24 \* 5) 
EDATE=`tail -1 s1` 
SDATE=$[$EDATE - $time] 
time=$(expr 60 \* 60 \* 24 \* 5) 
EDATE=`tail -1 s1` 
SDATE=$[$EDATE - $time] 
k=`tail -1 s1` 
echo $k 
echo $SDATE 
while [$k -ne $SDATE](k and SDATE contain numbers) 
do 
k=`tail -1 s1` 
sed '1d' <s1> tempfile 
mv s1 s1.old 
mv tempfile s1 
echo $K| awk '{print strftime("%d/%m/%Y:%T",$1)}'|tee -a ass 

done 

回答

1

問題是您沒有在[]附近有空格。這導致BASH錯誤地解析該行。

隨着下面的行,BASH將嘗試運行程序[$K,可能不是你想要的。 while [$k -ne $SDATE]

你需要有什麼如下:
while [ $k -ne $SDATE ]

1

嘗試這種情況:

while [[ $k != $SDATE ]] 
+0

仍然有問題! k是1041454521 SDATE是1041022521和錯誤 ./10:線14:[[1041454521:未找到命令 – matarsak

+0

一個支架就足夠了。重要的是[之前]和之後的空間。 [另一種編寫「測試」的方式,例如:while test「$ k」!=「$ DATE」;做... –

+0

嗯。我總是被教導使用兩個括號,因爲'[''保證是內建的,而'['可能是一個外部程序(因此較慢)。還有一些我忘記的微妙之處。 – Thomas

0

啊,shell編程是如此敏感...

k=0 
while [ $k != 4 ]; do echo $k; k=`expr $k + 1`; done 

工程和在不同的行打印0,1,2,3如預期和這基本上看起來像你有空間,換行符和值的來源除外。也許這是一個字符串與值的問題,但我不認爲shell變量有類型。

我會嘗試剝你回來怎麼辦,直到它的工作原理,然後重新添加你想要它做的事。

+0

PS我也注意到了。?在你最後一行的第三行(用awk)時,它是'$ K'而不是'$ k'。Shell變量是區分大小寫的。 – LavaSlider