синтаксическая ошибка в условном выражении при выполнении сценария оболочки?

Я работаю над проектом, в котором мне нужно сделать URL-адрес на один из моих серверов из сценария оболочки bash.

http://hostname.domain.com:8080/beat 

После удара по указанному выше URL-адресу я получаю следующий ответ, который мне нужно проанализировать и извлечь значение syncs_behind и syncs_behind

 state: READY num_retries_allowed: 3 syncs: 30 syncs_behind: 100 num_rounds: 60 hour_col: 2 day_col: 0 oldest_day_col: 0 

Теперь мне нужно нажать вышеприведенный URL каждые 10 секунд в течение 10 минут и извлечь из него значение syncs_behind и syncs_behind и использовать его для проверки с нижестоящим условием –

 syncs > 8 syncs_behind = 0 

если syncs больше 8 и syncs_behind = 0, то я завершу свой сценарий оболочки некоторым сообщением: «Данные были проверены», в противном случае я продолжал бы пробовать 10-минутное окно. Если в этом 10-минутном окне, этого не произойдет, я закончу сценарий оболочки, так что я больше не буду повторять попытку.

Поэтому я начал с приведенного ниже кода, и я сохранил файл как beat.sh с нижеследующим содержимым –

 #!/bin/bash COUNT=60 #number of 10 second timeouts in 10 minutes SUM_SYNCS=0 SUM_SYNCS_BEHIND=0 while [[ $COUNT -ge "0" ]]; do #send the request, put response in variable DATA=$(wget -O - -q -t 1 http://hostname.domain.com:8080/beat) #grep $DATA for syncs and syncs_behind SYNCS=$(echo $DATA | grep -o 'syncs: [0-9]+' | awk '{print $2}') SYNCS_BEHIND=$(echo $DATA | grep -o 'syncs_behind: [0-9]+' | awk '{print $2}') echo $SYNCS echo $SYNCS_BEHIND #add new values to the sum totals let SUM_SYNCS+=SYNCS let SUM_SYNCS_BEHIND+=SYNCS_BEHIND #verify conditionals if [[ $SYNCS -gt "8" -a $SYNCS_BEHIND -eq "0" ]]; then exit -1; fi #decrement the counter let COUNT-=1 #wait another 10 seconds sleep 10 done 

И когда я запускаю его как ./beat.sh , я попал под ошибку –

 ./beat.sh: line 23: syntax error in conditional expression ./beat.sh: line 23: syntax error near `-a' ./beat.sh: line 23: `if [[ $SYNCS -gt "8" -a $SYNCS_BEHIND -eq "0" ]]; then exit -1; fi' 

Какие-то мысли, что я тут делаю?

One Solution collect form web for “синтаксическая ошибка в условном выражении при выполнении сценария оболочки?”

Баш [[ не поддерживает -a . Один из подходов состоит в том, чтобы использовать [ и в остальном держать вещи одинаковыми:

 [ $SYNCS -gt "8" -a $SYNCS_BEHIND -eq "0" ] 

Для достижения наилучших результатов с помощью [ , однако, следует использовать переменные с двумя кавычками:

 [ "$SYNCS" -gt 8 -a "$SYNCS_BEHIND" -eq 0 ] 

В общем случае, хотя -a и -o следует избегать, так как команда не может достоверно проанализировать свои аргументы, когда получает более 4 (рядом с [ и ] ) . Так

 [ "$SYNCS" -gt 8 ] && [ "$SYNCS_BEHIND" -eq 0 ] 

Кроме того , сохраните [[ но используйте && для -a :

 [[ $SYNCS -gt "8" && $SYNCS_BEHIND -eq "0" ]] 

Многие люди предпочитают [[ над [ потому что двойные кавычки вокруг переменных не нужны.

Но здесь, если вы собираетесь использовать синтаксис ksh / bash / zsh, для арифметического сравнения вы также можете написать его:

 (( SYNCS > 8 && SYNCS_BEHIND == 0 )) 

БОЛЬШЕ: строки grep имеют две проблемы. Как указал Хауке, в одном есть лишняя толстая кишка. Во-вторых, для использования синтаксиса [0-9]+ обе строки нуждаются в опции -E для расширенного регулярного выражения:

 SYNCS=$(echo "$DATA" | grep -oE 'syncs: [0-9]+' | awk '{print $2}') SYNCS_BEHIND=$(echo "$DATA" | grep -oE 'syncs_behind: [0-9]+' | awk '{print $2}') 
  • зеркало сайта с wget, что только ответ с gzip
  • Есть ли способ использовать завиток в интерактивном режиме? Или есть интерактивная оболочка curl / wget?
  • Как получить доступ к http-серверу из сценария bash с существующим подключением tcp?
  • Что такое curl-эквивалент этой команды wget?
  • Несколько вызовов wget за один сеанс?
  • Проблемы рекурсии wget
  • Как передать файлы, загруженные с помощью wget через tar?
  • Не удалось загрузить содержимое веб-сайта
  • Использование sed для добавления URL-адреса в начало каждой строки
  • В чем смысл wget -O -
  • Попытка получить динамическую страницу с wget без успеха
  • Linux и Unix - лучшая ОС в мире.