Passing a string with spaces as a function argument in Bash Passing a string with spaces as a function argument in Bash bash bash

Passing a string with spaces as a function argument in Bash


You should add quotes and also, your function declaration is wrong.

myFunction(){    echo "$1"    echo "$2"    echo "$3"}

And like the others, it works for me as well.


Another solution to the issue above is to set each string to a variable, call the function with variables denoted by a literal dollar sign \$. Then in the function use eval to read the variable and output as expected.

#!/usr/bin/kshmyFunction(){  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

Output is then:

    string1 = firstString    string2 = second string with spaces    string3 = thirdString

In trying to solve a similar problem to this, I was running into the issue of UNIX thinking my variables were space delimeted. I was trying to pass a pipe delimited string to a function using awk to set a series of variables later used to create a report. I initially tried the solution posted by ghostdog74 but could not get it to work as not all of my parameters were being passed in quotes. After adding double-quotes to each parameter it then began to function as expected.

Below is the before state of my code and fully functioning after state.

Before - Non Functioning Code

#!/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 LINEdo  var1="$LINE"  # Below Does Not Work Since There Are Not Quotes Around The 3  iputId=$(getField "${var1}" 3)done<${someFile}exit 0

After - Functioning Code

#!/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 LINEdo  var1="$LINE"  # Below Now Works As There Are Quotes Around The 3  iputId=$(getField "${var1}" "3")done<${someFile}exit 0


A more dynamic way would be:

function myFunction {   for i in "$*"; do echo "$i"; done;}