Помощник
Здравствуйте, гость ( Вход | Регистрация )
![]()
Сообщение
#243912
|
|
![]() Special Группа: Главные администраторы Сообщений: 13264 Спасибо сказали: 2030 раз ![]() |
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 } |
![]() ![]() |
|
Ответить |
![]() |
|
4.9.2024, 12:04 Посл. ответ от Ilyamiass |
|
![]() |
|
3.1.2024, 5:58 Посл. ответ от Александр |
|
![]() |
|
25.7.2022, 7:21 Посл. ответ от Fedorov |
|
![]() |
|
16.3.2022, 12:28 Посл. ответ от Saveliy |
|
![]() |
|
10.5.2019, 16:43 Посл. ответ от Saveliy |
![]() |
|
4.9.2024, 12:04 Посл. ответ от Ilyamiass |
|
![]() |
|
4.9.2024, 9:29 Посл. ответ от ypiter |
|
![]() |
|
3.9.2024, 18:20 Посл. ответ от Nikol |
|
![]() |
|
2.9.2024, 15:29 Посл. ответ от Максим |
|
![]() |
|
2.9.2024, 13:08 Посл. ответ от Reanimotor |
Сейчас: 8.9.2024, 4:14 |