Outra solução para o problema acima é definir cada string como uma variável, chamar a função com variáveis indicadas por um cifrão literal \$
. Em seguida, na função use eval
para ler a variável e a saída conforme o esperado.
#!/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
A saída é então:
string1 = firstString
string2 = second string with spaces
string3 = thirdString
Ao tentar resolver um problema semelhante a esse, estava encontrando o problema do UNIX pensando que minhas variáveis eram delimitadas por espaço. Eu estava tentando passar uma string delimitada por canal para uma função usando awk
para definir uma série de variáveis usadas posteriormente para criar um relatório. Inicialmente, tentei a solução postada por ghostdog74, mas não consegui fazê-la funcionar, pois nem todos os meus parâmetros estavam sendo passados entre aspas. Após adicionar aspas duplas a cada parâmetro, ele começou a funcionar conforme o esperado.
Abaixo está o estado anterior do meu código e funcionando totalmente após o estado.
Antes - Código que não funciona
#!/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
Código de funcionamento após
#!/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