Erklaerung einfache Testsequenz

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
prankenandi
Beiträge: 119
Registriert: 29.11.2013 23:59:24

Erklaerung einfache Testsequenz

Beitrag von prankenandi » 04.12.2015 23:46:42

Hallo,

ich hab mal ein bisschen mit Bashscripting rumexperimentiert und wollte mal nach einer Erklaerung fuer eine einfache "Testsequenz" fragen: [1]

Code: Alles auswählen

read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
    # do dangerous stuff
fi
Was ich nicht verstehe ist der zweite String in der Testsequenz ~ ^[Yy]$.
Welche Funtion erfuellen ~, ^ und $.

Fuer =~ hab ich gefunden, match "RegularExpression matching".

Waere dann nicht aber "=~" + [Yy] "doppelt gemoppelt" bzw. teilweise sowieso nicht anwendbar wegen der "-n 1"-Option von read? D.h. entweder Y oder y, aber Yy geht nicht wegen der Option "-n 1" und [Yy] bezieht sich auch nur auf einen Charakter im definierten "Set" (d.h. Y oder y)?

Fuer ^abc hab ich gefunden, "Match any name that doesn't match abc". Aber in dem genannten Fall waere das ja dann eher kontraproduktiv Match any name that doesn't match Yy oder Y und y, oder?

Und, wie gesagt, das $ hinter der schliessenden Klammer???

Danke im Voraus!

[1https://stackoverflow.com/questions/188 ... ash-script]

Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Re: Erklaerung einfache Testsequenz

Beitrag von hikaru » 05.12.2015 00:17:23

^ ist in diesem Kontext keine Negation, sondern markiert den Anfang des Strings. Eine Negation stellt das Zeichen nur im Kontext von Mengen dar, also innerhalb eckiger Klammern. Wer auf die Idee gekommen ist, hier eine kontextsensitive Grammatik zu entwerfen weiß ich nicht. Aber was immer er geraucht hat, ich will auch was davon!
$ steht entsprechend für das Ende des Strings.
[] definiert eine Menge von Zeichen. Die Menge enthält in diesem Beispiel die Zeichen Y und y. Da es im Beispiel keine Wiederholungsoperatoren gibt, wird nur genau ein Zeichen akzeptiert.

Das Pattern matcht also auf jeden String, der mit Y ODER y anfängt UND auf Y ODER y endet UND aus genau einem Zeichen besteht.
Im Grunde sind ^ und $ dazu da, sicherzustellen, dass nicht z.B. auch die Eingabe von "Mayonaise" matcht. In Verbindung mit der read-Option -n ist das nur teilweise doppelt, denn ohne $ würde z.B. auch "Yoghurt mit Erdbeeren" matchen und beim Einlesen akzeptiert werden. Außerdem gilt es als guter Stil, Reguläre Ausdrücke unabhängig vom Kontext so scharf wie möglich zu formulieren. Daher ist das ^ im Grunde reine Formsache.

Antworten