2015-07-31 2 views
6

Ich schreibe eine Bash-Validierungsfunktion, die Benutzereingaben bereinigt.Wie schreibe ich eine Regex, die Alpha-Numerik und Leerzeichen validiert

Die Idee ist, dass, wenn ein Skript 3 Parameter hat, diese nur alphanumerische Werte sein können. Aber ein Parameter könnte mehrere Wörter in Anführungszeichen wie so eingeschlossen sein:

myfunction arg1 arg2 "this is arg3"

So bin ich im Grunde der Suche alles abzustreifen, dass nicht ein alphanumerisches oder Leerzeichen.

Im Moment habe ich erhielt:

validateEntry() { string=$1 clean=${string//[^a-zA-Z0-9\s]/} }

Aber es scheint nicht zu funktionieren. In myfunction arg1 arg2 "this is arg3" wird die is arg3 ausgestreift.

Und die Art, wie ich diese Funktion verwenden ist in einem Skript, etwa so:

name=$(validateEntry $1) 

Ich brauche Hilfe mit diesen.

edit:

Die Idee ist es, die validateEntry Funktion in einem Skript zu verwenden, die nehmen, lassen Sie uns sagen, 3 Argumente, etwa so:

if [[ "$#" -eq 3 ]]; then 
    arg1=$(validateEntry $1) 
    arg2=$(validateEntry $2) 
    arg3=$(validateEntry $3) 
    echo "${arg1}, ${arg2}, ${arg3}." 
fi 

Aber wenn dritte Argument ist mein Skript ist this is arg3, $arg3 zu this reduziert wird, obwohl, wenn ich direkt meine die Funktion aufrufen, mit den gleichen drei Argumente, die dritte arg this is arg3

Antwort

5

\s bedeutet nicht "irgendeine Art von Leerraum" in einem Muster (was kein regulärer Ausdruck ist). Stattdessen verwenden Sie entweder nur eine wörtliche Raum

clean=${1//[^a-zA-Z0-9 ]} 

oder, wenn Sie Leerzeichen übereinstimmen soll, Tabulatoren, Zeilenumbrüche, usw., die Klasse POSIX-Zeichen verwenden [:space:]:

clean=${1//[^a-zA-Z0-9[:space:]]} 

(Für diese Angelegenheit Sie verwenden Zeichenklassen für die Buchstaben und Zahlen können auch:

clean=${1//[^[:alnum:][:space:]]} 

)

Sobald Sie getan haben, dass, gibt es zwei weitere Dinge, die Sie ändern müssen:

  1. Sie müssen tatsächlich Ausgang die aufgeräumte Wert:

    validateEntry() { 
        echo "${1//[^[a[:alnum:][:space:]]}" 
    } 
    
  2. Sie müssen die Erweiterung zitieren Sie möchten überprüfen, so dass die ganze Sache auf Ihre Funktion übergeben wird:

    name=$(validateEntry "$1") 
    
+0

Ich nehme zur Kenntnis haben können, dass ich bash auf OSX leite. Deine drei Lösungen scheinen nicht zu funktionieren. –

+0

Wenn in einem der doppelt zitierten Parameter Sonderzeichen enthalten sind (d. H.! @ #% $), Wird die Shell das Argument nicht erweitern und einen Fehler ausgeben? – SArnab

+0

Dies ist, wie ich es benutze: 'validateEntry" Dies ist mein Eintrag " -bash: [Dies ist mein Eintrag: Syntaxfehler im Ausdruck (Fehler Token ist" ist mein Eintrag ")' –

2

Bearbeitet, um die Frage zu erfüllen.

function validateEntry { 
    echo ${1//[^[:alnum:][:space:]]/} 
} 


if [[ $# -eq 3 ]]; then 
    echo $(validateEntry "$1") 
    echo $(validateEntry "$2") 
    echo $(validateEntry "$3") 
fi 

Befehl

./test.sh arg1 arg2 "this is arg3" 

Ausgang:

arg1 
arg2 
this is arg3 
+0

Ich habe meine Antwort aktualisiert. Die Ausgabe erscheint mir gut. Sie müssen die Anführungszeichen richtig verwenden. – SArnab

+0

Tatsächlich ging es um die Zitate. Vielen Dank! –

Verwandte Themen