2015-06-15 153 views
-1
COUNTER=0  
    let COUNTER=COUNTER+1 
    count=`ssh -i /var/www/.ssh/id_rsa_root -o stricthostkeychecking=no $host $cmd` 
    count1=`echo $count | awk '{print $4}'` 
    printf "count1 : $count1\n" 
    result1=${count1/.*} 
    if [ "$result1" -ge "0" ]; then 
      echo $host 
    else 
      echo $host 
      exit 
    fi 

如果$result1值INTEGER和大于零,它会转到IF循环(对我来说工作正常)[:整数表达式预期

但是,当它不是INTEGER,它是未来到别的环路(它是该做的),出现以下错误的输出

line 55: [: : integer expression expected 

,但我不希望在我的输出上面的错误。我试图用2>/dev/null这个,但没有运气。

请帮忙!

+1

检查你的代码http://shellcheck.net – Jahid

+0

另外,如果你使用'sh -x yourscript'来运行它,你会看到正在使用的_actual_值,所以你将能够看到/为什么它不是一个整数。 –

+1

另外,您正在使用'printf'错误。不要替换为格式字符串;而是使用格式字符串来告诉系统如何进行替换:'printf'count1:%s \ n'“$ count1”' –

回答

1

如果你想优雅地处理一个空的结果,检查它明确:

if [ -z "$result1" ]; then 
     : "ignoring empty string" 
elif [ "$result1" -ge 0 ]; then 
     printf '%s\n' "$host" 
else 
     printf '%s\n' "$host" 
     exit 
fi 
+0

感谢Charles,它做了诡计 – Pankaj

0

变化if [ "$result1" -ge "0" ]; then

if ((result1 >= 0)); then 

这句法不会,如果抛result1任何错误,不定义(或空)或碰巧是一个string莫名其妙。

+0

这是更好的语法(当定位bash时),当然,但它真的可以在这里解决问题吗? –

+2

我相信'$ result1'根本就不是一个整数。 –

+0

没有运气,仍然是相同的输出 – Pankaj

1

你也可以检查是否result1是做算术比较前一个有效的整数:

function isNumber() { 
    [[ $1 =~ ^-?[0-9]+$ ]] 
} 

if ! isNumber "$result1"; then 
    echo "not a number" 
elif [ "$result1" -ge "0" ]; then 
    echo "null or positive" 
else 
    echo "negative" 
fi 
+1

您可能会考虑使用符合POSIX的语法。 'isNumber(){case * $ in * [!0-9] *)return 1 ;; '')return 1 ;; *)返回0 ;; ESAC; }'是一个粗略的草案,虽然需要更平滑处理负值。 –

+0

@Charles Duffy:我很久以前从借用stackoverflow中借用了这个简单的函数。但是,由于有一个更便携的解决方案,我很乐意从现在开始将它用于我的项目。谢谢! –