Archiv verlassen und diese Seite im Standarddesign anzeigen : case anweisung mit regex?
meinereinerseiner
02-03-2010, 09:35
Hi,
ich würde gern in einer Case Anweisung mit wildcards arbeiten. Sprich alles was dem musster foo-1 bis foo-99 entspricht soll im ersten block abgearbeitet werden, ein foo-12.bla oder foo-1y aber vom 2.
nun dachte ich mir das in etwa so:
case $1 in
foo-([0-9]{1,2}))
echo foo
;;
*) # default
echo bar
;;
esac
das tut aber nicht. hat jemand eine idee?
thx,
tom
Das offensichtliche Problem ist, dass foo-([0-9]{1,2}) Ausdrücke wie foo-12, foo-73, foo-51 auch matcht.
edit: obs weitere Probleme gibt, kann ich gerade nicht sagen, hab keine Shell zum testen da.
meinereinerseiner
02-03-2010, 13:06
Das offensichtliche Problem ist, dass foo-([0-9]{1,2}) Ausdrücke wie foo-12, foo-73, foo-51 auch matcht.
genau das soll er ja tun - quasi foo-1 - foo-99 ,alle ein und zweistelligen zahlen welche am ende alleine stehen.
case $1 in
foo-\(\[0-9\]{1,2}\))
echo foo
;;
*) # default
echo bar
;;
esac
tom@devil-ng:~/tmp> ./case-test.sh foo-1
bar
tom@devil-ng:~/tmp> ./case-test.sh foo-99
bar
tom@devil-ng:~/tmp> ./case-test.sh foo-2-bla
bar
das matcht irgendwie nie.
#!/bin/bash
shopt -s extglob
case $1 in
foo-@([0-9]|[0-9][0-9]))
echo foo
;;
*) # default
echo bar
;;
esac
Die patterns für die cases verwenden Pathname Extension (*, ?, [...]) und nicht regex. Mit der shell option extglob werden verschiedene Kombinationsmöglichkeiten aktiviert (siehe man bash). Eine davon ist @(pattern1|pattern2|...) wobei eines der gelisteten Patterns matchen muss, damit der ganze Ausdruck matcht.
simon@gryphon:~ $ ./case-test.sh foo-1
foo
simon@gryphon:~ $ ./case-test.sh foo-99
foo
simon@gryphon:~ $ ./case-test.sh foo-2-bla
bar
HTH jeebee
meinereinerseiner
03-03-2010, 13:31
ahhh - klasse, klappt bestens!
tausend dank,
tom
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.