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é ?
-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 est bash
, personne ne devrait utiliser de [
toute façon , car bash
« s [[
est supérieure à bien des égards.
if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
plutôt que if [ "$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.