Linux/Unix Shell Scripting - Parametro con espacios pasado a una función

 
Vista:
Imágen de perfil de Simón
Val: 54
Plata
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Parametro con espacios pasado a una función

Publicado por Simón (14 intervenciones) el 16/06/2017 03:33:15
Llevo tiempo dándole vueltas y no termino de encontrar la solución.
Se trata de pasar un parámetro que contiene espacios de un script a una función de la siguiente forma:
1
2
3
4
5
6
7
#!/bin/bash
function prueba(){
     echo $#
     echo $1, $2
}
echo $#
prueba $@

1
$ script "cadena con espacios varios" 5

resultado:
1
2
3
4
2
cadena con espacios varios, 5
5
cadena, con

Ya he realizado todas las combinaciones de encerrar en comillas los parámetros sin conseguir que al la función me lleguen solo dos parámetros. Siempre es el número de palabras más el segundo parámetro.
Alguien puede orientarme.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 64
Plata
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Parametro con espacios pasado a una función

Publicado por kip (17 intervenciones) el 16/06/2017 04:51:02
Hola, simplemente coloca unas comillas:

1
2
3
4
5
6
7
#!/bin/bash
function prueba {
     echo $#
     echo $1, $2
}
echo $#
prueba "$@"

Esto es lo que nos dice la documentacion:

$@ -- Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2" ...
https://linux.die.net/man/1/bash

Es decir, cada parametro usando las comillas dobles es separado a una palabra, un solo valor, en tu caso al no usarlo ocurria lo que ya te paso:

El codigo original, añadido con tantos $# como interpertara $@ al no usar " ", ocurre una expansión no esperada:
1
2
3
4
5
6
function prueba(){
     echo $#
     echo $1, $2, $3, $4, $5
}
echo $#
prueba $@

1
$ script "cadena con espacios varios" 5

Me mostrara:
1
2
3
2
5
cadena, con, espacios, varios, 5

Si te das cuenta, la interpretacion que tuvo al crear los valores en $@ lo hizo expandiendo cada palabra como diferentes argumentos, al colocarle las " " funciona como deberia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Simón
Val: 54
Plata
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Parametro con espacios pasado a una función

Publicado por Simón (14 intervenciones) el 16/06/2017 12:43:35
Claro pero eso es lo que pretendo evitar. Yo le paso dos parametros y me gustaría recibir "2" parámetros no 5 ya que si no me veo obligado a colocar un delimitador para saber que parametros corresponden a la primera frase. Si en lugar del 5 como segundo parametro fuera otra frase, no tendría posibilidad de distinguir entre las palabras de un parametro de las de otro. Además no se cuantas palabras ve a tener la frase en situación de trabajo real.
Gracias por contestar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 64
Plata
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Parametro con espacios pasado a una función

Publicado por kip (17 intervenciones) el 16/06/2017 12:46:57
Probaste usando como te dije comillas ? Así "$@" ? De esa forma recibirás las cadenas como un solo argumento !
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Simón
Val: 54
Plata
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Parametro con espacios pasado a una función

Publicado por Simón (14 intervenciones) el 16/06/2017 12:55:56
Si, como decía, ya he probado todas las posibilidades de entrecomillado, pero siempre es el mismo resultado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 64
Plata
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Parametro con espacios pasado a una función

Publicado por kip (17 intervenciones) el 16/06/2017 13:06:37
Simón yo he probado de la forma que te menciono más arriba y recibo dos argumentos enviando dos cadenas con espacios, no tengo ningún problema:

1
2
3
4
5
6
7
#!/bin/bash
function prueba {
    echo $#
    echo $1, $2
}
echo $# 
prueba "$@"

1
script "cadena espacio" "cadena otro espacio"

Y me muestra correctamente
1
2
3
2
2
cadena espacio, cadena otro espacio

sobre que distribución trabajas ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Simón
Val: 54
Plata
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Parametro con espacios pasado a una función

Publicado por Simón (14 intervenciones) el 16/06/2017 16:23:14
openSuse, debian, mint y raspdebian
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Simón
Val: 54
Plata
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Parametro con espacios pasado a una función

Publicado por Simón (14 intervenciones) el 16/06/2017 16:28:42
Esto es increíble. Ahora también a mi. La única diferencia es que he reiniciado el equipo. Pero pasarlos con las comillas lo había hecho y no funcionaba. Pensando ahora sobre las causas es posible que algún script anterior, me haya dejado el IFS no de forma estandar. Otra cosa no se me ocurre.
Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Simón
Val: 54
Plata
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Parametro con espacios pasado a una función

Publicado por Simón (14 intervenciones) el 16/06/2017 17:01:18
No no estaba resuelto. Os dejo otro ejemplo más próximo a las condiciones reales de trabajo y os explico lo que averigüé.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
 
function prueba1(){
     echo "número de parámetros en prueba1: $#"
     echo "parámetros '\$1': $1, '\$2': $2"
}
 
function prueba2(){
     echo "número de parámetros en prueba2: $#"
     echo "parámetros '\$1': $1, '\$2': $2"
}
echo "número de parámetros en script: $#"
echo $1, $2, $3
 
orden="$1"
shift
#parametros="$@"
 
respuesta=("$($orden "$@" 2>&1;)")
echo $respuesta
Tal como se ve en el script ahora funciona correctamente, pero cuando en lugar de pasar directamente "$@" pasaba "$parametros", si iban con comillas se convertían todos en uno, si no ponía comillas se dividía en cada palabra.

1
2
3
4
./Proyectos/bash/pruebas/pruebaparametros prueba2 "cadena con espacios varios" "otra cadena"
número de parámetros en script: 3
prueba2, cadena con espacios varios, otra cadena
número de parámetros en prueba2: 2 parametros '$1': cadena con espacios varios, '$2': otra cadena
Muchas gracias. Espero que la experiencia sea útil para todos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Parametro con espacios pasado a una función

Publicado por Tom (332 intervenciones) el 16/06/2017 17:41:01
¿ no te vale con

respuesta=$(eval "$@")

?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Simón
Val: 54
Plata
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Parametro con espacios pasado a una función

Publicado por Simón (14 intervenciones) el 16/06/2017 18:52:48
Al menos a mi no me funciona. Pero sí con la solución expuesta en mi anterior mensaje.
El problema se me generaba al asignar a una variable el resto de parámetros y pasar la variable a la función.
Pasando directamente "$@" funciona correctamente en el script de prueba y en el real.
Este funcionamiento de Bash con las cadenas como parámetros me produce bastante inseguridad a la hora de abordar los proyectos.
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Parametro con espacios pasado a una función

Publicado por Tom (332 intervenciones) el 17/06/2017 08:17:39
Pues funciona perfectamente. El comportamiento de bash con las comillas y las cadenas está bastante bien descrito, tanto en la documentación de bash como en la infinidad de tutoriales que te encontrarás en la www.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar