X

Здравствуйте, гость ( Вход | Регистрация )

Скрыть объявления

Объявления

 
Ответить в данную темуНачать новую тему
> Как проверить строку на количество параметров с двоеточием?
 
 Saveliy
сообщение 2.4.2017, 23:48
Сообщение #243912


Special

Группа: Главные администраторы

Город: Москва
Сообщений: 10979
Спасибо сказали: 1118 раз

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
}
Перейти в начало страницы
  Пользователя нет на форуме   
  
Ответить в данную тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


> Реклама и Новости
 
Нет новых
Сегодня, 4:56
Посл. ответ от Oleg777
Нет новых сообщений
5шт-500руб
25.1.2017, 19:07
Посл. ответ от Saveliy
Нет новых
В наличии все ходовые чипы по Одо и SRS
7.1.2017, 22:30
Посл. ответ от Saveliy
Нет новых
Для разборки щитка приборов.
2.4.2017, 18:18
Посл. ответ от kolorad
Нет новых сообщений
для внутрисхемного программирования микросхем
13.6.2016, 1:14
Посл. ответ от tranzmatic
> Some topics
 
Нет новых
Сегодня, 4:56
Посл. ответ от Oleg777
Нет новых сообщений
Опознать конденсаторы
Сегодня, 3:37
Посл. ответ от Aleks91
Нет новых сообщений
TPMS отключить с помощью bmw Explorer.
Сегодня, 2:21
Посл. ответ от Saveliy
Нет новых сообщений
TPMS отключить с помощью bmw Explorer.
Сегодня, 0:07
Посл. ответ от vidamotors
Нет новых
Вчера, 21:36
Посл. ответ от jinoweb
Текстовая версия Сейчас: 25.5.2017, 6:10