scripts script resueltos pasar parametros ejercicios ejemplos bash shell expression

bash - resueltos - shell script



Expresiones booleanas en scripts de shell (5)

Considere usar una declaración de caso :

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

¿Cuál es la forma "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 ...


Incluso 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;

La expresión -a en if es equivalente a AND de boolean en pruebas de shell. Para más ver ver man test


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


Las otras soluciones tienen un par de errores comunes: http://www.pixelbeat.org/programming/shell_script_mistakes.html

  1. for i in $(ls ...) es redundante / problemático solo hago: for i in $1/resources*; do ... for i in $1/resources*; do ...

  2. [ $i != file1 -a $1 != file2 ] Esto realmente tiene 2 problemas.

    a. El $i no está citado, por lo tanto, los nombres con espacios causarán problemas

    segundo. -a es ineficaz si está estableciendo archivos, ya que no causa cortocircuitos (sé que lo anterior no está estableciendo archivos).

Por lo tanto, intente:

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


Para referencia futura, se prefiere el nuevo [[operador de prueba]. La respuesta aceptada está cerca y todo lo mencionado se aplica, pero esa respuesta requerirá muchas citas y llamadas a múltiples pruebas.

El método preferido sería algo así 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