it-swarm.com.de

Bash-String mit mehreren korrekten Werten vergleichen

ich habe das folgende Stück Bashskript:

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 ich eingebe (richtige und falsche Werte), es ruft die Funktion nie wieder auf, weil ich nur 1 dieser 3 Eingaben zulassen möchte. Ich habe es mit || versucht mit [ var != value ] or [ var != value1 ] or [ var != value1 ] aber nichts funktioniert. Kann mich jemand in die richtige Richtung weisen?

41
eagle00789

Anstatt zu sagen:

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

sagen:

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

Möglicherweise möchten Sie auch auf Bedingte Konstrukte verweisen.

37
devnull

Wenn hauptsächlich geprüft werden soll, ob der angegebene Wert nicht in einer Liste enthalten ist, können Sie möglicherweise den in BASH integrierten erweiterten regulären Ausdrucksvergleich über den Operator "equal tilde" verwenden (siehe auch diese Antwort ). :

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

Einen schönen Tag noch

60
Edgar Grill

Vielleicht solltest du besser ein 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 ist dies besser lesbar.

Wenn Sie das if immer noch bevorzugen, haben Sie zwei Möglichkeiten:

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

oder

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

Hier ist meine Lösung

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