286 votes

Conditionnels Bash : comment "et" les expressions ? (if [ ! -z $VAR && -e $VAR ])

Je suppose que je ne suis pas clair sur comment faire des tests "et". Je voulais m'assurer qu'un argument existait qui fonctionnait bien avec [ -e $VAR ], mais il s'avère que cela évaluait également comme vrai sur une chaîne vide ; ce que je ne veux pas.

Comment les 'et' ensemble? Ou existe-t-il un autre test unaire qui accompli ce que je veux?

537voto

jaypal Points 34440
si [ ! -z "$var" ] && [ -e "$var" ]; alors
      # quelque chose ...
fi

10 votes

Cette solution fonctionne même dans les interpréteurs de commandes strictement conformes à POSIX et donc aussi dans bash; cependant, pour tirer pleinement parti des "bashismes", consultez la réponse de @paxdiablo.

2 votes

Très heureux de voir que cela est conseillé au lieu de l'obsolète -a.

1 votes

J'ai trouvé une autre explication excellente et détaillée - stackoverflow.com/questions/3601515/…

72voto

paxdiablo Points 341644

Depuis la page de manuel de bash:

[[ expression ]] - retourne un statut de 0 ou 1 en fonction de l'évaluation de l'expression conditionnelle expression.

Et, pour les expressions, l'une des options est :

expression1 && expression2 - vrai si à la fois expression1 et expression2 sont vraies.

Vous pouvez donc les and ensemble comme suit (-n est l'opposé de -z donc nous pouvons nous débarrasser du !) :

if [[ -n "$var" && -e "$var" ]] ; then
    echo "'$var' est non vide et le fichier existe"
fi

Cependant, je ne pense pas que ce soit nécessaire dans ce cas, -e xyzzy est vrai si le xyzzy fichier existe et peut facilement gérer les chaînes vides. Si c'est ce que vous voulez, alors vous n'avez pas vraiment besoin de la vérification de non-vide -z :

pax> VAR=xyzzy
pax> if [[ -e $VAR ]] ; then echo yes ; fi
pax> VAR=/tmp
pax> if [[ -e $VAR ]] ; then echo yes ; fi
yes

En d'autres termes, utilisez simplement :

if [[ -e "$var" ]] ; then
    echo "'$var' existe"
fi

1 votes

Nous pouvons raccourcir avec [[ -e "$var" ]] && echo "'$var' existe"

1 votes

Oui, si c'est une ligne unique (comme dans mon exemple). Je ne le ferais pas si le bloc conditionnel était beaucoup plus complexe cependant.

0 votes

S'il y a seulement une commande - peut-être même longue - il est logique d'utiliser cette forme car elle est plus courte

9voto

Slava Semushin Points 5710
if [ -n "$var" -a -e "$var" ]; then
    faire quelque chose ...
fi

10 votes

Depuis que POSIX ne définit pas le comportement de [ avec des ensembles de tests complexes, nous devrions éviter d'utiliser -a ou -o avec [. Je l'ai lu ici.

2 votes

@jaypal-singh Vous avez raison, mais le sujet a la balise bash et ne mentionne pas POSIX, donc je poste cette version qui fonctionne sous bash et quelques autres shells modernes.

2 votes

Si vous supposez l'utilisation de bash ou d'autres shells modernes, il y a encore moins de raison de recommander -a.

4voto

Pumbaa80 Points 27066

Il suffit de citer votre variable:

[ -e "$VAR" ]

Cela évalue à [ -e "" ] si $VAR est vide.

Votre version ne fonctionne pas car elle évalue à [ -e ]. Dans ce cas, bash vérifie simplement si l'argument unique (-e) est une chaîne non vide.

D'après la page de manuel:

test et [ évaluent les expressions conditionnelles en utilisant un ensemble de règles basées sur le nombre d'arguments. ...

1 argument

L'expression est vraie si et seulement si l'argument n'est pas nul.

(De plus, cette solution a l'avantage supplémentaire de fonctionner avec des noms de fichiers contenant des espaces)

1voto

rororo Points 336

J'ai trouvé une réponse maintenant. Merci pour vos suggestions!

pour e in ./*.cutoff.txt; faire
si grep -q -E 'COX1|Cu-oxidase' $e
alors
    echo xyz >$e.match.txt
sinon
    echo
fi

si grep -q -E 'AMO' $e
alors
    echo abc >$e.match.txt
sinon
    echo
fi; fait

Des commentaires à ce sujet? Il semble inefficace de grep deux fois, mais ça fonctionne...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X