Boolesche Ausdrücke in Shell-Skripten
-
09-06-2019 - |
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
...
Lösung
Die anderen Lösungen haben ein paar häufige Fehler:http://www.pixelbeat.org/programming/shell_script_mistakes.html
for i in $(ls ...)
redundant/problematisch tun Sie einfach:for i in $1/resources*; do ...
[ $i != file1 -a $1 != file2 ]
Das hat eigentlich 2 Probleme.ein.Die
$i
ist nicht angegeben, daher die Namen mit Leerzeichen zu Problemen führenb.
-a
ineffizient ist, wennstat
ing-Dateien, da es nicht Kurzschluss (ich weiß, die oben nichtstat
ing-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