2008-09-07 8 views
11

Quelle est la "bonne" façon de faire ce qui suit en tant qu'expression booléenne?Expressions booléennes dans les scripts shell

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 
... 

Répondre

11

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

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

  2. [ $i != file1 -a $1 != file2 ] Cela a en fait 2 problèmes.

    a. Le $i n'est pas cité, donc les noms avec des espaces causeront des problèmes

    b. -a est inefficace si stat fichiers ING car il ne court-circuite pas (je sais que ce n'est pas stat fichiers ci-dessus).

Essayez donc à la place:

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 
1
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 
7

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 la si expression est l'équivalent de la valeur booléenne et dans les shell-tests. Pour plus voir man test

3

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 
0

Pour référence ultérieure, le nouvel opérateur [[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 beaucoup de citations et d'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 
Questions connexes