Помощник
Здравствуйте, гость ( Вход | Регистрация )
2.4.2017, 23:48
Сообщение
#243912
|
|
Special Группа: Главные администраторы Сообщений: 13276 Спасибо сказали: 2043 раза |
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 } |
|
|
Ответить |
|
Вчера, 9:45 Посл. ответ от stepan_v |
||
|
3.1.2024, 5:58 Посл. ответ от Александр |
||
|
25.7.2022, 7:21 Посл. ответ от Fedorov |
||
|
16.3.2022, 12:28 Посл. ответ от Saveliy |
||
|
10.5.2019, 16:43 Посл. ответ от Saveliy |
|
Сегодня, 11:07 Посл. ответ от jinoweb |
||
|
Вчера, 20:24 Посл. ответ от Александр |
||
|
Вчера, 11:11 Посл. ответ от Азамат |
||
|
Вчера, 9:45 Посл. ответ от stepan_v |
||
|
Вчера, 8:48 Посл. ответ от Vasilich |
Сейчас: 21.12.2024, 20:05 |