2016-10-07 8 views
0

Ich versuche ein Passwort zu validieren.
Das Passwort muss mindestens die Länge 7 haben und einen numerischen und einen alphabetischen Wert enthalten.Bash (Posix) Regex passt nicht

Mein regulärer Ausdruck funktioniert in mehreren Online-Test-Tools wie http://www.regextester.com/.

Aber aus irgendeinem Grund wird nicht in meinem Skript arbeiten.

if [[ "$1" =~ ^((?=.*[[:digit:]])(?=.*[[:alnum:]]).{7,})$ ]]; then 
    printf "DEBUG: password match\n" 
    return 0 
else 
    printf "DEBUG: password no match\n" 
    return 1 
fi 

Vielen Dank im Voraus

+1

BASH Regex unterstützt Lookahead nicht – anubhava

Antwort

3

POSIX reguläre Ausdrücke unterstützen Perl-Stil (?=...) Vorgriffs Behauptungen nicht. Sie können hier einfache Mustervergleiche verwenden.

if [[ $1 == *[[:digit:]]* && $1 == *[[:alpha:]]* && $1 =~ .{7} ]]; then 

Die erste Überprüfung stellt sicher, dass es eine Ziffer gibt, die zweite einen Buchstaben. Die letzte Überprüfung überprüft, ob irgendwo im Wert ein 7-stelliger Teilstring vorhanden ist (was bedeutet, dass die Gesamtlänge mindestens 7 beträgt). Sie könnten das auch durch ${#1} -ge 7 ersetzen.

0

könnten Sie das versuchen;

#!/bin/bash 
password=$1 
if [[ ${#password} -ge 7 && "$password" == *[A-Z]* && "$password" == *[a-z]* && "$password" == *[0-9]* ]]; then 
    printf "DEBUG: password match\n" 
else 
    printf "DEBUG: password no match\n" 
fi 
+0

Dies ist etwas strenger; Sie benötigen einen Großbuchstaben * und * einen Kleinbuchstaben und nicht nur einen Buchstaben. – chepner