2015-06-15 3 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

благодарит Чарльза, он сделал трюк – 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 $ 1 in * [! 0-9] *) return 1 ;; '') return 1 ;; *) return 0 ;; ESAC; } '- черновик, хотя для обработки отрицательных значений требуется немного более сглаживание. –

+0

@Charles Duffy: Я долгое время занимал эту простую функцию из stackoverflow. Но, поскольку есть более портативное решение, я с радостью буду использовать его в своих проектах с этого момента. благодаря! –

Смежные вопросы