2014-01-29 38 views
0

「ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l「是1 當最後的6個文件在文件名中的特定位置上有相同的值時,我怎樣才能把這個放到if/else語句中以便進一步檢查?如何正確地將「ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l」放入if語句

我已經試過這

if [ $(ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l) ==1 ] 
then 
zabbix_sender -z zabcol-pp.domain.com -s dvs.backup -k frameoffset -o "OK" 
else 
zabbix_sender -z zabcol-pp.domain.com -s dvs.backup -k frameoffset -o "Failed" 
fi 

但是,這並不工作,所以後來嘗試了通過解析值到offset.txt文件,但後來檢查,如果值相等,其工作不簡化流程完美無瑕的,在一段時間不是6,但在過去5個文件進行解析和第六每一次爲一個空行,這不等於讓我得到一個「失敗」狀態,而它實際上不是....

ls -tr | tail -n -6 | cut -c16-17 > ../offset.txt 
if [ $(sort -u ../offset.txt | wc -l) == 1 ] 
then 
zabbix_sender -z zabcol-pp.domain.com -s dvs.backup -k frameoffset -o "OK" 
else 
zabbix_sender -z zabcol-pp.domain.com -s dvs.backup -k frameoffset -o "Failed" 
fi 

除了我認爲這是一個不那麼優雅的方法,所以我想要獲得管道版本UT將它放到一個臨時工作,但無法弄清楚如何做到這一點...

非常感謝您提前...

+1

我想也許調查awk/Perl等等,因爲上面的方法會產生* 5 *個獨立的進程! –

回答

3

使用時只需將平等-eq

if [ $(ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l) -eq 1 ] 
+1

+1你像往常一樣超快:) – anubhava

+0

你確實超快... :-)謝謝! – user3156970

+0

嘿嘿,這是一件小事:) – fedorqui

1

同意@Brian Agnew的評論,爲減少管道提供額外幫助。

if [ $(ls -t |awk 'NR<=6{a[substr($0,16,2)]}END{print length(a)}') -eq 1 ] 
0

雖然你有說,使用-eq一個答案,它沒有解釋爲什麼需要,即使你應該使用-eq,你不一定需要

從你的第一嘗試:

if [ $(ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l) ==1 ] 

這是錯誤的主要是==1。這個位置的=字符對shell沒有特別的意義,它將把==1作爲一個單詞。你需要確保有一個空間,像這樣:

if [ $(ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l) == 1 ] 

可能是錯的,但不一定是錯的第二件事,就是==是特定的幾個炮彈。在這些外殼中,它相當於100%標準和便攜式=測試。

if [ $(ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l) = 1 ] 

的第三件事,可能是錯的,但不一定是錯的,是=是一個字符串比較,而-eq是數值比較。您可以將wc的輸出視爲一個字符串,並將其與字符串「1」進行比較,當且僅當wc看到單行時,您仍然可以獲得匹配結果。但是,如果有任何可能性,即兩個字符串會有所不同,但代表相同的數值,例如1/01/ 1,那麼你真的需要的數值比較-eq

if [ $(ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l) -eq 1 ]