web-dev-qa-db-fra.com

Dans un script bash, utilisation de la conditionnelle "ou" dans une instruction "if"

Cette question est une sorte de suite à ma question précédente . Les utilisateurs de ce site m'ont gentiment aidé à déterminer comment écrire une boucle bash for qui itère sur les valeurs de chaîne. Par exemple, supposons qu'une variable de contrôle de boucle fname itère sur les chaînes "a.txt" "b.txt" "c.txt". Je voudrais echo "oui!" lorsque fname a la valeur "a.txt" ou "c.txt" et echo "non!" autrement. J'ai essayé le script shell bash suivant:

#!/bin/bash

for fname in "a.txt" "b.txt" "c.txt"
do
 echo $fname
 if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
 echo "yes!"
else
 echo "no!"
fi
done

J'obtiens la sortie:

a.txt

non!

b.txt

non!

c.txt

oui!

Pourquoi l'instruction if donne-t-elle apparemment la valeur true lorsque fname a la valeur "a.txt"? Ai-je utilisé | incorrectement?

183
Andrew

Si vous voulez dire OR utilisez le double pipe (||).

if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]

(Le code OP d'origine utilisant | consistait simplement à canaliser la sortie du côté gauche vers le côté droit, de la même manière que n'importe quel tuyau ordinaire.)

314
bahamat

La réponse acceptée est bonne mais puisque vous utilisez bash, j'ajouterai la solution bash:

if [[ "$fname" == "a.txt" || "$fname" == "c.txt" ]]; then

Ceci est documenté dans le manuel de référence bash .2.4.2 Constructions conditionnelles

expression1 && expression2

Vrai si expression1 et expression2 sont vraies.

expression1 || expression2

Vrai si expression1 ou expression2 est vraie.

Les && et || les opérateurs n'évaluent pas expression2 si la valeur de expression1 est suffisante pour déterminer la valeur de retour de l'expression conditionnelle entière.

20
jesse_b

Que diriez-vous de quelque chose comme:

if [ a = b ] || [ c = d && e = f]

La syntaxe peut être délicate ...

0
Yamovitch

Vous pouvez utiliser ou conditionner comme ceci

 if [ "$fname" = "a.txt" -o "$fname" = "c.txt" ]
0
Sagar Jagnade