Expressions booléennes dans les scripts Shell
-
09-06-2019 - |
Question
Quelle est la « bonne » façon de procéder comme suit en tant qu’expression booléenne ?
for i in `ls $1/resources`; do
if [ $i != "database.db" ]
then
if [ $i != "tiles" ]
then
if [ $i != "map.pdf" ]
then
if [ $i != "map.png" ]
then
svn export -q $1/resources/$i ../MyProject/Resources/$i
...
La solution
Les autres solutions comportent quelques erreurs courantes :http://www.pixelbeat.org/programming/shell_script_mistakes.html
for i in $(ls ...)
est redondant / problématique à faire:for i in $1/resources*; do ...
[ $i != file1 -a $1 != file2 ]
Cela pose en fait 2 problèmes.un.Le
$i
n'est pas cité, donc les noms avec des espaces poseront des problèmesb.
-a
est inefficace sistat
fichiers car il ne court-circuite pas (je sais que ce qui précède n'est passtat
fichiers).
Alors essayez plutôt :
for i in $1/resources/*; do
if [ "$i" != "database.db" ] &&
[ "$i" != "tiles" ] &&
[ "$i" != "map.pdf" ] &&
[ "$i" != "map.png" ]; then
svn export -q "$i" "../MyProject/Resources/$(basename $i)"
fi
done
Autres conseils
Encore plus court :
for i in `ls $1/resources`; do
if [ $i != databse.db -a $i != titles -a $i != map.pdf ]; then
svn export -q $1/resources/$i ../MyProject/Resources/$i
fi
done;
Le -a
dans l'expression if est l'équivalent du booléen AND dans les tests shell.Pour en savoir plus, voir man test
Pensez à utiliser un cas déclaration:
for i in $(ls $1/resources); do
case $i in
database.db|tiles|map.pdf|map.png)
;;
*)
svn export -q $1/resources/$i ../MyProject/Resources/$i;;
esac
done
for i in `ls $1/resources`; do
if [ $i != "database.db" ] && [ $i != "tiles" ] && [ $i != "map.pdf" ] && [ $i != "map.png" ]; then
svn export -q $1/resources/$i ../MyProject/Resources/$i
Pour référence future, le nouvel opérateur de test [[ est préféré.La réponse acceptée est proche et tout ce qui est mentionné s'applique, mais cette réponse nécessitera de nombreuses citations et des appels à plusieurs tests.
La méthode préférée serait quelque chose comme :
for i in $1/resources/*; do
if [[ $i != "database.db" && $i != "tiles" &&
$i != "map.pdf" && $i != "map.png" ]]; then
svn export -q "$i" "../MyProject/Resources/$(basename $i)"
fi
done