If и вызывающей функции, если используется bash
Я написал функцию:
check_log(){
if [ -f "/usr/apps/appcheck.log" ]
then
return 1
else
return 0
fi
}
Затем я вызываю эту функцию в условии "если":
if [ check_log ];
then
........statements....
fi
Будет ли это работать? Я смущен здесь, потому что Баш возвращает 0 в случае успеха и 1 в случае неудачи, но моя функция возвращает 1
и условие проверки на 1
/0
, он получает 1
, и она должна давать сбои, но в моем сценарии оболочки состояние проходит.
Кто-нибудь может пролить свет на этот вопрос?
Ответы
Ответ 1
if [ check_log ];
При использовании квадратных скобок вы вызываете команду test
. Это эквивалентно if test check_log
, который является сокращением для if test -n check_log
, что, в свою очередь, означает "если "check_log"
не является пустой строкой". Он вообще не вызывает вашу функцию check_log
.
Измените его так:
if check_log;
Кстати, эту функцию можно было бы просто написать следующим образом:
check_log() {
! [ -f "/usr/apps/appcheck.log" ]
}
Возвращаемое значение функции - это статус выхода последней команды, поэтому нет необходимости в явных операторах возврата.
Ответ 2
Как отмечено @john-kugelman, одним из решений (и, возможно, самым правильным) является использование следующего синтаксиса:
if check_log;
Но альтернативное решение:
if [[ $(check_log; echo $?) -eq 0 ]];
Мое личное предпочтение - последнее, поскольку оно способствует согласованности условных утверждений. Но недостатком является то, что, потому что он полагается на подстановку команд, он перекроет дочерний процесс (т.е. Подоболочку), где в качестве первого метода не будет.
Интересное чтение по этому вопросу можно найти здесь:
Когда подстановка команд порождает больше подоболочек, чем те же команды в отдельности?
Обновлено (2017-10-20): вычеркнуть мое предпочтение второму методу, так как в эти дни я нахожусь в миссии, чтобы предотвратить ненужное форкирование. Синтаксис в первом решении не так интуитивен для программирования без оболочки, но он, безусловно, более эффективен.