BASH: conditional binary operator expected

Bash, Shell, PHP, Python, Perl, CGI
prodigy7
Posts: 7
Joined: 2006-09-12 15:22

BASH: conditional binary operator expected

Post by prodigy7 » 2006-09-12 15:27

Hallo zusammen,

mein erster Post hier im Forum und gleich eine Frage :-)

Ich hab folgende Zeile

Code: Select all

[[ "$NAMELINE" =~ ""([^']*)"" ]] && XENHOSTNAME=${BASH_REMATCH[1]}'
Funktioniert mit BASH Version 3.1.17 einwandfrei, BASH Version 2.05b.0 hat aber ein Problem damit:
conditional binary operator expected
syntax error near `=~'
Gibts da irgendeinen Trick oder unterstützt die BASH-Version das Feature noch nicht? Wenn das so sein sollte: Wie kann ich mir üblichen GNU Utils (möglichst kein Perl, Ruby oder was es sonst so für Programmiersprachen gibt - soll auf einem System laufen mit "minimaler" Ausstattung) das ganze "nachbilden" ? Mir ist es wichtig, den Match als Ergebnis in eine Variable zu schreiben.

prodigy7

User avatar
Joe User
Project Manager
Project Manager
Posts: 11602
Joined: 2003-02-27 01:00
Location: Hamburg

Re: BASH: conditional binary operator expected

Post by Joe User » 2006-09-12 15:41

Code: Select all

s/=~/~=/
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

prodigy7
Posts: 7
Joined: 2006-09-12 15:22

Re: BASH: conditional binary operator expected

Post by prodigy7 » 2006-09-12 15:44

Joe User wrote:

Code: Select all

s/=~/~=/

Code: Select all

[[ "$NAMELINE" ~= ""([^']*)"" ]] && XENHOSTNAME=${BASH_REMATCH[1]}'
-bash: conditional binary operator expected
-bash: syntax error near `~='

Roger Wilco
Administrator
Administrator
Posts: 6001
Joined: 2004-05-23 12:53

Re: BASH: conditional binary operator expected

Post by Roger Wilco » 2006-09-12 16:11

Der Operator =~ existiert erst seit Bash Version 3, siehe z. B. http://www.tldp.org/LDP/abs/html/bashver3.html. Um trotzdem an den gewünschten Part zu kommen, würde ich sed empfehlen...

prodigy7
Posts: 7
Joined: 2006-09-12 15:22

Re: BASH: conditional binary operator expected

Post by prodigy7 » 2006-09-12 16:14

Roger Wilco wrote:Um trotzdem an den gewünschten Part zu kommen, würde ich sed empfehlen...
Kannst du mir netterweise zeigen, wie obiges in sed aussehen würde?

mattiass
Userprojekt
Userprojekt
Posts: 608
Joined: 2005-12-16 17:57

Re: BASH: conditional binary operator expected

Post by mattiass » 2006-09-12 16:25

prodigy7 wrote:
Roger Wilco wrote:Um trotzdem an den gewünschten Part zu kommen, würde ich sed empfehlen...
Kannst du mir netterweise zeigen, wie obiges in sed aussehen würde?
Warum nicht mit "grep"?

echo $VARIABLE | grep -e 'regulärer ausdruck'

Grep kommt mit 0 zurück, wenn der String matcht und mit verschieden von Null, wenn er nicht matcht...

prodigy7
Posts: 7
Joined: 2006-09-12 15:22

Re: BASH: conditional binary operator expected

Post by prodigy7 » 2006-09-12 16:27

MattiasS wrote:Grep kommt mit 0 zurück, wenn der String matcht und mit verschieden von Null, wenn er nicht matcht...
Weil ich den Match gerne weiterverwenden möchte. Nur das wissen, das es Matched, bringt mir nichts.

Roger Wilco
Administrator
Administrator
Posts: 6001
Joined: 2004-05-23 12:53

Re: BASH: conditional binary operator expected

Post by Roger Wilco » 2006-09-12 16:28

Du kannst das Ergebnis von grep in einer Variablen speichern, die du weiterbenutzt.

Du willst dich ein wenig mit Shellscripting beschäftigen. ABS wäre mal ein Anfang.

mattiass
Userprojekt
Userprojekt
Posts: 608
Joined: 2005-12-16 17:57

Re: BASH: conditional binary operator expected

Post by mattiass » 2006-09-12 16:35

prodigy7 wrote:
MattiasS wrote:Grep kommt mit 0 zurück, wenn der String matcht und mit verschieden von Null, wenn er nicht matcht...
Weil ich den Match gerne weiterverwenden möchte. Nur das wissen, das es Matched, bringt mir nichts.
Dann doch vielleicht sed. Vielleicht lässt sich Dein Problem aber auch einfacher lösen. Evtl genügt eine Änderung des Feldseparators oder vielleicht findet man mit awk schnell das gewünschte Feld. Bring doch mal ein Beispiel...

prodigy7
Posts: 7
Joined: 2006-09-12 15:22

Re: BASH: conditional binary operator expected

Post by prodigy7 » 2006-09-12 16:41

MattiasS wrote:Dann doch vielleicht sed. Vielleicht lässt sich Dein Problem aber auch einfacher lösen. Evtl genügt eine Änderung des Feldseparators oder vielleicht findet man mit awk schnell das gewünschte Feld. Bring doch mal ein Beispiel...
Also es handelt sich um eine Zeile, die ich aus der XEN-Konfiguration rausgreppe:
vif = [ 'bridge=xenbr0,vifname=vif1.0' ]
Nun möchte ich wissen, wie das IF heißt dass dort konfiguriert ist.
Hierfür funktioniert

Code: Select all

[[ "$VIFLINE" =~ ".*vifname=([^']*).*" ]] && XENVIF=${BASH_REMATCH[1]}
($VIFLINE ist die besagte Zeile) ganz gut in den neueren BASH-Versionen. Nur bei alten BASH-Versionen, wie sie zB auch noch in Debian Sarge im Einsatz sind, klappt das nicht. Ich brauch also einen anderen Weg, an den Namen des IF zu kommen. Wichtig ist dabei, das ich micht nicht auf die Reihenfolge der Parameter verlassen kann.

Roger Wilco
Administrator
Administrator
Posts: 6001
Joined: 2004-05-23 12:53

Re: BASH: conditional binary operator expected

Post by Roger Wilco » 2006-09-12 16:52

Code: Select all

$ echo "vif = [ 'bridge=xenbr0,vifname=vif1.0' ]" | sed -e "s/.*vifname=([^']*).*/1/"
vif1.0

mattiass
Userprojekt
Userprojekt
Posts: 608
Joined: 2005-12-16 17:57

Re: BASH: conditional binary operator expected

Post by mattiass » 2006-09-12 16:58

Roger Wilco wrote:

Code: Select all

$ echo "vif = [ 'bridge=xenbr0,vifname=vif1.0' ]" | sed -e "s/.*vifname=([^']*).*/1/"
vif1.0
Oder:

Code: Select all

echo $teststring | perl -ne "print $1 if ( /vifname=(.*?)'/ )"

prodigy7
Posts: 7
Joined: 2006-09-12 15:22

Re: BASH: conditional binary operator expected

Post by prodigy7 » 2006-09-12 17:16

Roger Wilco wrote:

Code: Select all

$ echo "vif = [ 'bridge=xenbr0,vifname=vif1.0' ]" | sed -e "s/.*vifname=([^']*).*/1/"
vif1.0
Perfekt !!! Danke !!!