Estoy escribiendo un script bash donde necesito pasar una cadena que contiene espacios a una función en mi script bash.
Por ejemplo:
#!/bin/bash
myFunction
{
echo $1
echo $2
echo $3
}
myFunction "firstString" "second string with spaces" "thirdString"
Cuando se ejecuta, el resultado que esperaría es:
firstString
second string with spaces
thirdString
Sin embargo, lo que realmente sale es:
firstString
second
string
¿Hay alguna manera de pasar una cadena con espacios como argumento único a una función en bash?
echo "$@"
ofor i in "$@"; do echo $i ; done
para usar parámetros correctamente citados que contienen espacios. Este es el muy claramente mencionado en toda labash
documentación en lapositional parameters
sección.myFunction "$@"
Respuestas:
debe poner comillas y también, su declaración de función es incorrecta.
Y como los demás, también funciona para mí. Díganos qué versión de shell está utilizando.
fuente
$@
comporta como sin comillas$*
: los resultados se dividen en cadenas y luego se expanden individualmente de forma global, por lo que si tiene pestañas, se convertirán en espacios, si tiene palabras que pueden evaluarse como expresiones globales. será, etc.Otra solución al problema anterior es establecer cada cadena en una variable, llamar a la función con variables denotadas por un signo de dólar literal
\$
. Luego, en la función, useeval
para leer la variable y la salida como se esperaba.La salida es entonces:
Al tratar de resolver un problema similar a este, me encontraba con el problema de UNIX pensando que mis variables estaban delimitadas por espacios. Intenté pasar una cadena delimitada por una tubería a una función
awk
para establecer una serie de variables que luego se usaron para crear un informe. Inicialmente probé la solución publicada por ghostdog74 pero no pude hacer que funcionara ya que no todos mis parámetros se pasaban entre comillas. Después de agregar comillas dobles a cada parámetro, comenzó a funcionar como se esperaba.A continuación se muestra el estado anterior de mi código y el estado posterior completamente funcional.
Antes - Código no funcional
Después - Código de funcionamiento
fuente
La solución más simple a este problema es que solo necesita usar
\"
argumentos separados por espacios al ejecutar un script de shell:fuente
Su definición de myFunction es incorrecta. Debería ser:
o:
De todos modos, se ve bien y funciona bien para mí en Bash 3.2.48.
fuente
Llego 9 años tarde pero una forma más dinámica sería
fuente
Solución simple que funcionó para mí: cotizado $ @
Pude verificar el comando grep real (gracias a set -x).
fuente
Podría tener una extensión de este problema en caso de que su texto inicial se haya configurado en una variable de tipo de cadena, por ejemplo:
En este caso, si no pasa la variable status_message hacia adelante como una cadena (rodeada por ""), se dividirá en un conjunto de argumentos diferentes.
"$ variable" : la pista actual es CDE en DEF por ABC
$ variable : El
fuente
myFunction "firstString" "second string with spaces" "thirdString"
y no funcionó para él. Entonces, lo que usted propone no se aplica a esta pregunta.Tenía el mismo tipo de problema y, de hecho, el problema no era la función ni la llamada a la función, sino lo que le pasé como argumentos a la función.
La función se llamó desde el cuerpo del script, el 'principal', así que pasé "st1 a b" "st2 c d" "st3 e f" desde la línea de comandos y la pasé a la función usando myFunction $ *
$ * Causa el problema a medida que se expande en un conjunto de caracteres que se interpretarán en la llamada a la función utilizando espacios en blanco como delimitador.
La solución fue cambiar la llamada a la función en el manejo explícito de argumentos desde el 'principal' hacia la función: la llamada sería myFunction "$ 1" "$ 2" "$ 3" que preservará el espacio en blanco dentro de las cadenas ya que las comillas delimitarán los argumentos ... Entonces, si un parámetro puede contener espacios, debe manejarse explícitamente en todas las llamadas de funciones.
Como esta puede ser la razón de las largas búsquedas de problemas, puede ser aconsejable nunca usar $ * para pasar argumentos ...
Espero que esto ayude a alguien, algún día, en algún lugar ... Jan.
fuente
"$@"
, no todos citado"$1"
,"$2"
, ... parametros posicionales ni$*
.