.titleBar { margin-bottom: 5px!important; }

[Erledigt] Freetz: Wildcards im Script funktionieren nicht

Dieses Thema im Forum "Freetz" wurde erstellt von VirtuellOriginell, 4 Aug. 2018.

  1. VirtuellOriginell

    VirtuellOriginell Neuer User

    Registriert seit:
    11 Sep. 2017
    Beiträge:
    17
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Tach Gemeinde,
    schreibe ein Script welches überprüft ob die eingegebene Uhrzeit das korrekte Format hat oder nicht.
    Auf dem Linux Desktop funktioniert es damit

    if [[ "$1" == [0-2][0-9]":"[0-9][0-9] ]]

    Unter Freetz leider nicht :(


    Hat jemand ne Idee wo mein Denkfehler liegt?
     
  2. Micha0815

    Micha0815 Aktives Mitglied

    Registriert seit:
    25 Feb. 2008
    Beiträge:
    2,529
    Zustimmungen:
    74
    Punkte für Erfolge:
    48
    Beruf:
    Stauberater
    10:93 Uhr sähe verblüffend aus imo?
    LG
     
  3. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,072
    Zustimmungen:
    526
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    "ash" ist keine "bash". Oder funktioniert das auf dem Linux-Desktop auch in der "ash" der BusyBox?

    Wer solche Sachen POSIX-freundlich gestalten will, verwendet das "expr"-Utility (aber auch nur mit der POSIX-Syntax, es gibt BSD-Varianten mit abweichenden Parametern).

    Dabei versucht man einfach ein (capturing) Match mit einem regulären Ausdruck (einfache Syntax, nicht "extended") und prüft das Ergebnis ... ist es "leer", paßte der Ausdruck nicht auf den gegebenen Wert.

    Beispiel: https://github.com/PeterPawn/YourFritz/blob/master/scriptlib/functions/yf_base64_decode.function#L39 - hier wird getestet, ob die Zeile tatsächlich nur aus den Zeichen besteht, die im Base64-Vorrat erlaubt sind.
     
  4. tuxedonet

    tuxedonet Neuer User

    Registriert seit:
    20 Sep. 2015
    Beiträge:
    108
    Zustimmungen:
    3
    Punkte für Erfolge:
    18
    der regex-Ausdruck sieht sehr "unglücklich" aus;
    Verbesserungsvorschlag:
    diese Befehlssequenz mit "echo "$1" ... " sollte mit Pipe to "wc -l" in Verbindung mit "-eq 1" auch als if-Abfrage umsetzbar sein.
     
  5. koyaanisqatsi

    koyaanisqatsi IPPF-Urgestein

    Registriert seit:
    24 Jan. 2013
    Beiträge:
    10,577
    Zustimmungen:
    115
    Punkte für Erfolge:
    63
    Für die busybox ash und egrep mal flux eine Funktion getestet...
    Code:
    # test(){ if [ $(echo $1 | egrep '([01][0-9]|2[0-3]):[0-5][0-9]') ]; then echo ok; else echo fail; fi }
    # test 99:99
    fail
    # test 23:59
    ok
    # test 00:00
    ok
     
  6. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,072
    Zustimmungen:
    526
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    Einen solchen Test auf "null string" als Inhalt von STDOUT einer Sub-Shell sieht man nicht soo häufig und selbst viele, die schon mal ein Shell-Skript geschrieben haben, müssen diese Syntax-Form nicht zwingend kennen.

    Und wehe, diese Ausgabe enthält dann mehr als einen Wert (auch wenn das in #5 wegen des Ausdrucks nicht möglich ist (wenn man den Eingabewert vorher schon getestet hat, komme ich gleich noch einmal drauf zurück), bleibt es beim "Adaptieren" eine Falle, so man den Unterschied nicht kennt):
    Code:
    vidar:/tmp # test $(echo) && printf "true" || printf "false";printf "\n"
    false
    vidar:/tmp # test $(echo 1) && printf "true" || printf "false";printf "\n"
    true
    vidar:/tmp # test $(echo 1 2) && printf "true" || printf "false";printf "\n"
    bash: test: 1: unary operator expected
    false
    vidar:/tmp # test "$(echo 1 2)" && printf "true" || printf "false";printf "\n"
    true
    vidar:/tmp # [ $(echo 1 2) ] && printf "true" || printf "false";printf "\n"
    bash: [: 1: unary operator expected
    false
    vidar:/tmp #
    
    Daher mein Tipp: Wenn man "die Wahl" hat, sollte man es (meine Meinung) dem "Leser" einfacher machen und tatsächlich einen Vergleich benutzen und sich nicht (erst recht nicht bei der Form von "test" mit den eckigen Klammern) auf die "test <string>"-Syntax verlassen und man sollte auch immer damit rechnen, daß ja mal ein "unerwarteter" Wert auftauchen könnte (hier für "$1" in der "test"-Funktion) und daher prinzipiell alle Zeichenketten (und die STDOUT einer Sub-Shell gehört definitiv dazu, denn was passiert denn beim Aufruf von
    Code:
    vidar:/tmp # test(){ if [ $(echo $1 | egrep '([01][0-9]|2[0-3]):[0-5][0-9]') ]; then echo ok; else echo fail; fi }
    vidar:/tmp # test "01:00 02:00"
    bash: [: 01:00: unary operator expected
    fail
    vidar:/tmp #
    
    ) passend ein- bzw. umschließen, dann kann das auch keine bösen Überraschungen geben:
    Code:
    vidar:/tmp # test(){ if [ "$(echo $1 | egrep '([01][0-9]|2[0-3]):[0-5][0-9]')" ]; then echo ok; else echo fail; fi }
    vidar:/tmp # test "01:00 02:00"
    ok
    vidar:/tmp #
    
    ... ob das dann tatsächlich noch "ok" ist oder nicht, muß jeder selbst entscheiden.

    Denn so ein "egrep" liefert eben auch dann noch ein Ergebnis, wenn das nur irgendwo in der Zeile steht:
    Code:
    vidar:/tmp # echo "01:00" | egrep '([01][0-9]|2[0-3]):[0-5][0-9]'
    01:00
    vidar:/tmp # echo "01:00 02:00" | egrep '([01][0-9]|2[0-3]):[0-5][0-9]'
    01:00 02:00
    vidar:/tmp # echo "01:00 02:00 ABCDEFGH" | egrep '([01][0-9]|2[0-3]):[0-5][0-9]'
    01:00 02:00 ABCDEFGH
    
    ... also sollte man noch zusätzlich die Forderung aufstellen, daß die gesamte Zeile auf das Muster paßt:
    Code:
    vidar:/tmp # echo "01:00 02:00 ABCDEFGH" | egrep '^([01][0-9]|2[0-3]):[0-5][0-9]$'
    vidar:/tmp # echo "01:00" | egrep '^([01][0-9]|2[0-3]):[0-5][0-9]$'
    01:00
    vidar:/tmp #
    
    Fazit:
    Manchmal ist es tatsächlich eine Herausforderung, Shell-Code so zu formulieren, daß er auch wirklich "idiotensicher" ist und sich auch von unerwarteten Eingabewerten nicht wirklich aus der Ruhe bringen läßt. :D
     
  7. VirtuellOriginell

    VirtuellOriginell Neuer User

    Registriert seit:
    11 Sep. 2017
    Beiträge:
    17
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    #7 VirtuellOriginell, 4 Aug. 2018
    Zuletzt bearbeitet: 5 Aug. 2018
    Ja auf dem Linux läuft 'ne Bash-shell, und eigentlich sollte auch Freetz auch Bash können, ist im Image drin.

    Edit hab etwas rum gespielt, dies scheint zu funktionieren.
    Code:
    if [ $(echo $1 |egrep '^([0-2][0-9]):[0-5][0-9]$' |wc -c) -gt 1 ]
       then
       echo $1 > zeitstempel.txt
       
    elif [ $(echo $1 |egrep '^([0-9]):[0-5][0-9]$' |wc -c) -gt 1 ]
       then
       echo "0"$1 > zeitstempel.txt
       
    elif [ $(echo $1 |egrep '^([012][0-9]):[0-5]$' |wc -c) -gt 1 ]
       then
       echo $1"0" > zeitstempel.txt
       
    elif [ $(echo $1 |egrep '^([0-9]):[0-5]$' |wc -c) -gt 1 ]
       then
       echo "0"$1"0" > zeitstempel.txt
    
    else
       echo "Bärenjagt"
       echo $(date +%H:%M) > zeitstempel.txt
    fi
    
    cat zeitstempel.txt
    
    
    until [ "$(date +%R)" == "$(head -n1 zeitstempel.txt)" ]; do
       sleep 1
       echo $(date +%T) "Weißer Hase" $(tail -n1 zeitstempel.txt)
    done
    
    echo $(date +%T) "Jäger mit dem Schießgewehr"
    rm zeitstempel.txt
    
    Was ich aber nicht verstehe wozu brauch ich die () runden Klammern vor den eckigen Klammern? Ist das wegen des Doppelpunktes?
     
  8. frater

    frater Mitglied

    Registriert seit:
    23 Nov. 2008
    Beiträge:
    398
    Zustimmungen:
    1
    Punkte für Erfolge:
    18
    #8 frater, 7 Aug. 2018
    Zuletzt bearbeitet: 7 Aug. 2018
    I mache das immer so
    Funktioniert immer, auch mit busybox

    Code:
    if echo $1 | grep -q '^[0-2][0-9]:[0-9][0-9]$' ; then
    oder

    Code:
    echo $1 | grep -q '^[0-2][0-9]:[0-9][0-9]$' || echo "Nicht gut"
     
  9. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,072
    Zustimmungen:
    526
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    #9 PeterPawn, 8 Aug. 2018
    Zuletzt bearbeitet: 8 Aug. 2018
    @frater:
    Das hängt sicherlich auch davon ab, ob man "29:99" für "gut" oder "nicht gut" hält.

    Es gibt immer viele Möglichkeiten in Shell-Code, aber ich würde immer zu etwas wie diesem greifen, weil das tatsächlich überall funktionieren sollte, wo POSIX verstanden wird - von der "bash" über die "dash" bis zur "ash" in der BusyBox:
    Code:
    vidar:~ $ validate_time() { [ "$(expr \( "$1" : '^\(\([0-1 ]\?[0-9]\|2[0-3]\):[0-5][0-9]\)$' \) )" = "$1" ] && printf "ok\n" || printf "wrong time specified\n"; }
    vidar:~ $ validate_time "0:00"
    ok
    vidar:~ $ validate_time "10:00"
    ok
    vidar:~ $ validate_time " 0:00"
    ok
    vidar:~ $ validate_time "0 :00"
    wrong time specified
    vidar:~ $ validate_time "23:59"
    ok
    vidar:~ $ validate_time "24:00"
    wrong time specified
    vidar:~ $
    
    Das sollte eigentlich jede gültige Zeitangabe (24-h-Format) abdecken, von zweistelligen Stundenangaben bis zu einstelligen, mit oder ohne Leerzeichen vor der Ziffer bei einstelligem Wert und das alles ohne "wc"-Geraffel.

    Man kann das natürlich auch gleich ohne den Parameter ($1) einsetzen und bei "ok" einfach den Wert in die Datei schreiben, ansonsten eben den Ersatz wie oben im "else".

    Wenn ich mich nicht vertan habe, läßt sich das auch nicht durch unerwartete Eingabewerte aus dem Tritt bringen.

    EDIT:
    Wenn man will, kann man auch gleich noch die Werte "umformatieren" lassen, so daß sie immer zweistellig sind:
    Code:
    vidar:~ $ validate_time() { [ "$(expr \( "$1" : '^\(\([0-1 ]\?[0-9]\|2[0-3]\):[0-5][0-9]\)$' \) )" = "$1" ] && printf "%02u:%02u\n" $(( ${1%%:*} )) $(( ${1##*:} )) || printf "wrong time specified\n"; }
    vidar:~ $ validate_time "9:16"
    09:16
    vidar:~ $
    
    und auch der Fall mit einer einstelligen Minutenangabe (eher exotisch, etwas wie "11:8 Uhr" sieht man nur sehr selten und der dritte und vierte Fall in #7 sollten ohnehin falsch sein, wenn man "11:5 Uhr" nicht als "11:50 Uhr" ansehen will, was ich nun noch merkwürdiger fände) ist mit einem "\?" nach dem "[0-5]" im regulären Ausdruck noch eingeschlossen:
    Code:
    vidar:~ $ validate_time() { [ "$(expr \( "$1" : '^\(\([0-1 ]\?[0-9]\|2[0-3]\):[0-5]\?[0-9]\)$' \) )" = "$1" ] && printf "%02u:%02u\n" $(( ${1%%:*} )) $(( ${1##*:} )) || printf "wrong time specified\n"; }
    vidar:~ $ validate_time "9:6"
    09:06
    vidar:~ $
    
    EDIT2: Da war noch eine Gruppierung zuviel bei der Stunde (nicht falsch, aber unnötig), die habe ich entfernt.
     
  10. woprr

    woprr Aktives Mitglied

    Registriert seit:
    10 Juni 2007
    Beiträge:
    2,990
    Zustimmungen:
    5
    Punkte für Erfolge:
    38
    Arbeitest Du immer als root? Ganz schön gefährliches Beispiel...
     
  11. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,072
    Zustimmungen:
    526
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    Besser jetzt? Die Raute muß auch nicht automatisch "root" heißen.

    Der Prompt ist ohnehin - wie meist die gesamte Ausgabe - editiert (früher gab's die Farben zur Unterscheidung zwischen Ein- und Ausgabe auch noch in den CODE-Kästen zu sehen) ... da ich bei solchen Sachen auch nicht immer wirklich im eigenen Home-Verzeichnis arbeite (bzw. auch die Tilde für $HOME normalerweise bei mir gar nicht angezeigt wird, sondern der absolute Pfad), verschleiere ich auf diesem Weg auch den Benutzernamen (denke ich fast immer dran) und da kann es auch mal passieren, daß ich eine Raute eintrage bzw. nicht "richtig" ersetze.

    Denn normalerweise habe ich sogar folgendes (sinngemäß und schon stark zusammengekürzt, hoffentlich immer noch richtig) in der ".profile" stehen - noch schön bunt mit Escape-Sequenzen, aber umschaltbar anhand des Terminal-Typs und mit besonderer Farbe, falls ich tatsächlich mal "root" bin, was bei einem GitHub-Repository für die FRITZ!Box gar nicht sooo verkehrt ist, weil dann UID/GID beim Klonen und in TAR-Files, die aus diesen Dateien gepackt werden, schon stimmen:
    Code:
    export PROMPT_COMMAND='LASTRC=$?;echo -en "\n$LASTRC | $(hostname -s):$USER:$PWD | ${SSH_TTY:-\$}${SSH_TTY:+#}\007 "'
    export PS1=
    
    ... das ergibt dann z.B.:
    Code:
    0 | vidar:peh:/home/GitHub/YourFritz/eva_tools | /dev/pts/0#
    
    Warum mache ich das?
    • weil ich den "normalen" Prompt mit dem Dollar nicht mag, wenn ich per SSH unterwegs bin (was auch fast immer der Fall ist) und eine "screen"-Session benutze, so sehe ich auch immer, ob es SSH ist oder nicht und soo groß ist die Auswahl an (unmißverständlichen) Prompt-Sonderzeichen nun auch wieder nicht, daß ich die Raute für "root" reservieren möchte (die Farbe ist ohnehin eindeutiger)
    • und weil ich dann mit Suchen und Ersetzen arbeiten kann beim Editieren von kopiertem Terminal-Inhalt für solche CODE-Kästen, was bei Dollarzeichen (gerade bei Shell-Code) und beim Editieren im "vi" immer passende Escapes braucht und ziemlich nervig sein kann (mein Browser kann das mit dem Suchen und Ersetzen(!) beim Schreiben eines Beitrags jedenfalls nicht und ich muß das immer außerhalb aufbereiten)
    • und weil ich - gerade bei länger laufenden Kommandos - das "bell" als akustisches Zeichen für "fertig" haben möchte (dann blinkt auch die Session im "screen" immer so nett in der Statuszeile, falls es mal nicht quietscht) - dieses "beep" gibt es allerdings auch ansonsten ständig, wenn eine "tab completion" noch nicht eindeutig ist, das kriege ich (leider) schon meist gar nicht mehr richtig mit
    • und weil ich gleichzeitig gerne den letzten Exit-Code wissen möchte (alte Angewohnheit aus meiner Großrechner-Vergangenheit und aus SCO-Tagen) - sogar noch in bunt beim passenden Terminal, damit man <> 0 auf einen Blick erkennen kann - häufig habe ich mehr als eine Session (sowohl im SSH-Client als auch im "screen" in so einer SSH-Session) offen und kehre erst ins Terminal zurück, wenn ein Kommando beendet ist
    Am Ende hat bei mir die "bash" fast mehr zu tun, wenn sie den Prompt anzeigen soll, als wenn ich irgendein Kommandos ausführen lasse und meist kommt meine Eingabe auch erst auf die nächste Zeile, weil da (sofern es keine lokale Session im LAN ist) noch die Angabe zur SSH-Connection hinzukommt. Dann kommt (abhängig von der Länge des Prompts) gleich ein "\n" ans Ende anstelle des Leerzeichens ... das ist dann auch eine gute Lösung und man kriegt die Eingabe (auch beim Editieren vorhergehender Kommandos) noch auf eine einzelne Terminal-Zeile in der Regel, was ansonsten schnell schwierig wird.
     
  12. woprr

    woprr Aktives Mitglied

    Registriert seit:
    10 Juni 2007
    Beiträge:
    2,990
    Zustimmungen:
    5
    Punkte für Erfolge:
    38
    Schon gut! Wollt nur drauf hinweisen wegen der Anfänger hier, weil Du ja immer ganze Vorlesungen hältst :D
     
  13. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,072
    Zustimmungen:
    526
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    Schon gut ... die erkennen dann aber auch nicht unbedingt, daß "üblicherweise" die Raute das "\$" im PS1 für den Superuser ist.
     
  14. frater

    frater Mitglied

    Registriert seit:
    23 Nov. 2008
    Beiträge:
    398
    Zustimmungen:
    1
    Punkte für Erfolge:
    18
    ;)

    Die regexp selbst habe ich nicht kontrolliert.
    Das war doch nicht das Thema?

    Ich meine die weise wie man das schreibt.
    Es ist viel einfacher zu lesen und funktioniert in (glaube ich) alle shell varianten.

    Schön das man mit Bash inline schöne Sachen machen kann, aber es sieht schnell ganz kryptisch aus und auch die viele Klammern machen es auch nicht schöner.
     
  15. Joe_57

    Joe_57 IPPF-Promi

    Registriert seit:
    5 März 2006
    Beiträge:
    5,100
    Zustimmungen:
    49
    Punkte für Erfolge:
    48
    Warum ändert du dann die Sequenz nicht wenigstens so ab, wie es @koyaanisqatsi in Beitrag #5 beschrieben hat?
     
  16. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,072
    Zustimmungen:
    526
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    Wenn man Kopfschmerzen hinsichtlich der "Lesbarkeit" hat, sollte man einen Kommentar dazuschreiben und erklären, was da nach eigener Ansicht passieren soll.

    So, wie Du es vorschlägst, sieht es zwar "ganz einfach" aus, kann aber genauso einfach auch zur Fehlfunktion gebracht werden. Probier das mal mit
    Code:
    $1="--"
    
    ... und daß ein Ersetzen eines einzelnen (korrekten) regulären Ausdrucks durch vier verschiedene - "damit die Komplexität nicht so hoch ist" - nicht zwangsläufig besser und richtiger ist, siehst Du in #7, wenn Du genau nachliest.

    Ich bin auch für einfache und klare Lösungen und finde komplizierte "if-then-else"-Abfragen (möglichst noch mit Negation bei einem Vergleich und diversen Klammern für den Vorrang (die braucht es nun mal häufig, um eine zweifelsfreie Reihenfolge der Auswertung zu garantieren) und diversen Umformungen nach Boolescher Algebra) am Ende viel schlimmer, als einen solchen regulären Ausdruck, den man genau ein einziges Mal analysiert und dann sofort (einfaches "if-then-else", ohne jede Schachtelung) sehen kann, was beim Erfolg oder Mißerfolg geschehen soll.

    Komplexität bringen erst die erwähnten Konstruktionen in irgendwelchen Code ... da sind die vier "Zweige" in #7 ein schönes Beispiel - wobei hier wenigstens noch die "Rahmenbedingungen" um das "egrep" dieselben sind in allen vier Zweigen (und man sich damit bei der Analyse auf die Auswertung des regulären Ausdrucks (hier dann eben 4x) beschränken kann, wobei man die "unterschiedlichen Reaktionen" auch noch ansehen und verstehen muß), was auch nicht selbstverständlich so sein muß.
     
  17. frater

    frater Mitglied

    Registriert seit:
    23 Nov. 2008
    Beiträge:
    398
    Zustimmungen:
    1
    Punkte für Erfolge:
    18
    #17 frater, 8 Aug. 2018
    Zuletzt bearbeitet: 8 Aug. 2018
    So wurde ich koyaanisqatsi's "if statement" schreiben und auf dieser weise mach ich das immer in Bash scripts.
    Nur ein wenig anders.
    Liest sich auch besser (nach meiner Meinung)

    Es geht darum das "[ $( .... ) ]" uberflussig ist und dass die doppelquote notwendig ist.

    Code:
    #
    # timecheck(){ if echo "$1" | egrep -q '([01][0-9]|2[0-3]):[0-5][0-9]' ; then echo ok; else echo fail; fi }
    # timecheck 99:99
    fail
    # timecheck 23:59
    23:59
    ok
    # timecheck 00:00
    00:00
    ok
    
    @PeterPawn In mein eigene scripts vergesse ich niemahls die doppel-quotes. Ist das was du meinst?
    Kein Fehlfunktion die ich sehe.

    Code:
    # timecheck --:00
    fail
    # timecheck --
    fail
    
     
  18. Joe_57

    Joe_57 IPPF-Promi

    Registriert seit:
    5 März 2006
    Beiträge:
    5,100
    Zustimmungen:
    49
    Punkte für Erfolge:
    48
    Sorry, ich hatte mich da leicht vertan!
    Ich meinte eigentlich den Vorschlag von @tuxedonet aus Beitrag #4.
     
  19. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,072
    Zustimmungen:
    526
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    @frater:
    Ich weiß langsam nicht mehr, worauf Du hinauswillst.

    Ja, für mich gehören immer "quotes" um eine Zeichenkette, denn das sind zwei vollkommen unterschiedliche Ergebnisse:
    Code:
    vidar:~ $ a="-e \007"
    vidar:~ $ echo $a
    
    vidar:~ $ echo "$a"
    -e \007
    vidar:~ $
    
    Und daß Dein Code in #17:
    Code:
    # timecheck(){ if echo "$1" | egrep -q '([01][0-9]|2[0-3]):[0-5][0-9]' ; then echo ok; else echo fail; fi }
    
    auch bei falscher Eingabe nicht wirklich etwas merkt, dürfte offensichtlich sein:
    Code:
    vidar:~ $ timecheck(){ if echo "$1" | egrep -q '([01][0-9]|2[0-3]):[0-5][0-9]' ; then echo ok; else echo fail; fi }
    vidar:~ $ timecheck "01:23 Ich bin mit ziemlicher Sicherheit keine gültige Uhrzeit."
    ok
    vidar:~ $ timecheck "Auch dann nicht, wenn die Zeit irgendwo - z.B. hier: 01:23 - in der Mitte steht."
    ok
    vidar:~ $
    
     
  20. frater

    frater Mitglied

    Registriert seit:
    23 Nov. 2008
    Beiträge:
    398
    Zustimmungen:
    1
    Punkte für Erfolge:
    18
    Es war mir niemahls um die regexp zu tun.
    Die OP hat dieser if aufbau genommen:
    Code:
    if [[ "$1" == [0-2][0-9]":"[0-9][0-9] ]] ; then
    Später hat jemand:
    Code:
    if [ $(echo $1 |egrep '^([0-2][0-9]):[0-5][0-9]$' |wc -c) -gt 1 ] ; then


    Das einzige was ich teilen wollte war das as auch so kann:
    Code:
    if  echo "$1" | egrep -q "^${regexp}$" ; then
    Und es stimmt das ich nicht alle Eintragen gut gelesen habe, aber immer noch ist es ein Beitrag..