Вы можете попробовать что-то вроде:
while true ; do
if Sqlcmd xxx xxx xxx ; then break ; fi
# or:
Sqlcmd xx xxx xxx && break
sleep 1
done
Вы также можете добавить счетчик:
for ((n=100;n>0;n--)) ; do
Sqlcmd xxx xxx xxx
if [[ $? == 0 ]] ; then
break
fi
sleep 1
done
[[ $n == 0 ]] && echo Timeout && exit 1
Здесь я показываю два разных способа проверки возвращаемого значения, ноПервый вариант предпочтителен (if cmd ; then ... ; fi
).
$?
- это возвращаемое значение из последней команды, равное 0
после ее успешного завершения.Если он возвращает 0
даже в случае ошибки (которая может произойти для неправильно сформированных программ), вы можете проверить вывод с помощью grep
:
Sqlcmd xxx xxx 2>&1 | grep <error pattern> > /dev/null
if [[ $? != 0 ]] ; then break ; fi
Здесь мы тестируем $? != 0
, потому что grep
будетвернуть 0
при обнаружении шаблона ошибки .
Если вы хотите получить результат вывода в переменную, выполните команду с X=$(Sqlcmd xxx xxx)
.Затем вы можете использовать сравнение строк bash:
X=$(Sqlcmd xxx xxx)
if [[ "$X" =~ .*error.* ]] ; then
<handle error here>
fi
Примечание bash может соответствовать регулярному выражению , что делает его действительно удобным при проверке типов ошибок.
Вы также можете использоватьswitch/case
конструкция:
case "$X" in
*Error:*) echo " Error detected " ;;
*) break ;;
esac
(обратите внимание на двойной ;;
)