2017-02-07 12 views
0
#!/bin/bash 

password=$1 

if [[ $# -gt 1 || $1 = "-h" ]]; then 
      echo 'Usage: pw | pw -h | pw password' 
      echo "Note: Valid passwords must be between 8-16 characters long. 
      contain at least 1 digit 
      contain at least 1 lowercase letter 
      contain at least 1 uppcase letter 
      contain one of @ # $ % & * + - =" 
fi 
if [[ $# -lt 1 ]]; then 
    regex='[email protected]*+#$%&a-z' 
    password=$(cat /dev/urandom | tr -dc '[email protected]*+#$%&a-z' | head -c $((8 + $RANDOM % 8))) 
    check=$(echo $password | grep -o ['@*+#$%&'] | wc -m) 
    while [[ $check -gt 2 || $check -lt 1 ]] 
      do 
      password=$(cat /dev/urandom | tr -dc '[email protected]*+#$%&a-z' | head -c $((8 + $RANDOM % 8))) 
      check=$(echo $password | grep -o ['@*+#$%&'] | wc -m) 
    done 
    echo $password 
fi 
if [[ $# = 1 ]]; then 
    password=$1 
    echo "$password" | grep [A-Z][a-z] 
    if [[ $? = 1 ]]; then 

    echo "Password must contain at least one upper or lowercase characer" 
      exit 2 
    fi 

    echo "$password" | grep [0-9] 
    if [[ $? = 1 ]]; then 

    echo "Password must contain at least one digit" 
      exit 3 
    fi 

    if [[ `echo "$password" | grep -o ['@#$%&*+-'] 2>/dev/null` -gt 2 ]]; then 
      echo "You must only use one special character" 
      exit 4 
    fi 

    if [[ `echo "$password" | grep -o ['\@\#\$\%\&\*\+\-'] 2>/dev/null` -lt 1 ]]; then 

    echo "Password must contain at least one special character" 
      exit 5 
    fi 
    woc=$(echo "$password" | wc -m) 
    if [[ $woc -lt 8 || $woc -gt 16 ]]; then 

    echo "Password must be between 8 and 16 characters" 
      exit 6 
    fi 
echo "$1 is a valid password" 
fi 

Первая часть этого скрипта отлично работает и генерирует случайный пароль длиной 8-16 символов с одним специальным символом. Проблемы находятся в строке 40 и 45, обе дают мне ту же ошибку «Синтаксическая ошибка: ожидание операнда» [специальный символ] ». Я попытался создать переменные и вызвать их, используя переменную $? Для проверки вывода и т. Д. К сожалению, эта ошибка остается стабильно даже при том, что скрипт делает правильно работать.Ошибка синтаксиса BASH Script с использованием grep для переменной, содержащей специальные символы

+3

Я хотел бы предложить вам уменьшить количество кода в вашем ответьте и лучше определите код, который не работает, как вы ожидаете, какие точные входы и т. д. – Fred

+3

также вместе с^полезным комментарием, скопируйте свой скрипт в http://www.shellcheck.net, чтобы исправить тривиальные синтаксические проблемы и уязвимость кода ilities – Inian

+2

В дополнение к проблеме, которую вы видите, существует множество потенциальных проблем из-за неправильного цитирования. '$ password' должен * всегда * быть в двойных кавычках, а ваши шаблоны' grep' должны быть одинарной кавычкой, чтобы предотвратить совпадение оболочки с ней в качестве подстановочных знаков имен файлов. Кроме того, регулярное выражение '[A-Z] [a-z]' соответствует заглавной букве, за которой следует строчная буква; если вы хотите сопоставить любую букву, используйте '' [A-Za-z] ''. –

ответ

2

Я установил код, это было просто ошибкой. Я забыл включить туалет -m.

if [[ `echo "$password" | grep [\@\#\$\%\&\*\+\-] | wc -m` -lt 2 ]] 
+0

@ kieran-oconnor Мне нравятся парни, которые исправляют себя :). ** Если вы обнаружите ошибку. без проблем –