简体   繁体   中英

shell scripting and regular expression

#!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

I am not getting what's wrong with this code. If I enter any string as a password, let's say hello123 , it gives me an error:

hello123 : command not found

What is wrong with my script?

You can do the following to make it work cross-platforms with any the bourne shell (/bin/sh) based shell, no bash specific primitives -

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

Also feel free to use quotes around the variable names. It will save you hours and hours worth of useless debugging. :)

Technically it should give you an error like [[hello123 : command not found .

The issue is that [[$password is not expanded how you think it is. Bash will first resolve the $password variable to what you entered (ie hello123 ). This will yield the string [[hello123 which bash will then try to invoke (and fail, as there is nothing with that name).

Simply add a space ( ) after [[ and bash will recognise [[ as the command to run (although it is a builtin).

if [[ "$password" == [a-z]*[0-9][a-z]* ]]
then
  ...

The corrected script is below. The errors were:

  • #!/bin/bash , not #!bin/bash
  • To read password length, just do passlength=${#password} , not passlength=$(echo ${#password})
  • Always put a space after [ or [[

 #!/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 == [az]*[0-9][az]* ]] then echo "match found" else echo "match not found" fi 

#!/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

More tuned example..

In the bash [[ construct, the == operator will match glob-style patterns, and =~ will match regular expressions. See the documentation .

Try to replace line

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

with following

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

HTH

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM