2010-01-21 107 views
0

請幫我找到問題if語句錯誤的bash

t1=$(sort -k 2,2 f.txt|head -1|cut -d" " -f3) 
while read x 
do 
t2=$(echo $x|cut -d" " -f2) 
if [ $t2 -ge $t1 ] ; then 
    p=$(echo $x|cut -d" " -f1) 
    echo -n $p " " 
fi 
done <f.txt 

f.txt
F1 13
摹13
H 0
我geeting以下錯誤

-sbash: [: 13: unary operator expected 
-sbash: [: 13: unary operator expected 


沒有H 0行它正常工作

回答

1

「一元運算符預期」是當您僅使用一個操作數使用二元運算符時的錯誤。

這意味着t2或t1爲空。爲了使空變量不會消失,使用默認符號${VARIABLE:-DEFAULT}給他們一個默認值:

if [ ${t2:-0} -ge ${t1:-0} ]; then 
0

我想你想

t1=$(sort -k 2,2 f.txt|head -1|cut -d" " -f2) 

,而不是

t1=$(sort -k 2,2 f.txt|head -1|cut -d" " -f3) 

f.txt有隻有兩個字段,所以cut命令沒有任何結果,然後您將其傳遞給[ ]

關於爲什麼它沒有H 0行,我懷疑你的F

F 1 13 

,而不是

F1 13 

(這一切都只是猜測。)

1

你正在使用bash,所以使用bash的內部。不需要調用外部剪切等,當你使用[]

set -- $(sort -k 2,2 f.txt|head -1) 
t1=$3 
while read f1 f2 f3 
do 
t2="$f2" 
if [ "$t2" -ge "$t1" ] ; then 
    p=$f1 
    echo -n $p " " 
fi 
done <f.txt 
+0

什麼?如果你已經在測試語句之前引用了變量,那麼不需要再次引用它,我甚至認爲這是不好的禮節。 – Anders 2010-01-21 00:42:36

+0

@Anders:'v1 =「」; [「$ v1」=''] && echo「match」'vs v1 =「」; [$ v1 =''] && echo「由於錯誤而未打印」'vs'v1 =「」; [[$ v1 =='']] && echo「不需要引號」 – 2010-01-21 01:43:41