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 forboucle bash qui itère sur des valeurs de chaîne. Par exemple, supposons qu'une variable de contrôle de boucle effectue une fnameitération sur les chaînes "a.txt" "b.txt" "c.txt". Je voudrais echo"oui!" quand fnamea 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 fnamea la valeur "a.txt"? Ai-je |mal utilisé ?
-odans le même [ ].
||et séparer [ ]plus -opour 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.