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
...
¿Fue útil?

Solución

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

  1. for i in $(ls ...) es redundante/problemática acabo de hacer: for i in $1/resources*; do ...

  2. [ $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 la

    b. -a es ineficiente si stating archivos que no este en corto circuito (sé que lo anterior no es stating 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top