Cum se caută pe baza unui $ OPTARG pe care l-am furnizat într-un fișier?

В этом примере я пытаюсь дать более яркую концепцию того, что происходит. Немного управляйте сценарием и получите нужный результат.

#!/bin/bash
obtain_level=$(gammu monitor | awk '/Battery level/{print $4}') 
 if (( obtain_level <= 25 )) 
  then 
    echo "less than 25"
 elif (( obtain_level >= 26 || obtain_level <= 50 )) 
 then 
   echo "between 25 and 50" 
 else 
   echo "good" 
 fi
-121--290818-

На компьютере с сервером приложений:

Перед запуском приложения:

iptables -I INPUT -d <app server ip> --dport <app server port> -j REJECT

После завершения запуска:

iptables -D INPUT -d <app server ip> --dport <app server port> -j REJECT

При необходимости можно перенаправить трафик на другой сервер, на котором будет указано «приложение загружается». В этом случае замените:

-j REJECT

на

-j DNAT --to-destination < ip-адрес другой машины >

в обеих командах. Обратите внимание, что в этом случае необходимо включить функцию IP Forwarding. Необходимо настроить:

net.ipv4.ip _ forward = 1

в /etc/sysctl.conf

Это вступит в силу при следующей загрузке. Для немедленного применения в запущенной системе:

echo 1 >/ proc/sys/net/ipv4/ip_forward

You также может потребоваться маскировка трафика, уходящего от сервера приложений к серверу, чтобы показаться принимающему серверу исходящим от него (т.е. перезаписать IP-адрес источника). Вы можете сделать это с помощью:

iptables -t nat -I POSTROUTING -o < трафик интерфейса выйдет > -j MASQUERADE

Другой вариант: если у вас есть другой сервер на том же компьютере, что и сервер приложений, на другом порту, который может отображать страницу «приложение загружается», вы можете перенаправить трафик на этот порт. Та же идея, только вместо REJECT/DNAT:

ПЕРЕНАПРАВЛЕНИЕ-j - к порту <другой номер порта локального сервера>

Этот выбор не требует преобразования вашего сервера приложения в маршрутизатор:) (ip_forward не требуемый)

0
27.03.2018, 00:57
1 ответ

Когда вы заключаете раскрытие переменной в одинарные кавычки, вы не даете оболочке раскрыть эту переменную. Вместо этого вы должны использовать двойные кавычки.

Вот предложение по улучшению:

#!/bin/sh

while getopts "a:" option; do
   case $option in
       a) word=$OPTARG ;;
       *) echo 'error' >&2
          exit 1
   esac
done

if [ -z "$word" ]; then
    echo 'Missing word to search for' >&2
    exit 1
fi

printf 'Searching for "%s"\n' "$word"
grep -o "$word.*".addr_book

Я внес несколько изменений:

  • В скрипте не используютсяksh-специфические функции, поэтому я сделал его /bin/shскриптом.
  • Я отделил синтаксический анализ командной строки от основной части скрипта (вgrep). Это упрощает поддержку скрипта.
  • Начальный :в строке getoptsговорит getopts, что вы сами будете обрабатывать неверный аргумент командной строки. Это редко требуется, так как диагностические сообщения от getoptsчасто адекватны.
  • Диагностические сообщения (Все, что не является частью нормального вывода сценария, например, сообщения об ошибках или предупреждения ), должно отправляться в стандартный поток ошибок(>&2).
  • Диагностическое сообщение генерируется, если слово для поиска отсутствует или пусто.
  • Вывод переменных данных должен выполняться с помощью printf.
  • catбыл удален.
0
28.01.2020, 04:27

Теги

Похожие вопросы