2014-01-16 7 views
21

ich habe das folgende Stück bashscript:Bash String vergleichen, um mehrere korrekten Werte

function get_cms { 
    echo "input cms name" 
    read cms 
    cms=${cms,,} 
    if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then 
     get_cms 
    fi 
} 

Aber egal, was i-Eingang (richtige und falsche Werte) es nie wieder die Funktion aufruft, weil ich nur zulassen möchten 1 dieser 3 Eingänge. Ich habe es mit || versucht mit [var! = value] oder [var! = value1] oder [var! = value1] funktioniert aber nichts. Kann mir jemand in die richtige Richtung zeigen?

+0

möglich Duplikat [Bash If-Anweisung zu überprüfen Wenn Zeichenfolge gleich eins ist mehrerer String-Literale] (http://stackoverflow.com/questions/22259259/bash-if-statement-to-check-if-string-is-equal-to-one-of-several-string-literals) –

Antwort

21

Statt zu sagen:

if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then 

sagen:

if [[ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]]; then 

Sie könnten auch Conditional Constructs beziehen möchten.

+0

Das funktioniert. Wie konnte ich das vermissen? – eagle00789

+0

"$ cms" wiederholen! = 'Wieder und wieder ist nicht sehr TROCKEN. Es lässt Platz für Tippfehler bei allen Gelegenheiten (z. B. "$ csm"! = '), Und Sie haben keinen Compiler, der Ihnen das in Shells zeigt. Versuchen Sie besser, den Variablennamen nicht zu wiederholen. (Siehe meine Antwort für eine Möglichkeit, das zu tun.) – Alfe

24

Vielleicht sollten Sie besser einen case für solche Listen verwenden:

case "$cms" in 
    wordpress|meganto|typo3) 
    do_your_else_case 
    ;; 
    *) 
    do_your_then_case 
    ;; 
esac 

Ich denke, für lange solche Listen diese besser lesbar ist.

Wenn Sie immer noch die bevorzugen if Sie es mit einzelnen Klammern auf zwei Arten tun:

if [ "$cms" != wordpress -a "$cms" != meganto -a "$cms" != typo3 ]; then 

oder

if [ "$cms" != wordpress ] && [ "$cms" != meganto ] && [ "$cms" != typo3 ]; then 
+1

es funktioniert super! BTW, arent "do_your_then | else_case" Textspitze invertiert? :) –

+1

OP formulierte seinen ursprünglichen Zustand mit ≠ ('! ='); meine Version mit dem 'case' ist passend (es wird also eher ein Vergleich mit' = 'verwendet), daher die Inversion. – Alfe

+1

Schöne Lösung. Gibt es irgendwelche Probleme mit der Verwendung eines solchen Falles? – Xiao

2

Hier ist meine Lösung

if [[ "${cms}" != +(wordpress|magento|typo3) ]]; then 
+3

Nicht "+" sondern "@" in Ihrem Extglob. Andernfalls erhalten Sie falsche Ergebnisse für z. B. "wordpressmagento" oder "typo3typo3". –

29

Wenn die Hauptabsicht ist zu überprüfen, ob der angegebene Wert nicht in einer Liste gefunden wird, vielleicht können Sie den ext ended regulären Ausdruck in BASH über den "gleich Tilde" Operator gebaut Matching (siehe auch this answer):

if ! [[ "$cms" =~ ^(wordpress|meganto|typo3)$ ]]; then get_cms ; fi 

einen schönen Tag

Verwandte Themen