2017-02-20 2 views
1

Extraction de l'état d'un disque à partir d'une grappe de disques, je suis "prêt" et "en ligne" comme état pour OK. Essayer de piéger ceci avec une instruction IF dans bash, cela agira si la valeur est quelque chose d'autre que "prêt" et "en ligne".Comparaison de plusieurs chaînes Bash avec OU et NON

L'extrait de code ci-dessous fonctionne pour piéger "OK" mais je voudrais l'inverser, donc il piège si $ diskstatus n'est pas prêt ou en ligne. Avez-vous déjà essayé presque tout avec des parenthèses, des guillemets et autres joyeusetés mais sans que cela fonctionne?

Répondre

2

Juste pour être complet, considérons également l'instruction case. La syntaxe peut sembler arcane au premier abord, mais vous vous y habituerez rapidement. En fait, j'ai tendance à le préférer à if pour beaucoup de choses impliquant une simple correspondance de modèle de chaîne. En prime, il est compatible avec les traditionnels sh.

+0

Merci, n'a pas pensé à ce sujet. J'utilise beaucoup le cas dans l'analyse des paramètres d'entrée de commande. – tompaah

1

Utilisez l'opérateur regex dans bash avec l'opérateur [[ comme ci-dessous,

[[ ! $diskstatus =~ ^(ready|online)$ ]] && echo "Not OK: $diskstatus" 

En outre, observer que les guillemets doubles ne sont pas nécessaires, soit pour la regex ou pour la partie variable, parce que ni mot-division ni expansion du chemin (englobement) sera réalisée dans ce contexte

Une autre façon POSIX de le faire, d'ajouter à tripleee's answer serait aussi

if [ "$diskstatus" != "ready" ] && [ "$diskstatus" != "online" ]; then echo "Not OK: $diskstatus"; fi 
+1

J'avais cette solution dans la tête, mais je me serrais la tête pour la faire fonctionner. Bon travail. –

+1

Merci pour la variété regex, par souci de lisibilité c'est très élégant. Je vais choisir celui-ci :) – tompaah

0

inversant simplement l'égalité et l'opérateur logique semble fonctionner pour moi

$ diskstatus=onlin 
$ if [[ $diskstatus != online ]] && [[ $diskstatus != ready ]]; then echo "NOK: $diskstatus"; fi 
NOK: onlin 
+0

Il n'y a aucune raison d'exporter la variable ici. – tripleee

+0

@tripleee vous avez raison, j'ai enlevé l'exportation inutile mais inoffensive – VirgileD

0

Depuis à la fois besoin d'être faux, vous devez utiliser une instruction and.

if [[ $diskstatus != online ]] && [[ $diskstatus != ready ]]; then echo "OK: $diskstatus"; fi 

Sinon, comme au moins l'une des conditions sera toujours vraie, le corps de votre instruction if sera toujours exécuté.