Intereting Posts
Как исправить вкладку, чтобы она не скрывала записи? Эвристика для использования или отклонения старой документации Как отключить информацию о зависании плейлиста в Amarok? Как создать фиктивный принтер с опцией AuthInfoRequired Связь между правами на выполнение в каталоге и его структурой inode Издевательство над псевдонимом (оч) Проблема с типом раздела Mac OS X Вход в SSH продолжает пинать меня Как запустить не более n параллельных подоболочек Могу ли я передавать содержимое буфера обмена в браузер для просмотра? Создается ли раздел, созданный dd (и кэшем), мгновенно доступный для записи Является ли IO приоритетом по самой природе пересмотра задачи? Vim: VimRepress и WordPress.com – как вставлять фрагменты кода? Есть ли вариант часов, который обновляется только после получения сигнала? Все службы пользователя убиваются при запуске нескольких сервисов под этим пользователем с помощью systemd

Использование grep в условном выражении в bash

Я все еще очень новичок в написании сценариев в bash, и просто пытаюсь сделать то, что, по моему мнению, будет основным. Я хочу запустить DDNS, который обновляется с моего сервера под управлением Ubuntu 14.04.

Заимствуя некоторый код из dnsimple, это то, что у меня есть до сих пор:

#!/bin/bash LOGIN="email" TOKEN="token" DOMAIN_ID="domain" RECORD_ID="record" IP=`curl -s http://icanhazip.com/` OUTPUT=` curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-DNSimple-Domain-Token: $TOKEN" \ -X "PUT" \ -i "https://api.dnsimple.com/v1/domains/$DOMAIN_ID/records/$RECORD_ID" \ -d "{\"record\":{\"content\":\"$IP\"}}"` if ! echo "$OUTPUT" | grep -q "(Status:\s200)"; then echo "match" $(echo "$OUTPUT" | grep -oP '(?<="message":")(.[^"]*)' >> /home/ddns/ddns.log) $(echo "$OUTPUT"| grep -P '(Status:\s[0-9]{3}\s)' >> /home/ddns/ddns.log) fi 

Идея состоит в том, что она работает каждые 5 минут, и я работаю с помощью cronjob. Затем я хочу проверить вывод завитка, чтобы узнать, является ли статус «200» или другой. Если это что-то еще, я хочу сохранить вывод в файл.

То, что я не могу получить, – это оператор if . Как я понимаю, команда -q в команде grep предоставит код выхода для оператора if . Однако я не могу заставить его работать. Где я ошибся?

Ты почти там. Просто опустите восклицательный знак:

 OUTPUT='blah blah (Status: 200)' if echo "$OUTPUT" | grep -q "(Status:\s200)"; then echo "MATCH" fi 

Результат:

 MATCH 

Условие if выполняется, если grep возвращает код выхода 0 (что означает совпадение). ! восклицательный знак отменяет это.

Поскольку вы уже используете bash, вы можете сохранить его внутри bash:

 if [[ $OUTPUT =~ (Status:[[:space:]]200) ]]; then echo match fi 

Примеры прогонов:

 OUTPUT='something bogus' [[ $OUTPUT =~ (Status:[[:space:]]200) ]] && echo match OUTPUT='something good (Status: 200)' [[ $OUTPUT =~ (Status:[[:space:]]200) ]] && echo match match 

Это не ответ на ваш вопрос, но мало предложений от соратников:

  • Используйте $() вместо обратных ссылок, не используйте их как
  • Отступы условные, if утверждения
  • Удалите ненужное использование $()

Consistentecy и простые правила помогут вам отлаживать и поддерживать скрипты в долгосрочной перспективе …

 #!/bin/bash LOGIN="email" TOKEN="token" DOMAIN_ID="domain" RECORD_ID="record" IP=$(curl -s http://icanhazip.com/) OUTPUT=$( curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-DNSimple-Domain-Token: $TOKEN" \ -X "PUT" \ -i "https://api.dnsimple.com/v1/domains/$DOMAIN_ID/records/$RECORD_ID" \ -d "{\"record\":{\"content\":\"$IP\"}}" ) if ! echo "$OUTPUT" | grep -q "(Status:\s200)"; then echo "match" echo "$OUTPUT" | grep -oP '(?<="message":")(.[^"]*)' >> /home/ddns/ddns.log echo "$OUTPUT"| grep -P '(Status:\s[0-9]{3}\s)' >> /home/ddns/ddns.log fi