Pasar una cadena con espacios como argumento de función en Bash
Estoy escribiendo un script Bash en el que necesito pasar una cadena que contenga 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 se genera es:
firstString
second
string
¿Hay alguna manera de pasar una cadena con espacios como argumento único a una función en Bash?
Debe agregar comillas y además su declaración de función es incorrecta.
myFunction()
{
echo "$1"
echo "$2"
echo "$3"
}
Y como los demás, a mí también me funciona.
Otra solución al problema anterior es establecer cada cadena en una variable, llamar a la función con variables indicadas por un signo de dólar literal \$
. Luego, en la función, use eval
para leer la variable y generar la salida como se esperaba.
#!/usr/bin/ksh
myFunction()
{
eval string1="$1"
eval string2="$2"
eval string3="$3"
echo "string1 = ${string1}"
echo "string2 = ${string2}"
echo "string3 = ${string3}"
}
var1="firstString"
var2="second string with spaces"
var3="thirdString"
myFunction "\${var1}" "\${var2}" "\${var3}"
exit 0
La salida es entonces:
string1 = firstString
string2 = second string with spaces
string3 = thirdString
Al intentar resolver un problema similar a este, me encontré con el problema de UNIX al pensar que mis variables estaban delimitadas por espacio. Estaba intentando pasar una cadena delimitada por tuberías 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 hacerla funcionar porque 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 en pleno funcionamiento.
Antes: código que no funciona
#!/usr/bin/ksh
#*******************************************************************************
# Setup Function To Extract Each Field For The Error Report
#*******************************************************************************
getField(){
detailedString="$1"
fieldNumber=$2
# Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString}
# And Strips Leading And Trailing Spaces
echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//'
}
while read LINE
do
var1="$LINE"
# Below Does Not Work Since There Are Not Quotes Around The 3
iputId=$(getField "${var1}" 3)
done<${someFile}
exit 0
Después - Código de funcionamiento
#!/usr/bin/ksh
#*******************************************************************************
# Setup Function To Extract Each Field For The Report
#*******************************************************************************
getField(){
detailedString="$1"
fieldNumber=$2
# Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString}
# And Strips Leading And Trailing Spaces
echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//'
}
while read LINE
do
var1="$LINE"
# Below Now Works As There Are Quotes Around The 3
iputId=$(getField "${var1}" "3")
done<${someFile}
exit 0
Una forma más dinámica sería:
function myFunction {
for i in "$*"; do echo "$i"; done;
}