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

Я работаю над проектом, в котором мне нужно сделать 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 не сохранять файл после загрузки
  • Как получить все файлы определенного типа из виртуального веб-пути?
  • Как получить размер (deb) файла из ссылки для загрузки / URL?
  • wget сохраняет файлы как обычные текстовые файлы при загрузке
  • wget загружает tar.gz файл как html?
  • Доступ к Google-трансляции через wget
  • Ошибка wget -output-document = при наличии символа ~
  • Почему не работает wget url / mediafile.ext> medafile2.ext?
  • wget не позволяет исключить каталоги
  • Используя wget или другую команду, как скачать сейчас, но конвертировать ссылки позже?
  • Что такое curl-эквивалент этой команды wget?
  • Linux и Unix - лучшая ОС в мире.