Eine andere Lösung für das obige Problem besteht darin, jede Zeichenfolge auf eine Variable zu setzen und die Funktion mit Variablen aufzurufen, die durch ein Literal-Dollarzeichen gekennzeichnet sind \$
. Verwenden Sie dann in der Funktion eval
, um die Variable zu lesen und wie erwartet auszugeben.
#!/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
Die Ausgabe ist dann:
string1 = firstString
string2 = second string with spaces
string3 = thirdString
Bei dem Versuch, ein ähnliches Problem zu lösen, stieß ich auf das Problem von UNIX, weil ich dachte, meine Variablen seien durch Leerzeichen getrennt. Ich habe versucht, eine durch Pipe getrennte Zeichenfolge mit an eine Funktion zu übergebenawk
zu übergeben, um eine Reihe von Variablen festzulegen, die später zum Erstellen eines Berichts verwendet wurden. Ich habe zunächst die von Ghostdog74 veröffentlichte Lösung ausprobiert, konnte sie jedoch nicht zum Laufen bringen, da nicht alle meine Parameter in Anführungszeichen übergeben wurden. Nachdem jedem Parameter doppelte Anführungszeichen hinzugefügt wurden, begann er wie erwartet zu funktionieren.
Unten ist der Vor-Status meines Codes und der voll funktionsfähige Nach-Status.
Vorher - Nicht funktionierender 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 LINE
do
var1="$LINE"
# Below Does Not Work Since There Are Not Quotes Around The 3
iputId=$(getField "${var1}" 3)
done<${someFile}
exit 0
Nach - Funktionscode
#!/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