Ayuda con Script en Shell de Linux

Wenas!! En clase ahora estamos dando el Shell Scripting, de momento no me parece muy difícil, se parece bastante al C (que tampoco es que se me haya dando nunca demasiado bien xD)

Weno, al lío que me enrollo si no...

Tengo que hacer un script que lea una serie de parámetros y después los muestre por pantalla en orden inverso, algo más o menos asi:

Introduzco: nombre_script 1 2 3 4 5 6
Y el shell me tiene que devolver: 6 5 4 3 2 1

Parece fácil, verdad¿? Probablemente lo sea, pero con esta chorradita me estoy comiendo la cabeza de mala manera xD

De momento lo que tengo hecho (que tampoco se si esta bien, no os riais mucho de mi que estoy empezando y nunca se me ha dado bien [toctoc]) es:

while [ i -ne $# ]
do
read $1>temp
let i=i+1
done
while [ j -ne $# ]
do
tail -$#-j temp>>temp2
done
echo "temp2"


Salu2 NemesisInferno
The Sorrow escribió:Wenas!! En clase ahora estamos dando el Shell Scripting, de momento no me parece muy difícil, se parece bastante al C (que tampoco es que se me haya dando nunca demasiado bien xD)

Weno, al lío que me enrollo si no...

Tengo que hacer un script que lea una serie de parámetros y después los muestre por pantalla en orden inverso, algo más o menos asi:

Introduzco: nombre_script 1 2 3 4 5 6
Y el shell me tiene que devolver: 6 5 4 3 2 1

Parece fácil, verdad¿? Probablemente lo sea, pero con esta chorradita me estoy comiendo la cabeza de mala manera xD

De momento lo que tengo hecho (que tampoco se si esta bien, no os riais mucho de mi que estoy empezando y nunca se me ha dado bien [toctoc]) es:

while [ i -ne $# ]
do
read $1>temp
let i=i+1
done
while [ j -ne $# ]
do
tail -$#-j temp>>temp2
done
echo "temp2"


Salu2 NemesisInferno
No me acuerdo de NADA de shell de linux! XD (desde que hicimos el firewall en clase no he tocado na de na).
De todas formas te ayudaran mejor en la seccion de sl.
Reporto
Jajjaa!! A mi me pasa algo parecido con C, que lo di el año pasado pero el verano hace estragos [360º]

Oki, pues si algún amable moderador hace el favor de pasármelo al foro de Software libre... (la verdad es que estuve dudando entre general o soft libre para ponerlo xD)

Salu2 NemesisInferno
Jeje, para mi también ha pasado el verano, porqué se me dio bien en clase pero ya casi no recuerdo nada, ya la aprobé XD

Si te sirve como idea, si es en el prompt que ejecutas program 1 2 3, y en la linea de comandos te ha de salir 3 2 1, cuando ejecutas lo de program 1 2 3 creo que lo almacena en una variable args o así, busca por ahí.
Esa variable creo que es un vector, así que imagino que podrás obtener su size, y hacer un for (i=size; i>1; i--) print (args(i))

Tomatelo como una idea.

Suerte!
Utiliza '$#' o '$*'

¡Saludos!
Bueno, bonito y portable:

let i=$#
while [ ${i} -gt 0 ] ; do
   [ ${i} -eq $# ] || echo -n " "
   eval echo -n \$$i
   let i=$i-1
done
echo


Fácil, legible, pero solo bash:

i=$#
while ((i > 0)) ; do
   ((i == $#)) || echo -n " "
   echo -n ${!i}
   ((i--))
done
echo


- ferdy
Que bueno andaba buscando esto mismo por google y acabo aqui, si es que eol es la caña eh The Sorrow [sonrisa]
spcat escribió:Que bueno andaba buscando esto mismo por google y acabo aqui, si es que eol es la caña eh The Sorrow [sonrisa]


Si, si, andabas buscando lo mismo por google...como que te tengo al lado en clase mariquita!!! [plas] jajaja!! Weno, al final el examen parece que si que lo vamos a aprobar!! ñ_ñ

Somos la polla!! oooeeeooeoeoeoeoe!!!!! [beer]

Salu2 NemesisInferno
Te has complicado un poco la vida:

while [ "$#" -gt 0 ] ; do
export ret="$1 $ret"
shift
done
echo $ret

xD Ya se que es antiguo.... pero he dicho, vamos a ver si lo mejoro

Ferdy escribió:Bueno, bonito y portable:

let i=$#
while [ ${i} -gt 0 ] ; do
   [ ${i} -eq $# ] || echo -n " "
   eval echo -n \$$i
   let i=$i-1
done
echo


Fácil, legible, pero solo bash:

i=$#
while ((i > 0)) ; do
   ((i == $#)) || echo -n " "
   echo -n ${!i}
   ((i--))
done
echo


- ferdy
Eso que has pegado, es equivalente a esto:

ret=""
while [[ -n $1 ]] ; do
   ret="$1 ${ret}"
   shift
done
echo "'${ret}'"


Y no hace lo mismo que las que yo propuse[*1*].

Ahora leyéndolas, si, me compliqué la vida. Aquí está la versión buena:

ret=""
while [[ -n $1 ]] ; do
   [[ -z ${ret} ]] && ret="$1" || ret="$1 ${ret}"
   shift
done
echo "'${ret}'"


Bueno, bonito, barato, y hace lo que se le pide :)

- ferdy

[*1*] - Tu código, además de añadir innecesariamente una variable al entorno, escribe un espacio de más.
[[ -z ${ret} ]] && ret="$1" ||

esto no hace falta hacerlo, cuando la variable esté vacía lo concatenará con nada :D y las comillas del final sobran que sino te aparecerá la cadena con comillas :)

Si nos ponemos pejilgeros la variable solo se añade al entorno de ejecución. Una vez ejecutado la variable desaparece (a no ser que lo cargues en la shell). Es cierto que se podría hacer sin el export.

Pero bueno, como todo se puede mejorar pongo una versión un poco más mejorada:


while [ "$#" -gt 0 ] ; do
ret="$1 $ret"
shift
done
echo "$ret" | sed 's/\(.*\) /\1/'

o si no te agrada el sed

while [ "$#" -gt 0 ] ; do
ret="$1 $ret"
shift
done
echo "$ret" | col

Con esta nueva versión hacemos menos procesos que en tu versión y así sobrecargas menos al sistema :-P xD, aunque bueno... sería mejor mi primera versión... nadie dijo que no pudiera tener espacios al final ;-)
Las comillas del final son para que veas que tu código está mal. Escribe un espacio de más.

- ferdy
Acabo de editar mi anterior post ;-)
Es más caro un fork + pipe que una comprobación en cada iteración. Puedes mirarlo en tu libro sobre Introducción a Sistemas Operativos o similar más cercano.

- ferdy
Se que un fork + pipe es más pesado que una llamada interna del shell. Lo único que yo hacía un script más genérico. No todos los shells tienen el comando test como función interna.

Sacado del man de test:

So that the shell script can be parsed properly it is essential that there are spaces either side of the square brackets. On most implementations test is a shell internal.


Creo que así no vamos a terminar nunca. xD
Lo que escribí es bash, y en bash [[ es un built-in.

- ferdy
15 respuestas