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 for
boucle bash qui itère sur des valeurs de chaîne. Par exemple, supposons qu'une variable de contrôle de boucle effectue une fname
itération sur les chaînes "a.txt" "b.txt" "c.txt"
. Je voudrais echo
"oui!" quand 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' if
énoncé semble-t-il être vrai quand fname
a la valeur "a.txt"
? Ai-je |
mal utilisé ?
bash
shell-script
Andrew
la source
la source
-o
dans le même[ ]
.||
et séparer[ ]
plus-o
pour la portabilité simplement parce que[
n'est pas garanti pour soutenir plus de 4 arguments. Bien sûr , si la langue cible estbash
, personne ne devrait utiliser de[
toute façon , carbash
« s[[
est supérieure à bien des égards.if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
plutôt queif [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
?bash
, comme vous le faites déjà. L’un des avantages de[[
ce logiciel est qu’il ne coupe pas les mots (cas particulier) et[[ $unquoted_var = string ]]
est donc sûr.Réponses:
Si vous voulez dire
OR
utilisez double pipe (||
).(Le code OP original utilisé
|
consistait simplement à canaliser la sortie du côté gauche vers le côté droit, de la même manière que tout tuyau ordinaire fonctionne.)la source
||
ne fait pas une logique standard "OU" - il court-circuite, et la deuxième commande est exécutée seulement si la première échoue.OR
si la première condition est vraie.==
mais après avoir vu cette réponse, j'ai décidé de chercher. Apparemment, "il peut être utilisé mais n'est pas standard". Je pensais que je mettrais ça ici pour les autres si voustest
recommande également la page deif [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
(si vous souhaitez ou souhaitez que les fonctionnalités supplémentaires soient associées à[[ ]]
).