Expresiones booleanas en los Scripts de Shell
-
09-06-2019 - |
Pregunta
¿Cuál es la manera "correcta" de hacer lo siguiente como una expresión booleana?
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
...
Solución
Las otras soluciones que tienen un par de errores comunes:http://www.pixelbeat.org/programming/shell_script_mistakes.html
for i in $(ls ...)
es redundante/problemática acabo de hacer:for i in $1/resources*; do ...
[ $i != file1 -a $1 != file2 ]
Esta realidad tiene 2 problemas.una.El
$i
no es citado, por lo tanto los nombres con espacios causar problemas relacionados con lab.
-a
es ineficiente sistat
ing archivos que no este en corto circuito (sé que lo anterior no esstat
ing archivos).
Así que en lugar de tratar de:
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
Otros consejos
Aún más corto:
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;
El -a
en el caso de la expresión es el equivalente de la booleano Y en la cáscara de las pruebas.Para más información, véase man test
Considere el uso de un caso declaración:
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
Para referencia en el futuro, el nuevo [[ prueba de operador es el preferido.El aceptó la respuesta está cerca y todo lo mencionado se aplica, pero que la respuesta va a requerir un montón de citas y llamadas a varias pruebas.
El método preferido sería algo como:
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