Bedingungen einer If-Prüfung mit Leerzeichen und Position im String

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Bedingungen einer If-Prüfung mit Leerzeichen und Position im String

Beitrag von Richard » 10.07.2019 10:33:14

Hallo,

ich benutze auf den Pi einen Kommandozeilenserver für den Messanger Telegram um über mein Handy recht einfach Kommandos an den Pi zu senden, z. B. Downloadlinks. Der Nachricht wird dann 1:1 an ein Script weitergereicht und dort entsprechend der Nachricht ausgewertet. Unter anderem kann ich so aus meinen Rechner und meinen HTPC hochfahren lassen, wenn ich z. B. die Nachricht boot ubuntu sende. Im Script hab ich dann if-elif-abfragen. Da auf dem Smartphone manchmal die Tastatur zwischen Groß- und Kleinschreibung hängt und ich auch vergesse in welcher Reihenfolge ich die beiden Wörter eingetragen habe, ist die Bedingungen für if diese:

Code: Alles auswählen

if [[ $i =~ [bB][oO] [oO][tT] ]] && [[ $i =~ [uU][bB][uU][nN][tT][uU] ]]; then
Dann wird mit etherwake gestartet. Jetzt hab ich mal einen Downloadlink gesendet der blöderweise die Wörter ubuntu und boot enthielt und statt die ISO herunterzuladen startete mein PC. Kann man das etwas umändern, so dass nur noch bei

Code: Alles auswählen

[bB][oO] [oO][tT] [uU][bB][uU][nN][tT][uU]
oder

Code: Alles auswählen

[uU][bB][uU][nN][tT][uU] [bB][oO] [oO][tT]
etwas ausgeführt wird? Also mit Leerzeichen dazwischen und boot/ubuntu als erstes bzw. letztes Wort? Wieso müsste ich das kennzeichnen, dass vorher/nachher nicht kommen darf und wie mache ich das Leerzeichen deutlich?

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Bedingungen einer If-Prüfung mit Leerzeichen und Position im String

Beitrag von uname » 10.07.2019 10:59:18

Bei regulären Ausdrücken kannst du den Anfang (^) und das Ende ($) definieren.
Mich wundert, warum du keine Anführungszeichen (") benutzt bzw. benötigtst.
Ich bin mir nicht sicher, ob das mit ^ und $ auch ohne Anführungszeichen funktioniert.

Code: Alles auswählen

^[bB][oO] [oO][tT] [uU][bB][uU][nN][tT][uU]$
"^[bB][oO] [oO][tT] [uU][bB][uU][nN][tT][uU]$"

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Bedingungen einer If-Prüfung mit Leerzeichen und Position im String

Beitrag von Richard » 10.07.2019 11:57:17

Ich dachte wenn ich Anführungszeichen verwende wird das nocht mehr als regulärer Ausdruck verstanden sondern so wie es da steht, also die eckige Klammer als eben eckige Klammer.

RobertDebiannutzer
Beiträge: 385
Registriert: 16.06.2017 09:52:36

Re: Bedingungen einer If-Prüfung mit Leerzeichen und Position im String

Beitrag von RobertDebiannutzer » 10.07.2019 17:02:55

In "man bash" steht dazu:
An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered a POSIX extended regular expression and matched accordingly (as in regex(3)). [...] Any part of the pattern may be quoted to force the quoted portion to be matched as a string. Bracket expressions in regular expressions must be treated carefully, since normal quoting characters lose their meanings between brackets. If the pattern is stored in a shell variable, quoting the variable expansion forces the entire pattern to be matched as a string.
Demnach sollten die Zeichen "^" und "$" ohne Anführungszeichen richtig interpretiert werden. Mit Anführungszeichen - das hast Du richtig verstanden - wird Dein Suchmuster nicht mehr als regex interpretiert.
Allerdings hat bash tatsächlich ein Problem mit Leerzeichen:

Code: Alles auswählen

user@host:~$ if [[ "ha llo" =~ ^ha llo$ ]]; then echo true; fi
bash: syntax error in conditional expression
bash: syntax error near `llo$'
Das kannst Du auf drei Weisen umgehen:

Code: Alles auswählen

user@host:~$ if [[ "ha llo" =~ ^"ha llo"$ ]]; then echo true; fi
true
oder

Code: Alles auswählen

user@host:~$ regex="^ha llo$"
user@host:~$ if [[ "ha llo" =~ $regex ]]; then echo true; fi
true
oder

Code: Alles auswählen

user@host:~$ if [[ "ha llo" =~ ^ha\ llo$ ]]; then echo true; fi
true
Zur Info: Ich nutze bereits Debian buster, meine bash Version ist somit "GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)".

Benutzeravatar
Tintom
Moderator
Beiträge: 3033
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Bedingungen einer If-Prüfung mit Leerzeichen und Position im String

Beitrag von Tintom » 10.07.2019 18:59:34

Ich würde hier anders vorgehen. Anstelle von zahlreichen if-Konstruktionen würde ich mit case arbeiten.
Sofern du Bash verwendest und sonst nichts dagegen spricht, könntest du die Bash anweisen, Variablen als nicht case-sensitive zu betrachten. Das geht mit shopt -s nocasematch. Die Leerzeichen würde ich komplett ignorieren. Das alles zusammen ergibt:
#!/bin/bash
shopt -s nocasematch
<...hier steht dein Skript...>
i=Bootubuntu
case $i in
bootubuntu|ubuntuboot)
echo Boote Ubuntu
;;
*)
echo Tue nichts.
;;
esac

Antworten