Ayuda para un script de shellscript.

Necesito ayuda con shellscript porque me estoy iniciando y aun soy bastante torpe y tampoco tengo ninguna pagina con un manual decente y no se como hacer lo siguiente:

La idea es que le ponga un usuario despues de ejecutar el script y me diga si existe y tal, me han dixo que se hace con un getopts pero no se como exactamente:

#sh usuario.sh (si ejecuto el script a secas...)

Error: Es necesario introducir un usuario como parámetro.

#sh usuario.sh manolin (si le paso un user que no existe...)

Error: Ningún usuario cumple el patrón manolin

# sh usuario.sh bite (si algun usuario sigue el patron...)

Usuario: bite. Home: /home/bite
Usuario: bitecode. Home: /home/bitecode


Bien, esto es lo que me tiene que devolver el shell pero, como paso el nombre que pongo detras del nombre del script al script como un valor?? alguien me puede ayudar?? [triston]
Si no te he entendido mal, tu problema es que no sabes como pasarle usuario como argumento. Para eso en bash usa:

$0 -> variable del primer argumento (nombre del programa)
$1 -> Variable del segundo argumento
$2 -> variable del tercer argumento

Y asi sucesivamente (y esto si no me fallan mis conocimientos de bash :P)

Salu2!
Vale gracias ya esta, no tiene nada que ver el getops me habian timado ¬_¬

como bien dices, se guardan en $1 la primera palabra despues del fichero y asi sucesivamente. Luego solo tengo que hacer las comparaciones con la variable $1 y arreglado!! me esta molando esto [jaja]

Como seria para saber si algun usuario del sistema es = $1?? (donde $1 es el nombre de usuario que queremos saber si existe)
Puedes hacer algo como esto:

grep ^$1 /etc/passwd

Con esto, si el usuario existe recibes la línea del archivo passwd con sus datos. Si no existe no recibes nada.

Para sacar su home o cualquier otra cosa que necesites, puedes pasarle la salida del comando anterior a cut. Esto te devolvería el home del usuario:

grep ^$1 /etc/passwd |cut -d ':' -f 6
$1 no es un nombre válido de usuario. Solo puede tener letras, números, guiones bajos, creo que puntos y puede acabar con $, por cosas del samba y la interoperabilidad. Bueno, más o menos es así, pero lo de empezar por $ seguro que está prohibido.

De todas formas se compararía escapando el símbolo de dolar \$1

saludos
"$1" no es un nombre válido, pero lo que se va a buscar no es el string "$1" sino el valor de la variable.
Kornshell puedo guardar el resultado de grep ^$1 /etc/passwd |cut -d ':' -f 6 como una variable mas llamada NUSUARIO para poder trabajar con ella?? como se hace??

Vale vale perfecto, ya voy yo arrejuntando conceptos y sacando cosas. Una ultima pregunta por favor.

Si quiero sacar del directorio /home/usuario la siguiente informacion:

Directorio: /home/usuario

Ficheros: 1
Directorios: 3
Lectura: 1
Escritura: 1
Ejecución: 0
Total: 4

¿Que uso AWK? esque pongo sentencias AWK pero al usar las ' ' me toma los valores como si fueran texto a mostrar o algo porque se pasa las instrucciones por el forro
Para guardar eso en una variable lo asignas, usando la comilla invertida para que se guarde la salida del comando en vez del comando en sí:

NUSUARIO=`grep ^$1 /etc/passwd |cut -d ':' -f 6`

Para sacar la información de archivos/directorios del home, una vez tienes guardada la ruta en esa variable puedes recorrer todos los archivos con un for i in `ls $NUSUARIO` y para cada $i (o sea, para cada fichero/directorio) usas el comando test con los parámetros de comprobación de tipo de archivo (en man test los tienes todos) y vas acumulando en variables contador según los resultados ($ficheros, $directorios, etc...).

Al final sacas todo con echo y listo.
BiteCode escribió:Como seria para saber si algún usuario del sistema es = $1?? (donde $1 es el nombre de usuario que queremos saber si existe)


Yo me refería a esta pregunta.

saludos
Patxito escribió:
Yo me refería a esta pregunta.

saludos


Pues yo ahi entiendo como kornshell, que usuario esta guardado en la variable $1 :S

Salu2!
Bueno gracias a todos por vuestra ayuda, me habeis ayudado mas de lo que os imaginais, los siguienes scripts que tengo que hacer me las estoy arreglando bien porque voy haciendo copi y pastes y modificando lo que toda jeje.

Si me saliera alguna duda mas lo posteare porque veo que si me podeis ayudar. Gracias!!
for i in `ls $NUSUARIO`


Dicho sea de paso esto es una MALISIMA idea. Para empezar, falla si hay ficheros con espacios en ese directorio. La forma correcta de hacerlo es:

for i in directorio/* ; do
   : whatever
done


- ferdy
Vaya, veo que aqui hay mucho nivel.

Os expongo mi script y mi ultima duda porque ya tengo el script acabado [beer]

La cosa es que analize un directorio introducido previamente y que cuando yo diga, cambie de usuario y grupo propietario.

cd $DIRECTORIO

CONT = 0

for i in `ls`; do
  while [ "$CONT" != "S" ] ; do
   echo "Directorio actual: $DIRECTORIO"
   echo "Fichero Actual: $1"
   echo ""
   echo "MENU"
   echo "Pulsa C para cambiar el usuario propietario"
   echo "Pulsa S para salir"
   echo "Pulsa cualquier boton para siguiente archivo"
   read COUNT

   case $COUNT in
     C) chown <-- ayuda aqui
     S) echo "Fin de la aplicacion" ;;
     *) break ;;
   esac

done

done


Ese es mi codio y en el caso C) es donde quiero que se cambie el fichero en el que estoy situado $i el usuario propietario chown usuario (existe $USUARIO1 que es el nombre introducido de usuario)

Alguien sabe rematarme este script??
Pues supongo que sería esto:

case $COUNT in
C) chown $USUARIO1 $i ;;
S) echo "Fin de la aplicacion" ;;
*) break ;;
esac



PD: las variables $CONT y $COUNT no deberían ser la misma?
kornshell escribió:Pues supongo que sería esto:

case $COUNT in
C) chown $USUARIO1 $i ;;
S) echo "Fin de la aplicacion" ;;
*) break ;;
esac



PD: las variables $CONT y $COUNT no deberían ser la misma?


Si si, son la misma pero esque me colao copiandolas :-|


EDIT: Por cierto no me cambia el usuario propietario, debere ejecutar el script como ROOT?? (lo pregunto porque se me ha olvidado la pass de root [boma] )
Tienes que tener permisos sobre los archivos para poder cambiarles de usuario. Lo más fácil es hacerlo como root.
Y sigues sin leer el resto del hilo... ya he dicho que for i in `ls` es una mala idea.

- ferdy
17 respuestas