Frage

Was ist der "richtige" Weg, um Folgendes zu tun als boolescher Ausdruck?

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
...
War es hilfreich?

Lösung

Die anderen Lösungen haben ein paar häufige Fehler:http://www.pixelbeat.org/programming/shell_script_mistakes.html

  1. for i in $(ls ...) redundant/problematisch tun Sie einfach: for i in $1/resources*; do ...

  2. [ $i != file1 -a $1 != file2 ] Das hat eigentlich 2 Probleme.

    ein.Die $i ist nicht angegeben, daher die Namen mit Leerzeichen zu Problemen führen

    b. -a ineffizient ist, wenn stating-Dateien, da es nicht Kurzschluss (ich weiß, die oben nicht stating-Dateien).

Also anstatt zu versuchen:

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

Andere Tipps

Noch kürzer:

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;

Die -a in der if-Ausdruck entspricht der booleschen UND in shell-tests.Für mehr sehen man test

Erwägen Sie die Verwendung einer Fall Anweisung:

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

Für zukünftige Referenz, das neue [[ test-operator wird bevorzugt.Die akzeptierte Antwort ist in der Nähe und alles, was erwähnt wird, gilt, aber die Antwort erfordert viel zitiert und fordert mehrere tests.

Die bevorzugte Methode wäre so etwas wie:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top