2012-06-27 2 views
0

Я должен сделать условие в золе, что зависит от результата двух команд. Проблема заключается в том, что один из них возвращает результат в stdout, другой - в качестве кода выхода.

Должен ли я написать

command2 
RET=$? 
if [ `command1` -eq 1 -a $RET -eq 2 ] ; then ... 

или есть какая-то конструкция, которая позволила бы мне просто получить доступ код возврата из command2 в логике [ ]?

if [ `command1` -eq 1 -a ${{{ command2 }}} -eq 2 ] ; then ... 

${{{ }}}} является магическим выражением извлечения код возврата?)

ответ

2

Было бы лучше написать:

if [ "`command1`" -eq 1 ] && command2 
then 
    .... 
fi 

Или, если вы хотите, чтобы проверить, если код завершения 2, то :

if [ "`command1`" -eq 1 ] && { command2 ; [ "$?" = 2 ] ; } 
then 
    .... 
fi 

Пример:

$ cat 1.sh 
ARG="$1" 

command1() 
{ 
    echo 1 
} 
command2() 
{ 
    return "$ARG" 
} 

if [ "`command1`" -eq 1 ] && { command2 ; [ "$?" = 2 ] ; } 
then 
    echo OK 
else 
    echo FAILED 
fi 

$ sh 1.sh 2 
OK 
$ sh 1.sh 3 
FAILED 
+0

Необходимо процитировать как: '[" \ 'command1 \' "...]' иначе все разрывается, если выход не разбивается на ровно одно слово. –

+0

@ JoSo: Правильно! Спасибо!! –

0

Я думаю, что нет способа избежать $ ?, но я могу использовать команду внутри тестового заявления, добавив в конце ;echo $?.

if [ `command1` -eq 1 -a `command2 ; echo $?` -eq 2 ] ; then ... 
Смежные вопросы