сценарии оболочки и регулярные выражения - PullRequest
1 голос
/ 22 декабря 2011
#!bin/bash
echo enter your password :
read password

passlength=$(echo ${#password})

if [ $passlength -le 8 ];
then
    echo you entered correct  password
else
    echo entered password is incorrect
fi

if [[$password == [a-z]*[0-9][a-z]*]];
then
    echo match found
else
    echo match not found
fi

Я не понимаю, что не так с этим кодом.Если я введу любую строку в качестве пароля, скажем, hello123, это выдаст мне ошибку:

hello123: команда не найдена

Что не так с моим скриптом

Ответы [ 6 ]

9 голосов
/ 22 декабря 2011

Вы можете сделать следующее, чтобы она работала кроссплатформенно с любой оболочкой, основанной на оболочке bourne (/ bin / sh), без особых примитивов bash -

echo "$password" | grep -q "[a-z]*[0-9][a-z]*"
if [ $? -eq 0 ] ;then
    echo "match found"
else
    echo "match not found"
fi

Также не стесняйтесь использовать quotes вокруг имен переменных.Это сэкономит вам часы и часы бесполезной отладки.:)

2 голосов
/ 22 декабря 2011

Технически это должно выдавать ошибку типа [[hello123 : command not found.

Проблема в том, что [[$password не раскрывается так, как вы думаете. Bash сначала разрешит переменную $password в соответствии с тем, что вы ввели (т.е. hello123). Это приведет к строке [[hello123, которую bash попытается вызвать (и потерпит неудачу, поскольку с таким именем ничего нет).

Просто добавьте пробел () после [[, и bash распознает [[ в качестве команды для запуска (хотя это встроенная команда).

if [[ "$password" == [a-z]*[0-9][a-z]* ]]
then
  ...
1 голос
/ 22 декабря 2011

Исправленный скрипт приведен ниже.Ошибки были:

  • #!/bin/bash, а не #!bin/bash
  • Чтобы прочитать длину пароля, просто наберите passlength=${#password}, а не passlength=$(echo ${#password})
  • Всегда ставитьпробел после [ или [[

</p> <pre><code>#!/bin/bash echo "enter your password :" read password passlength=${#password} if [[ $passlength -le 8 ]] then echo "you entered correct password" else echo "entered password is incorrect" fi if [[ $password == [a-z]*[0-9][a-z]* ]] then echo "match found" else echo "match not found" fi

0 голосов
/ 16 мая 2013
#!/bin/bash
read -s -p "Enter Password: " password
password_length=${#password}
if [ $password_length -lt 8 -o $password_length -gt 20 ] ;then 
        echo -e "Invalid password - should be between 8 and 20 characters in length.";
        echo ;
    else
        # Check for invalid characters
        case $password in 
            *[^a-zA-Z0-9]* ) 
                echo -e "Password contains invalid characters.";
                echo ;
                ;;  
            * )
                echo "Password accepted.";
                echo ;
                break;
                ;;
        esac
fi

Более настроенный пример ..

0 голосов
/ 22 декабря 2011

В конструкции bash [[ оператор == будет соответствовать шаблонам в стиле glob, а =~ будет соответствовать регулярным выражениям.См. документацию .

0 голосов
/ 22 декабря 2011

Попробуйте заменить строку

if [[$password == [a-z]*[0-9][a-z]*]];

со следующими

if echo "$password" | grep -qs '[a-z]*[0-9][a-z]*'

НТН

...