2016-08-05 3 views
0

Прошло некоторое время с тех пор, как я написал сценарий. Я никогда не был хорош, чтобы начать с ..BASH - Функция возвращает неправильное значение

Я работаю над скриптом, который будет проверять соединение DB оракула.

testDB() { 
    [[ $(tnsping $tnsName | grep -c WRONG)==1 ]] && return 1 
    return 0 
} 

testDB 
status="${?}" 
echo "Status value= " $status 

Ожидается значение 0 из моего эха, но каким-то образом мой статус показывает 1 в моем эхом.

Что я здесь делаю неправильно?

EDIT2:

Мой исходный код был:

testDB() { 
    [[ $(tnsping $tnsName | grep -c OK) -eq 1 ]] && return 1 
    return 0 
} 

мой $ TNSNAME содержит правильное значение и подсчет Grep будет 1, но мои функции возвращает 0.

+0

Вашей интенция с '[[$ (tnsping $ TNSNAME | Grep -c неверного) == 1]] && вернуться 1' не очень ясно. – sjsam

+0

В основном, я надеюсь, что grep -c ОК от tnsping. счет будет равен 1, если tnsping будет успешным. TNSPING не должен содержать какое-либо слово WRONG в результате .. поэтому счет будет 0. – Kyle

+1

@sjsam. Непосредственной проблемой, с которой столкнулся OP, был отсутствие пробелов вокруг знаков равенства, не так ли? Ваше редактирование превращает его в другой вопрос; редактирование кода в вопросах всегда проблематично - проблема остается воспроизводимой после вашего изменения? – tripleee

ответ

4

Переменные не нужны, а не grep -c. Просто используйте grep -q (не выхода), чтобы вернуть истина/ложь флага:

testDB() { 
    tnsping $tnsName | grep -q OK 
    } 

testDB 
echo "Status value= " $? 
+0

Опция '-q' удобна ++ – sjsam

+0

[[$ (tnsping $ tnsName | grep -q WRONG)]] && return 1 | | return 0. Функция все равно возвращает 1/true, даже если она должна быть ложной. – Kyle

+0

'[[' полностью лишний. Вы хотите просто 'testDB' или в longhand' if tnsping '$ tnsName "| grep -q OK; затем бормотать; else dont; fi' – tripleee

0

Ее второй линия &&. Это способ одновременного выполнения нескольких операторов и работает как логическое «и» на многих других языках. Это дает команду сеансу bash выполнять как составную тестовую команду, так и команду return 1 вместе.

Я понимаю, что ваше намерение состоит в том, чтобы возвратить 1, это проверка true else return 0. Если это так, просто напишите так.

testDB() { if [[ $(tnsping $tnsName | grep -c WRONG)==1 ]]; then return 1 else return 0 fi }

Я надеюсь, что помогает.

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