2015-06-15 117 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中借用了這個簡單的函數。但是,由於有一個更便攜的解決方案,我很樂意從現在開始將它用於我的項目。謝謝! –