web-dev-qa-db-fra.com

chaîne bash comparer à plusieurs valeurs correctes

j'ai le morceau suivant de bashscript:

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

Mais peu importe l’entrée (valeurs correctes et incorrectes), la fonction n’appelle plus car je ne souhaite autoriser qu’une de ces 3 entrées. Je l'ai essayé avec || avec [ var != value ] or [ var != value1 ] or [ var != value1 ] mais rien ne fonctionne. Quelqu'un peut me diriger dans la bonne direction?

41
eagle00789

Au lieu de dire:

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

dire:

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

Vous voudrez peut-être aussi vous référer à Constructions conditionnelles .

37
devnull

Si l'objectif principal est de vérifier si la valeur fournie ne figure pas dans une liste, vous pouvez peut-être utiliser la correspondance d'expression régulière étendue intégrée dans BASH via l'opérateur "equal tilde" (voir aussi cette réponse ) :

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

Bonne journée

60
Edgar Grill

Vous devriez peut-être mieux utiliser un case pour de telles listes:

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

Je pense que pendant longtemps, de telles listes sont mieux lisibles.

Si vous préférez toujours le if, vous pouvez le faire avec des crochets simples de deux manières:

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

ou

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

Voici ma solution

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