it-swarm.com.de

Überprüfen Sie, ob eine Zeichenfolge mit einem regulären Ausdruck im Bash-Skript übereinstimmt

Eines der Argumente, die mein Skript empfängt, ist ein Datum im folgenden Format: yyyymmdd.

Ich möchte überprüfen, ob ich ein gültiges Datum als Eingabe erhalte.

Wie kann ich das machen? Ich versuche einen regulären Ausdruck wie: [0-9]\{\8}

175
Peter Nijem

Sie können sagen:

[[ $date =~ ^[0-9]{8}$ ]] && echo "yes"

Oder genauer:

[[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
#           |^^^^^^^^ ^^^^^^ ^^^^^^  ^^^^^^ ^^^^^^^^^^ ^^^^^^ |
#           |   |     ^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^ |
#           |   |          |                   |              |
#           |   |           \                  |              |
#           | --year--   --month--           --day--          |
#           |          either 01...09      either 01..09     end of line
# start of line            or 10,11,12         or 10..29
#                                              or 30, 31

Das heißt, Sie können einen regulären Ausdruck in Bash definieren, der dem gewünschten Format entspricht. Auf diese Weise können Sie Folgendes tun:

[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"

Beachten Sie, dass dies auf der Lösung von Aleks-Daniel Jakimenko in Überprüfung des Datumsformats durch den Benutzer in Bash basiert.


In anderen Shells können Sie grep verwenden. Wenn Ihre Shell POSIX-kompatibel ist, tun Sie Folgendes

(echo "$date" | grep -Eq  ^regex$) && echo "matched" || echo "did not match"

In fish , das nicht POSIX-kompatibel ist, können Sie dies tun

echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"
272
fedorqui

In der Bash-Version 3 können Sie den Operator '= ~' verwenden:

if [[ "$date" =~ "[0-9]\{8\}" ]]; then
    echo "Valid date"
else
    echo "Invalid date"
fi

Referenz: http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF

HINWEIS: Die Anführungszeichen im entsprechenden Operator in den doppelten Klammern [[]] sind ab Bash Version 3.2 nicht mehr erforderlich

40
aliasav

Eine gute Möglichkeit, um zu testen, ob eine Zeichenfolge ein korrektes Datum aufweist, ist die Verwendung des Befehls date:

if date -d "${DATE}" >/dev/null 2>&1
then
  # do what you need to do with your date
else
  echo "${DATE} incorrect date" >&2
  exit 1
fi
28
Django Janny

Ich würde expr match anstelle von =~ verwenden:

expr match "$date" "[0-9]\{8\}" >/dev/null && echo yes

Dies ist besser als die derzeit akzeptierte Antwort auf die Verwendung von =~, da =~ auch mit leeren Zeichenfolgen übereinstimmt, was meiner Meinung nach nicht der Fall sein sollte. Angenommen, badvar ist nicht definiert, dann ergibt [[ "1234" =~ "$badvar" ]]; echo $? (falsch) 0, während expr match "1234" "$badvar" >/dev/null ; echo $? das richtige Ergebnis ergibt 1.

Wir müssen >/dev/null verwenden, um expr matchs Ausgabewert auszublenden. Dies ist die Anzahl der übereinstimmenden Zeichen oder 0, wenn keine Übereinstimmung gefunden wird. Beachten Sie, dass sich sein Ausgabewert von seinem Ausgangsstatus unterscheidet. Der Ausgangsstatus ist 0, wenn eine Übereinstimmung gefunden wurde, oder 1, wenn keine Übereinstimmung gefunden wurde.

Im Allgemeinen lautet die Syntax für expr:

expr match "$string" "$lead"

Oder:

expr "$string" : "$lead"

dabei ist $lead ein regulärer Ausdruck. Sein exit status ist wahr (0), wenn lead mit dem führenden Slice von string übereinstimmt (Gibt es einen Namen dafür?). Zum Beispiel wird expr match "abcdefghi" "abc" beendet true, aber expr match "abcdefghi" "bcd" beendet false. (Dank an @Carlo Wood, der darauf hingewiesen hat.

1
Penghe Geng

Wenn die Verwendung eines regulären Ausdrucks hilfreich sein kann, um festzustellen, ob die Zeichenfolge eines Datums korrekt ist, kann nicht einfach festgestellt werden, ob das Datum gültig ist. Die folgenden Beispiele übergeben den regulären Ausdruck, sind jedoch alle ungültige Daten: 20180231, 20190229, 20190431

Wenn Sie also überprüfen möchten, ob Ihre Datumszeichenfolge (nennen wir sie datestr) das richtige Format hat, analysieren Sie sie am besten mit date und fordern Sie date auf, die Zeichenfolge in zu konvertieren das richtige Format. Wenn beide Zeichenfolgen identisch sind, haben Sie ein gültiges Format und ein gültiges Datum.

if [[ "$datestr" == $(date -d "$datestr" "+%Y%m%d" 2>/dev/null) ]]; then
     echo "Valid date"
else
     echo "Invalid date"
fi
0
kvantour