Passing a string with spaces as a function argument in Bash
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