Une autre solution au problème ci-dessus consiste à définir chaque chaîne sur une variable, appelez la fonction avec des variables désignées par un signe dollar littéral \$
. Ensuite, dans la fonction, utilisez eval
pour lire la variable et la sortie comme prévu.
#!/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 sortie est alors:
string1 = firstString
string2 = second string with spaces
string3 = thirdString
En essayant de résoudre un problème similaire à celui-ci, je tombais sur le problème d'UNIX en pensant que mes variables étaient délimitées par des espaces. J'essayais de passer une chaîne délimitée par un tube à une fonction en utilisant awk
pour définir une série de variables utilisées plus tard pour créer un rapport. J'ai d'abord essayé la solution publiée par ghostdog74 mais je n'ai pas pu la faire fonctionner car tous mes paramètres n'étaient pas passés entre guillemets. Après avoir ajouté des guillemets à chaque paramètre, il a alors commencé à fonctionner comme prévu.
Vous trouverez ci-dessous l'état avant de mon code et fonctionne pleinement après l'état.
Avant - Code non fonctionnel
#!/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
Après - Code de fonctionnement
#!/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