Pasar una cadena con espacios como argumento de función en Bash

Resuelto Grant Limberg asked hace 14 años • 8 respuestas

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?

Grant Limberg avatar Dec 31 '09 06:12 Grant Limberg
Aceptado

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.

ghostdog74 avatar Dec 30 '2009 23:12 ghostdog74

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 evalpara 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 awkpara 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
TheBanjoMinnow avatar May 15 '2014 20:05 TheBanjoMinnow

Una forma más dinámica sería:

function myFunction {
   for i in "$*"; do echo "$i"; done;
}
remykarem avatar Sep 20 '2018 06:09 remykarem