ubuntuusers.de

Prüfen ob Variable Regex matched (Bash)

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

hannemann hat geschrieben:

Mr. Kanister hat geschrieben:

Natürlich kannst du auch das einzelne "[" oder "test" verwenden, was aber externe Kommandos sind[/quote]

Nur ein [ funktioniert nicht, deshalb fragte ich nochmal nach.

for i in $(ls /srv/www/vhosts);do if [ -d /srv/www/vhosts/$i ] && [[ "$i" =~ '.+\..+' ]]; then echo $i; fi; done;


funktioniert,

for i in $(ls /srv/www/vhosts);do if [ -d /srv/www/vhosts/$i ] && [ "$i" =~ '.+\..+' ]; then echo $i; fi; done;


funktioniert nicht.

bash: [: =~: binary operator expected
.
.
.

Gut...dann ist das einer der Unterschiede 😀 ... dass du mit dem Builtin "\[[" eine RegEx auf eine Variable anwenden kannst.

hannemann

(Themenstarter)

Anmeldungsdatum:
25. Mai 2007

Beiträge: 1310

Das nehm ich dann erstmal mal als gegeben hin...

Pumbaa80 Team-Icon

Avatar von Pumbaa80

Anmeldungsdatum:
5. März 2007

Beiträge: 2130

Wohnort: Residenz des Rechts

Mr. Kanister hat geschrieben:

(Natürlich kannst du auch das einzelne "[" oder "test" verwenden, was aber externe Kommandos sind).

Das ist nicht richtig:

$ type [; type test
[ is a shell builtin
test is a shell builtin

Gut...dann ist das einer der Unterschiede 😀 ... dass du mit dem Builtin "\[[" eine RegEx auf eine Variable anwenden kannst.[/quote]Ja, die Unterschiede sind nicht besonders zahlreich. Bei man bash unter Compound Commands sind sie zu finden.
Kurz: Es gibt neben den üblichen Tests noch "==" und "!=" mit Pattern Matching, "=~" mit Regex-Matching sowie "&&" und "||"

radoe2

Anmeldungsdatum:
30. November 2006

Beiträge: 243

Mr. Kanister hat geschrieben:

"\[[" ist das "test" Built-in der Shell, was man für normale Tests und fürs Vergleichen von Strings verwenden kann (Natürlich kannst du auch das einzelne "[" oder "test" verwenden, was aber externe Kommandos sind).

Nein, für bash ist [ ebenfalls ein Builtin. [ existiert zwar zusätzlich als Symlink /usr/bin/[, der auf /usr/bin/test zeigt, aber ohne besondere Vorkehrungen nutzt bash eben ihre eingebauten Versionen von [ bzw "test". Der Unterschied liegt einfach darin, das [ und \[[ zwei völlig unterschiedliche Sachen sind, die sich zwar teilweise ähnlich verhalten, aber doch prinzipiell unterschiedlich sind. So als Beispiel:

* \[[ hat andere/weitere Vergleichsoperatoren, das habt ihr ja schon festgestellt...
* \[[ führt im Gegensatz zu [ kein Wordsplitting und Pathname expansion durch

[ ist die Implementierung des Test Utilities für POSIX Shells mit den dort geforderten Eigenschaften, \[[ ]] ist die Bash eigene, abgewandelte und erweiterte Variante.

hannemann

(Themenstarter)

Anmeldungsdatum:
25. Mai 2007

Beiträge: 1310

Wordsplitting und Pathname expansion

Was versteht man darunter?

Pathname expansion stell ich mir so vor ~ == /home/meins

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

$ type [; type test
[ is a shell builtin
test is a shell builtin

Oh...das wusste ich nicht...ich bin davon ausgegangen, dass es externe Kommandos sind, da man sie ja auch über "which" finden kann

martin@martin-desktop:~$ which [
/usr/bin/[
martin@martin-desktop:~$ which test
/usr/bin/test


, "\[[" dagegen nicht...

Nein, für bash ist [ ebenfalls ein Builtin. [ existiert zwar zusätzlich als Symlink /usr/bin/[, der auf /usr/bin/test zeigt, aber ohne besondere Vorkehrungen nutzt bash eben ihre eingebauten Versionen von [ bzw "test".[/quote]
...womit das auch geklärt wäre 😉

besten Dank!

Gruß Martin

radoe2

Anmeldungsdatum:
30. November 2006

Beiträge: 243

hannemann hat geschrieben:

Wordsplitting und Pathname expansion

Was versteht man darunter?

Pathname expansion stell ich mir so vor ~ == /home/meins

Nein, das heisst nun gerade passenderweise Tilde Expansion 😉

Wordsplitting teilt die Daten anhand des Inhalts von IFS in einzelne "Häppchen" auf. Diese einzelnen "Worte" kann man dann verarbeiten.

Pathname Expansion ist vereinfacht gesagt das Ersetzen von *,? und [] Konstrukten, um anhand der Pattern eine Liste von Pfadnamen zu generieren.

Es gibt in man bash einen gaaaanz langen Abschnitt Namens "EXPANSION", wo das und weitere Expansionen (Parameter expansion, Command Substitution, Process substitution u.a.) erklärt sind.

hannemann

(Themenstarter)

Anmeldungsdatum:
25. Mai 2007

Beiträge: 1310

Eine Referenz a la SelfHtml oder php.net mit Suchfunktion oder so gibt es aber nicht, richtig? Schon gar nicht auf Deutsch nehme ich an.

Ich finde die man-Files recht anstrengend zu lesen... oder gibt es einen guten Reader/Browser dafür?

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

hannemann hat geschrieben:

Eine Referenz a la SelfHtml oder php.net mit Suchfunktion oder so gibt es aber nicht, richtig? Schon gar nicht auf Deutsch nehme ich an.

Ich finde die man-Files recht anstrengend zu lesen... oder gibt es einen guten Reader/Browser dafür?

Mindestens zwei Möglichkeiten:

konqueror man:bash
yelp man:bash


Ansonsten gibt es hier noch eine bessere Dokumentation.

Pumbaa80 Team-Icon

Avatar von Pumbaa80

Anmeldungsdatum:
5. März 2007

Beiträge: 2130

Wohnort: Residenz des Rechts

hannemann

(Themenstarter)

Anmeldungsdatum:
25. Mai 2007

Beiträge: 1310

Hat auch nur ne andere Farbe...

Als ich aber bei meiner manuellen FF 2 Installation die Schlüssel wieder zurückgesetzt hatte, habe ich nochmal Pawlowmässig man:bash im Browser eingetippt und siehe da, er spuckt es in einem neuen Fenster hübsch formatiert aus. Scheint der Hilfebrowser zu sein.

FF 3 macht das nicht.

Antworten |