Innym rozwiązaniem powyższego problemu jest ustawienie każdego ciągu na zmienną, wywołanie funkcji ze zmiennymi oznaczonymi literowym znakiem dolara \$
. Następnie w funkcji użyj, eval
aby odczytać zmienną i wyprowadzić zgodnie z oczekiwaniami.
#!/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
Wynik jest zatem:
string1 = firstString
string2 = second string with spaces
string3 = thirdString
Próbując rozwiązać problem podobny do tego, natknąłem się na problem UNIX, myśląc, że moje zmienne są rozdzielane spacjami. Próbowałem przekazać ciąg znaków rozdzielonych potokami do funkcji używającej awk
do ustawienia serii zmiennych, które później zostały użyte do utworzenia raportu. Początkowo wypróbowałem rozwiązanie opublikowane przez ghostdog74, ale nie mogłem go uruchomić, ponieważ nie wszystkie moje parametry były przekazywane w cudzysłowie. Po dodaniu podwójnych cudzysłowów do każdego parametru zaczął on działać zgodnie z oczekiwaniami.
Poniżej znajduje się stan mojego kodu przed i w pełni funkcjonujący po stanie.
Przed - niedziałający kod
#!/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
Po - kod działający
#!/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