Bash: Filename Expansion nur im Skript, aber nicht auf Dateien anwenden?

C

computerfrust

Gast
Bash: Pattern Matching nur im Skript, aber nicht auf Dateien anwenden?

Ich versuche mich momentan an Shell Scripting. Derzeit prüfe ich, ob ein Substring in einem String enthalten ist:
Der Substring beinhaltet teilweise "*"-Zeichen, damit per Pattern Matching folgende Abfrage funktioniert:

Code:
if [[ "$string" == $substring ]]

Zum Beispiel string = "Blah blubb" und substring = "Blah*" oder "*blu*".
Das funktioniert so auch, allerdings wird es hakelig, wenn im working directory irgendwelche Dateien enthalten sind, die dann gefunden werden.
Wenn zum Beispiel die Datei "bluray50" vorhanden ist, dann wird sie erkannt, als $substring eingefügt und somit erhält das if die Aussage "True" ("*blu*" wird zu "bluray50" expandiert). Obwohl mich das Dateisystem innerhalb des Skripts überaupt nicht interessiert.
Ich frage mich jetzt, ob man das umgehen kann.

Edit: Moment mal, ich sehe gerade dass die Doppelklammer [[ eigentlich Filename Expansion verhindern sollte und nur internes Pattern Matching betreiben sollte. Warum funktioniert das nicht? Muss ich da irgendeine Bash-Variable umstellen?
 
Zuletzt bearbeitet:
AW: Bash: Pattern Matching nur im Skript, aber nicht auf Dateien anwenden?

computerfrust schrieb:
Wenn zum Beispiel die Datei "bluray50" vorhanden ist, dann wird sie erkannt, als $substring eingefügt

Kann es sein, dass in deinem Skript die Dateinamen schon bei der (von dir nicht gezeigten) Zuweisung an $substing in die Variable huschen, nicht erst beim o.g. Vergleich.
 
Muß es nicht irgendwas mit "=~" sein, statt "==" ?

Vorher muß das Erweitern angeschaltet werden , wenn ich mich recht erinnere, mit

shopt -s extglob
 
== ist schon ok. Er will keine regexps. Extglob will er auch nicht. Nur einfaches pattern matching mit * und ? soweit ich es sehe.

Ich vermute weiter, der Fehler in seinem Skript liegt in einer anderen Zeile, nicht beim Vergleich. Zum Test mal unmittelbar vor dem Vergleich die Variableninhalte anzeigen lassen.
 
Zuletzt bearbeitet:
Ich hab irgendwie auch das Gefühl, dass es an etwas anderem liegt. Ich habe noch mal ein kleines Testscript geschrieben, was denselben Fehler erzeugt:

Code:
#!/bin/bash
string="SuPer duPeR Testarossa"
substrings="*TesT* sUp*"
echo "string: $string"
echo "substrings: $substrings"

string=${string,,}
substrings=${substrings,,}
echo "string lower case: $string"
echo "substrings lower case: $substrings"

for sub in $substrings
do
if [[ "$string" == $sub ]]
then
echo "FOUND: $sub"
else
echo "NOT FOUND: $sub"
fi
done

Und die Ausgabe ist dann, weil Dateien mit "test" im Dateinamen im Verzeichnis liegen:
Code:
string: SuPer duPeR Testarossa
substrings: *TesT* sUp*
string lower case: super duper testarossa
substrings lower case: *test* sup*
NOT FOUND: test
NOT FOUND: test2
NOT FOUND: test2.sh
NOT FOUND: test.sh
FOUND: sup*
Ergänzung ()

Tumbleweed schrieb:
Bin mir nicht ganz sicher, ob ich dein Problem verstehe. Warum nutzt du nicht =~ ?
Vielleicht steige ich auf Regex um, wenn es nicht anders geht. Ist wohl auch flexibler. Danke für den Hinweis.
Ergänzung ()

Sorry für die ganzen E-Mails. Ich glaube, der Fehler liegt in Zeile 12, wegen "in $substring". Ich glaube, genau an der Stelle wird schon erweitert. Ich weiß aber nicht, wie ich das verhindern kann.
 
Zuletzt bearbeitet: (fi done)
Dann passiert das hier:

Code:
NOT FOUND: *test* sup*

Dann werden die einzelnen Wörter nicht mehr aufgeschlüsselt.
 
Jop, aber das ist nun wieder ein ganz anderes Problem. Die Dateinamen fängst du dir nun nicht mehr ein. :) Hmm, mal überlegen ...
Ergänzung ()

Mir fällt im Moment nichts besseres ein, als pathname expansion abzuschalten. Dann funzt die alte Variante:

set -f
for sub in $substrings
 
Zuletzt bearbeitet:
Ist doch eine super Lösung. Ich mache jetzt einfach vor der Schleife set -f und nach dem "done" wieder set +f. Scheint zu klappen, vielen Dank!
 
Zurück
Oben