bash-скрипт проверяет условия на нескольких параметрах строки - PullRequest
0 голосов
/ 13 октября 2018

Я работаю над сценарием оболочки bash, который проверяет строку и возвращает true для следующего:

1) Минимум 8 символов

2) Имеет хотя бы одну букву иодно число

3) Имеет как строчные, так и прописные буквы

В результате поиска я нашел, как получить количество символов в строке

srtLen=$(echo -m $str | wc -m)

И еслиоператор будет

if [ $strLen -ge 8 ]; then
  #make bool var true
fi

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

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Вот общий ответ, который будет работать с неанглийскими языками и многобайтовыми символами UTF-8.

Давайте переведем каждое из ваших требований в bash код:

  1. $str как минимум из 8 символов: это можно сделать несколькими простыми способами с помощью встроенных команд bash

    • [ "${#str}" -ge 8 ] && echo "str has a minimum of 8 characters"

      Просто:мы сравниваем длину $str

    • [[ "$str" == ????????* ]] && echo "str has a minimum of 8 characters"

      $str и сопоставляем с шаблоном, который соответствует как минимум 8 символам

    • [[ "$str" =~ .{8} ]] && echo "str has a minimum of 8 characters"

      $str проверяется на соответствие регулярному выражению, соответствующему 8-символьной строке

    • [ -n "${str#???????}" ] && echo "str has a minimum of 8 characters"

      Мы проверяем, что $str не является пустым при удалении первых 7 символов (не очевидно, следует избегать)

  2. Имеет хотя бы одну цифру:

    • [[ "$str" == *[[:digit:]]* ]] && echo "str has at least one digit"

      $str сверяется с шаблоном, который соответствует цифре, окруженной любым количеством символов

    • [[ "$str" =~ [[:digit:]] ]] && echo "str has at least one digit"

      $str проверяется по регулярному выражению, которое соответствует одной цифре

    • [ -n "${str//[^[:digit:]]}" ] && echo "str has at least one digit"

      Мы проверяем, что $str не пусто при удалении всех нецифровых символов (не очевидно, их следует избегать)

  3. Имеет хотя бы одну строчную букву:

    То же, что и для цифры, просто замените [[:digit:]] на [[:lower:]]

    [[ "$str" == *[[:lower:]]* ]] && echo "str has at least one lowercase letter"
    [[ "$str" =~ [[:lower:]] ]] && echo "str has at least one lowercase letter"
    [ -n "${str//[^[:lower:]]}" ] && echo "str has at least one lowercase letter"
    
  4. Имеет хотя бы одну заглавную букву:

    То же, что и для цифрыпросто замените [[:digit:]] на [[:upper:]]

    [[ "$str" == *[[:upper:]]* ]] && echo "str has at least one uppercase letter"
    [[ "$str" =~ [[:upper:]] ]] && echo "str has at least one uppercase letter"
    [ -n "${str//[^[:upper:]]}" ] && echo "str has at least one uppercase letter"
    

Вы, конечно, можете объединить четыре условия:

$ str='my ßtrÎñ9'
$ if [[ "${#str}" -ge 8 \
    && "$str" =~ [[:digit:]] \
    && "$str" =~ [[:lower:]] \
    && "$str" =~ [[:upper:]] \
  ]]; then
      echo "str is a valid password"
  else
      echo "str is NOT a valid password"
  fi

str is a valid password
0 голосов
/ 13 октября 2018

Это для английского алфавита, если вам нужны другие, вам нужно связываться с локалью и переменной LC_COLLATE:

check_str()
{   
    str="$1"

    # Has a minimum of 8 characters
    if (( ${#str} > 7 )) &&

       # Has at least one number
       [[ "$str" = *[0-9]* ]] &&

       # Has both a lowercase 
       [[ "$str" = *[a-z]* ]] &&
       # and uppercase letter
       [[ "$str" = *[A-Z]* ]]
    then
        return 0
    else
        return 1
    fi
}

while :
do
    read -p "Enter a string: " inp
    if check_str "$inp"
    then
        echo "$str matches"
    else
        echo "$str does not match"
    fi
done

Тестовый прогон:

Enter a string: helloHHx
helloHHx does not match
Enter a string: helloH1x
helloH1x matches
Enter a string: 12345678
12345678 does not match
Enter a string: hello
hello does not match
Enter a string: now is The 4 time for all good men
now is The 4 time for all good men matches

Обратите внимание, что ваши критерии 2 и 3 перекрываются, для 2 нам нужно только проверить, есть ли число, наличие буквы проверяется в 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...