2012-11-06 12 views
18

Ich versuche, ein Bash-Skript zu schreiben, das eine Variable als Muster in einer case-Anweisung verwendet. Aber ich kann es einfach nicht zur Arbeit bringen.Verwenden von Variablen als Groß-/Kleinschreibung in Bash

Case-Anweisung:

case "$1" in 
    $test) 
     echo "matched" 
     ;; 
    *) 
     echo "didn't match" 
     ;; 
esac 

Ich habe schon versucht, diese mit Zuordnung $test als aaa|bbb|ccc, (aaa|bbb|ccc), [aaa,bbb,ccc] und mehrere andere Kombinationen. Ich habe auch diese als Muster in der Fallanweisung ausprobiert: @($test), @($(echo $test)), $($test). Auch kein Erfolg.

EDIT

Aus Gründen der Klarheit, würde ich die Variable wie diese mehrere Muster wie darzustellen:

case "$1" in 
    aaa|bbb|ccc) 
     echo "matched" 
     ;; 
    *) 
     echo "didn't match" 
     ;; 
esac 

Antwort

17

können Sie verwenden, um die extglob Option:

#! /bin/bash 

shopt -s extglob   # enables pattern lists like +(...|...) 
test='+(aaa|bbb|ccc)' 

for x in aaa bbb ccc ddd ; do 
    echo -n "$x " 
    case "$x" in 
     $test) echo Matches. 
     ;; 
     *) echo Does not match. 
    esac 
done 
+2

+1 für die Erinnerung an die Verwendung von 'extglob'. Übrigens funktioniert 'test = '@ (aaa | bbb | ccc)' 'auch und ist in diesem Fall wahrscheinlich die bessere Option. – anubhava

+0

Das ist großartig! Vielen Dank! @anubhava Warum sollte dein Vorschlag besser sein (@ anstatt +)? – siebz0r

+1

@anubhava Macht nichts, fand es [hier] (https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching). @ entspricht einem Vorkommen, + entspricht mehreren Vorkommen. – siebz0r

3

( Aktualisiert): hier ist etwas ein bisschen anders, aber ich hoffe, es funktioniert für was Sie es brauchen:

#!/bin/bash 

pattern1="aaa bbb ccc" 
pattern2="hello world" 
test=$(echo -e "$pattern1\n$pattern2" | grep -e $1) 

case "$test" in 
    "$pattern1") 
     echo "matched - pattern1" 
     ;; 
    "$pattern2") 
     echo "matched - pattern2" 
     ;; 
    *) 
     echo "didn't match" 
     ;; 
esac 

Dies verwendet grep, um die Mustererkennung für Sie durchzuführen, können Sie jedoch weiterhin mehrere Mustersätze angeben, die in einer Fallstatementstruktur verwendet werden sollen.

Zum Beispiel:

  • Wenn entweder aaa, bbb oder ccc das erste Argument für das Skript ist, wird diese Ausgabe matched - pattern1.
  • Wenn entweder hello oder world das erste Argument ist, wird matched - pattern2 ausgegeben.
  • Andernfalls wird didn't match ausgegeben.
+2

dies funktionieren könnte, wenn $ 1 aaa ist, nicht für bbb und ccc. – Guru

+0

@ Guru hat Recht. Dies entspricht nur dem ersten, da "test" zu "aaa" wird. – siebz0r

+0

@ siebz0r aktualisierte Antwort - sehen Sie, ob dies für Sie funktioniert. –

1

mit eval auch funktioniert:

eval 'case "$1" in 

    '$test') 
     echo "matched" 
     ;; 
    *) 
     echo "did not match" 
     ;; 
esac' 
Verwandte Themen