Innym rozwiązaniem problemu powyżej jest ustawić każdy łańcuch do zmiennej, zaproszenia funkcja ze zmiennymi oznaczona literalnym znakiem dolara \$
. Następnie w funkcji użyj eval
, aby odczytać zmienną i wyjście 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
wyjściowa wynosi zatem:
string1 = firstString
string2 = second string with spaces
string3 = thirdString
Próbując rozwiązać podobny problem z tym, że został uruchomiony w kwestii UNIX myśli moje zmienne przestrzeń delimeted. Próbowałem przekazać ciąg rozdzielany potokami do funkcji przy użyciu awk
, aby ustawić serię zmiennych używanych później 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łowach. Po dodaniu podwójnych cudzysłowów do każdego parametru, zaczęło działać zgodnie z oczekiwaniami.
Poniżej znajduje się poprzedni stan mojego kodu iw pełni funkcjonujący po stanie.
Przed - Bez kodu Funkcjonowanie
#!/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 - Funkcjonowania Kodeksu
#!/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
pracuje dla mnie ... Używam pełną składnię funkcji choć” function (bla) {echo 1 $; } ", nie można zrobić krótkiego w jedną linijkę.Nie wiesz, że to robi różnicę.Jakie wersje bash? – Eugene
wypróbuj' echo "$ @" 'lub' dla i w "$ @"; wykonaj echo $ i; done' do używania poprawnie cytowanych parametrów zawierających spacje.To jest bardzo wyraźnie wspomniane we wszystkich dokumentacjach 'bash' w sekcji' pozycyjnych parametrów' – Samveen
Miałem podobny problem, próbując przekazać jeden cytowany ciąg jako parametr i tylko pierwszy słowo stringa jest rozpoznawane jako część parametru Propozycja Samveena, aby zmienić 1 $ na $ @, działała dla mnie Zauważ, że przekazałem tylko jeden parametr do funkcji, ale gdybym przekazywał więcej używając instrukcji for, –