Bash: diferencia entre el contenido del argumento y su posición

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: maiku, akodo

Responder
Avatar de Usuario
Misura
Forista Nuevo
Forista Nuevo
Mensajes: 6
Registrado: Jue Ago 23, 2012 8:47 pm

Bash: diferencia entre el contenido del argumento y su posición

Mensaje por Misura »

Hola de nuevo!

La pregunta que me gustaría haceros es un poco tonta, pero creo que ya me estoy rayando :-k

Sabiendo que $# => número de argumentos que se le pasa al script y $* => conjunto de argumentos,
si hago

for i in S#
do
echo $i
done


imprimirá por pantalla la secuencia de números hasta alcanzar el número total de argumentos que se le pasa. Pero si lo hago con $*, entonces mostrará el contenido de estos argumentos por pantalla.

mi duda es muy tonta: Lo que pretendo es tener un bucle para poder recorrer el contenido de los parámetros, pero dentro de ese bucle hacer un if, porque si es el primer parámetro entonces tengo que hacer otra cosa especial con él. Pero claro, si utilizo "$i" o bien me sale el número 1 si recorro $# o bien me sale sólo el contenido si lo hago con $*. Y no quiero comparar el contenido if [ $i = $1 ] ya que es posible que cualquier otro parámetro se llame igual que el 1, vamos, tenga igual contenido. Lo que necesito es saber que si la variable "i" toma el valor entero 1, entonces quiero coger el contenido del parámetro que está en la posición 1, es decir $i, que será $1. Pero no puedo poner $1, porque también lo necesito para el resto de parámetros, por lo que neceisto $i.

(Um... quien haya entendido lo que he dicho se merece un premio #-o )

Había pensado hacerlo con un while y lo he intentando utilizando let para hacer aritmética la variable, pero luego no puedo entonces comprobar su contenido porque es un entero.

Me toy volviendo crazy xDD Y seguro que es una estupidez... :oops:

¿Alguien sabría cómo tratarlo?
Gracias mil :hi:

Editado -- Jue Ago 30, 2012 2:06 am --

Bueno, por si a alguien le sirve, se me ha ocurrido que haciendo esto:

rutas=$(echo $* | awk -F " " '{for (i=2; i<=NF; i++) printf "%s ", $i}')

pues podemos tener un listado del contenido de los parámetros sin contar con el primero. No es lo que buscaba, pero apañado podría servir.

Snark1994
Forista Menor
Forista Menor
Mensajes: 76
Registrado: Sab Abr 02, 2011 11:43 pm

Re: Bash: diferencia entre el contenido del argumento y su posición

Mensaje por Snark1994 »

Se puede hacer esto:

Código: Seleccionar todo

#hacer algo con $1
shift    #$2 se hace $1, $3 se hace $2, $4 se hace $3, etc., etc.
for i in $*; do      #empieza con el nuevo $1, el $2 anterior.
    #hacer algo con los otros
done
(pero se nota que

Código: Seleccionar todo

for i in S#
do
echo $i
done
no imprimirá una secuencia de números, sino solo el número total de argumentos - para mi, al menos)
No soy hispanohablante - si he cometido un error con mi español, dime por favor :) me gustaría mejorarlo

Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9186
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: Bash: diferencia entre el contenido del argumento y su posición

Mensaje por niky45 »

asi como idea, le puedes echar un ojo al comportamiento de shift (echale un ojo al man de bash)

y asi como mini-ejemplo de lo que quieres:

Código: Seleccionar todo

 #!/bin/bash
i=1
while [ $i -le $# ]; do 
  eval param=\$$i                                                                                                                                                                        
  [ $i == 1 ] && echo "este es el primer parametro: $param"
  echo "este es el parametro $i: $param"
  let i=$i+1 
done
guardalo como prueba.sh, y llamalo como bash prueba.sh par01 par002 par03 par40 par050 para que veas como se comporta. :wink:
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]

Snark1994
Forista Menor
Forista Menor
Mensajes: 76
Registrado: Sab Abr 02, 2011 11:43 pm

Re: Bash: diferencia entre el contenido del argumento y su posición

Mensaje por Snark1994 »

O más sencillo que lo de niky45, pero parecido, utilizando 'seq':

Código: Seleccionar todo

 #!/bin/bash

for i in $(seq $#); do 
  eval param=\$$i                                                                                                                                                                        
  [ $i == 1 ] && echo "este es el primer parametro: $param"
  echo "este es el parametro $i: $param"
done
No se debe inicializar y incrementar 'i'
No soy hispanohablante - si he cometido un error con mi español, dime por favor :) me gustaría mejorarlo

Responder
  • Temas similares
    Respuestas
    Vistas
    Último mensaje