2010-01-21 154 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