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
...
Était-ce utile?

La solution

Les autres solutions comportent quelques erreurs courantes :http://www.pixelbeat.org/programming/shell_script_mistakes.html

  1. for i in $(ls ...) est redondant / problématique à faire: for i in $1/resources*; do ...

  2. [ $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èmes

    b. -a est inefficace si statfichiers car il ne court-circuite pas (je sais que ce qui précède n'est pas statfichiers).

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top