Автор: Saveliy 2.4.2017, 23:48
CODE
#----------------------------------------------------------------------#
# Как проверить строку на количество параметров, разделенных
# двоеточием?
#----------------------------------------------------------------------#
# Необходимо определить, что у нас пришло в строке, два параметра
# или один. Для чего это нужно, читаем ниже.
#----------------------------------------------------------------------#
#
# Пояснения по входящим параметрам данной функции:
# Первый параметр, строка для разбора.
# Если пришел второй параметр, то в первом символе первого
# параметра (до двоеточия) в строке для разбора допускаются цифра,
# иначе первый символ всегда только буква.
#
# Разделителем параметров в строке является символ двоеточие ':',
# если мы ожидаем два параметра. Исключение, если перед двоеточием нет
# символов.
#
# Примеры входной строки:
# httpd:/usr/local/etc/rc.d/apache24 restart
# :/usr/local/etc/rc.d/apache24 restart
# /usr/local/etc/rc.d/apache24 restart
#
#----------------------------------------------------------------------#
# Пояснения для параметров входящей строки:
#----------------------------------------------------------------------#
#
# Первый параметр при разборе строки вспомогательный (первое поле),
# например это имя процесса, который мы хотим перезагрузить.
# Первый параметр может и отсутствовать, тогда будет считаться,
# что пришло не два параметра, а один.
#
# Второй параметр при разборе строки играет главную роль, это
# непосредственно команды sh.
#
#----------------------------------------------------------------------#
#
# Почему мы так "усложнили" получение двух полей?
# Потому что при "обычном" извлечении первого или второго поля
# по разделителю, у нас могут быть получены неверные данные как
# слева, так и справа, т.к. знак разделителя полей (двоеточие)
# может либо вобще отсутствовать, либо попросту стоять где-то в
# середине строки команд и не являться "нашим" разделителем, а
# быть частью команд. Например мы задумали передать в скрипт не
# два "параметра" с разделителем двоеточие, а один. Напомним,
# второй параметр (правый), может содержать любой набор команд sh.
#
# Только после текущей проверки мы смело можем принять решение,
# надо ли нам извлекать левый и правый параметр, или получить все
# одной строкой.
#
# Принцип форматирования строки:
# 1. Если пришло два параметра, то они разделяются знаком
# двоеточие. Пробелы допускаются до и после двоеточия.
# 2. Если пришел один параметр, то с начала строки либо нет
# двоеточия, либо есть, но перед двоеточием нет каких либо
# символов, кроме возможных пробелов.
#
# Условие проверки строки:
# Первый параметр:
# С начала строки допускается одно слово, которое может
# содержать буквы, цифры, точку, знак нижнего подчеркивания
# и тире. Причем первый символ, по умолчанию это всегда только
# буква, последующие символы могут содержать также цифры, знаки
# подчеркивания, тире и символ точки. Но если на входе данной
# функции пришел параметр 'allowdigit', значит в первом символе
# могут содержаться и цифры.
# Второй параметр:
# Любые знаки и команды.
#
# Примеры, что у нас получится:
# OK httpd:/usr/local/etc/rc.d/apache24 restart
# OK imapd-s.sl:/usr/local/etc/rc.d/courier-imap-imapd-ssl restart
# NO _imapd-s.sl:/usr/local/etc/rc.d/courier-imap-imapd-ssl restart
# NO 2imapd-s.sl:/usr/local/etc/rc.d/courier-imap-imapd-ssl restart
# OK pop3d-ssl : /usr/local/etc/rc.d/courier-imap-pop3d-ssl restart
# OK postfix:/usr/local/etc/rc.d/postfix restart
# OK d :/usr/local/etc/rc.d/postfix restart
# OK e:/usr/local/etc/rc.d/postfix restart
# OK f : /usr/local/etc/rc.d/postfix restart
# NO c v: /usr/local/etc/rc.d/postfix restart
# NO /usr/local/etc/rc.d/postfix restart
# NO /usr/local/etc/rc.d/postfix restart
# NO /usr/local/etc/rc.d/postfix f:restart
# NO /usr/local/etc/rc.d/postfix :restart
#
# Ниже варианты также допускаем, но на отсутствие первого параметра
# позже проведем дополнительную проверку. Данные варианты будут
# означать, что пришел один параметр. Так сделано для унификации
# и простоты оформления строки команды в конфиге.
# OK : /usr/local/etc/rc.d/postfix restart
# OK : /usr/local/etc/rc.d/postfix restart
#
# (c) Saveliy Severniy
#----------------------------------------------------------------------#
__is_two_params() {
local str="${1}"
local allowdigit="${2}"
local istwo=0
local pattern=""
if [ -z "${str}" ]; then
echo -n "no"
return 0
fi
if [ -z "${allowdigit}" ]; then
allowdigit="no"
else
allowdigit="yes"
fi
#----------------------------------------------------------------------#
# Непосредственно проверка строки на условия.
#----------------------------------------------------------------------#
if [ "${allowdigit}" = "yes" ]; then
pattern="\(^[a-zA-Z0-9][a-zA-Z0-9_\.-]\{0,\}[[:space:]]*:[[:space:]]*\)"
else
pattern="\(^[a-zA-Z][a-zA-Z0-9_\.-]\{0,\}[[:space:]]*:[[:space:]]*\)"
fi
pattern="${pattern}\|\(^[[:space:]]*:[[:space:]]*\)"
istwo=$(echo -n "${str}" | grep -c "${pattern}")
if [ $istwo -gt 0 ]; then
# У нас два параметра
echo -n "yes"
else
# У нас один параметр
echo -n "no"
fi
return 0
}