Ayuda con un script de linux

Buenas a todos, acudo a vosotros para ver si podeis darme una solucion a este problema. No es mas que un simple ejercicio que nos han mandado hacer, pero no doy con el problema.
El ejercicio en cuestion es el siguiente:

Actualizo: esta duda esta solucionada, aunque unos post mas abajo tengo otra :P

script ke compruebe si tengo permisos de lectura para una serie de archivos
sintaxis: ./nscript [ -d carpeta ] archivo [...]

Y el codigo que he escrito es el siguiente:

#! /bin/bash

if(($#<1)); then
        echo "Uso: $0 [ -d carpeta ] archivo [...]"
        exit 0
fi
if [ -z $1 ]; then
        echo "El parametro especificado esta vacio"
        exit 1
fi

if [ $1 != '-d' ]; then      # si no ha escrito -d
        for((x = 0; x < $#; x++))
        do
                if [ -a $1 ]; then   # compruebo si existe el archivo
                        if [ -r $1 ]; then   # compruebo si tiene acceso de lectura
                                echo "Tienes permisos de lectura en el archivo $1"
                                shift
                        else
                                echo "No tienes permisos de lectura en el archivo $1"
                                shift
                        fi
                else
                        echo "El archivo $1 no existe"
                        shift
                fi
        done
else

El resto del codigo es similar a este, solo que busca en la carpeta que le indiques.

Lo siento por las sangrias, pero no se como hacer que se vean :-\.

La cuestion es que reconoce perfectamente el archivo en cuestion y me dice si tengo o no accesos de lectura. El problema viene en que deberia comprobar esto en todos los archivos que yo le indique, vease:
./script.sh archivo1.txt archivo2.pdf archivox.xxx
y solo lo hace con el primero, por lo que pienso que en el for falla algo.
En cuanto a como cambia de un archivo a otro, he usado el comando shift (consejo del profesor, osea que no me mandeis a usar otro comando porque no me valdria).

Pues ahi queda eso, espero que me podais ayudar, muchas gracias de antemano!

EDITO: Mierda, tal y como siempre me pasa, justo cuando posteo doy con la solucion!

He cambiado esto:
for((x = 0; x < $#; x++))

por esto otro:
for((x = $#; x > 0; x--))

y ya tira perfectamente :P
Muchas gracias por postearlo, este script puede hacerme mucha falta jejej.

Saludos
EDIT: perdón por las molestias, pero da este error (yo lo he llamado permisos ;-)):

./permisos: line 29: syntax error: unexpected end of file
Es que no está posteado el codigo completo [sonrisa] cuando lo termine lo pongo por aqui por si lo quieres.

Ahora si tengo una duda, veamos:

Con el comando shift, hago que la orden $1 pase a ser la $2; la orden $2 pasa a ser $3, etc
Por ejemplo:

./nscript -d ncarpeta archivo.txt documento.pdf texto.odt
----$0---$1---$2-------$3----------$4-----------$5
hacemos shift y quedaria asi
./nscript -d ncarpeta archivo.txt documento.pdf texto.odt
----$0---------$1-------$2----------$3-----------$4

A la hora de buscar solo ficheros en la carpeta en la que se está ejecutando (es la misma funcion pero sin -d ncarpeta) funciona perfectamente, pero claro, cuando busca en carpetas, al hacer el primer shift, lo que era ncarpeta ahora es el primer nombre de archivo, por lo que al volver a buscar no me busca en la carpeta indicada sino en "archivo1/archivo2", por lo que salta el error de carpeta no existe y ahi se acaba.
Lo mas simple que he pensado es guardar en una variable el nombre de la carpeta y asi hacerlo luego, pero me da error [+risas].
Lo hago asi:
carpeta = $3
y nada, error al canto. La verdad es que es el segundo script que hago, asi que no tengo mucha idea de la sintaxis, no me acribilleis por no saber guardar datos en una variable xD.

A ver si alguien me echa una mano. Salu2!
Así mirandolo por encima, para aclarar un poco el codigo usaria getopt(1) para los argumentos del script. Y postealo con [ CODE ] para que lo veamos indentado...

Saludos
Bueno, pues ya esta terminado, al final los fallos eran muy tontos xD.
Dejo el codigo por si a alguien le pudiera interesar como a resadent.

#! /bin/bash

if(($#<1)); then
   echo "Uso: $0 [ -d carpeta ] archivo [...]"
   exit 0
fi
if [ -z $1 ]; then
   echo "El parametro especificado esta vacio"
   exit 1
fi

if ! [ $1 == '-d' ]; then      # si no ha escrito -d
   for((x = $#; x > 0; x--))
   do
      if [ -a $1 ]; then   # compruebo si existe el archivo
         if [ -r $1 ]; then   # compruebo si tiene acceso de lectura
            echo "Tienes permisos de lectura en el archivo $1"
            shift
         else
            echo "No tienes permisos de lectura en el archivo $1"
            shift
         fi
      else
         echo "El archivo $1 no existe"
         shift
      fi
   done
else
   if [ -z $2 ]; then   # si el directorio no ha sido introducido
      echo "El parametro de carpeta esta vacio"
      exit 5
   fi
   if ! [ -d $2 ]; then   # si el directorio no existe
      echo "El directorio $2 no existe"
      exit 6
   else         # si el directorio existe
      if [ -z $3 ]; then   # si el archivo a buscar en ese directorio no ha sido introducido
         echo "El parametro de archivo esta vacio"
         exit 7
      fi

      carpeta=$2   # guardo la ruta en una variable para que despues de usar shift no la pierda

      for((x=$#; x > 2; x--))   # for para que recorre todos los parametros (sin llegar a -d ncarpeta)
      do
         if [ -a $carpeta/$3 ]; then   # si el archivo existe
            if [ -r $carpeta/$3 ]; then   # si tienes permisos de lectura
               echo "Tienes permisos de lectura en el archivo $carpeta/$3"
               shift
            else            # si no tienes permisos de lectura
               echo "No tienes permisos de lectura en el archivo $carpeta/$3"
               shift
            fi
         else         # si no existe
            echo "El archivo $carpeta/$3 no existe"
            shift
         fi
      done   # fin del for
   fi
fi


Salu2!
Hum... un par de cosillas:

#! /bin/bash

if [ $# -lt 1 ]; then
        echo "Uso: $0 [ -d carpeta ] archivo [...]"
        exit 0
fi
if [ -z $1 ]; then
        echo "El parametro especificado esta vacio"
        exit 1
fi

if [ $1 != '-d' ]; then      # si no ha escrito -d
        for x in $#
        do
                if [ -a $1 ]; then   # compruebo si existe el archivo
                        if [ -r $1 ]; then   # compruebo si tiene acceso de lectura
                                echo "Tienes permisos de lectura en el archivo $1"
                                shift
                        else
                                echo "No tienes permisos de lectura en el archivo $1"
                                shift
                        fi
                else
                        echo "El archivo $1 no existe"
                        shift
                fi
        done
else


Es algo más optimo, porque cada vez que ejecutas algo entre parentesis, se crea una subshell, y usando [ (test) es más rapido :D
Además es mas "bash like" :D
Saludos!
e-Minguez escribió:Hum... un par de cosillas:

#! /bin/bash

if [ $# -lt 1 ]; then
        echo "Uso: $0 [ -d carpeta ] archivo [...]"
        exit 0
fi
if [ -z $1 ]; then
        echo "El parametro especificado esta vacio"
        exit 1
fi

if [ $1 != '-d' ]; then      # si no ha escrito -d
        for x in $#
        do
                if [ -a $1 ]; then   # compruebo si existe el archivo
                        if [ -r $1 ]; then   # compruebo si tiene acceso de lectura
                                echo "Tienes permisos de lectura en el archivo $1"
                                shift
                        else
                                echo "No tienes permisos de lectura en el archivo $1"
                                shift
                        fi
                else
                        echo "El archivo $1 no existe"
                        shift
                fi
        done
else


Es algo más optimo, porque cada vez que ejecutas algo entre parentesis, se crea una subshell, y usando [ (test) es más rapido :D
Además es mas "bash like" :D
Saludos!


Muchas gracias e-Minguez por molestarte en contestar, me apunto este consejo ;).
Solo una pregunta, ¿como sabe de ese modo cuando debe finalizar el for?
Bash expande $# a sus valores, y la variable x va tomando esos valores:
P.ej:
./comando arg1 arg2 arg3

for i in $# => for i in arg1 arg2 arg3
En la primera vuelta, i=arg1.
En la segunda, i=arg2,...

Saludos! ;D

PD.- Usa la busqueda, y hay una charla que dio Ferdy de bash, que es muy interesante :D
e-Minguez escribió:Bash expande $# a sus valores, y la variable x va tomando esos valores:
P.ej:
./comando arg1 arg2 arg3

for i in $# => for i in arg1 arg2 arg3
En la primera vuelta, i=arg1.
En la segunda, i=arg2,...

Saludos! ;D

PD.- Usa la busqueda, y hay una charla que dio Ferdy de bash, que es muy interesante :D


Muchas gracias por la ayuda!
8 respuestas