Повторять команду канала до тех пор, пока первая команда не будет выполнена успешно, а вторая команда не будет выполнена

Я пытаюсь понять, как заставить мой bash-скрипт работать. У меня есть следующая команда:

curl http://192.168.1.2/api/queue | grep -q test

Мне нужно это повторять до тех пор, пока первая команда в конвейере не будет выполнена успешно (это означает, что сервер отвечает), и вторая команда не выполнится (то есть шаблон не найден или очередь пуста). Я перепробовал несколько комбинаций, но просто не могу этого понять. Я смотрел на использование $PIPESTATUS но не могу заставить его функционировать в цикле, как я хочу. Я перепробовал все варианты, но не могу заставить его работать. Вот что я сейчас пытаюсь:

while [[ "${PIPESTATUS[0]}" -eq 0 && "${PIPESTATUS[1]}" -eq 1 ]]
  do curl http://192.168.1.2 | grep -q regular
  echo "The exit status of first command ${PIPESTATUS[0]}, and the second command ${PIPESTATUS[1]}"
  sleep 5 
done

2 ответа

Хотя не совсем понятно, какой вывод возвращается при вызове curl, возможно, вы ищете что-то вроде этого:

curl --silent http://192.168.1.2 |while read line; do
  echo $line |grep -q regular || { err="true"; break }
done

if [ -z "$err" ]; then
  echo "..All lines OK"
else
  echo "..Abend on line: '$line'" >&2
fi

Догадаться. Просто пришлось переосмыслить это. Я не мог понять это строго с помощью цикла while или befo re, но создание бесконечного цикла и выход из него при выполнении условия работали.

while true
    do curl http://192.168.1.2/api/queue | grep -q test
        case ${PIPESTATUS[*]} in
          "0 1")
              echo "Item is no longer in the queue."
              break;;
          "0 0")
              echo "Item is still in the queue. Trying again in 5 minutes."
              sleep 5m;;
          "7 1")
              echo "Server is unreachable. Trying again in 5 minutes."
              sleep 5m;;
          esac
   done
Другие вопросы по тегам