Une autre solution à la question ci-dessus est de mettre chaque chaîne à une variable, appel 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
sortie est alors:
string1 = firstString
string2 = second string with spaces
string3 = thirdString
En essayant de résoudre un problème similaire à cela, je courais dans la question d'UNIX à penser mes variables ont été l'espace delimeted. J'essayais de passer une chaîne délimitée par un tuyau à 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 postée par ghostdog74 mais je n'ai pas réussi à 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 commencé à fonctionner comme prévu. Ci-dessous l'état avant de mon code et son état après fonctionnement.
Avant - code non fonctionnement
#!/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
Works pour moi ... J'utilise la syntaxe complète des fonctions si » fonction (bla) {echo $ 1; } ", ne peut pas faire un court dans un seul doublure Pas sûr que cela fait une différence Quelle version de bash? – Eugene
essayez' echo "$ @" 'ou' pour i dans "$ @"; faire echo $ i; done' pour utiliser correctement les paramètres entre guillemets contenant des espaces.Ceci est très clairement mentionné dans toute la documentation 'bash' sous la section' positional parameters' – Samveen
J'ai eu un problème similaire, en essayant de passer une chaîne entre guillemets comme paramètre et seulement le premier Le mot de la chaîne étant reconnu comme faisant partie du paramètre, la suggestion de Samveen de changer $ 1 en $ @ a fonctionné pour moi.Notez que je ne faisais passer qu'un seul paramètre à la fonction, mais si j'avais passé plus en utilisant l'instruction for –