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?
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.)
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.
Que diriez-vous de quelque chose comme:
if [ a = b ] || [ c = d && e = f]
La syntaxe peut être délicate ...
Vous pouvez utiliser ou conditionner comme ceci
if [ "$fname" = "a.txt" -o "$fname" = "c.txt" ]