Другим решением вышеуказанной проблемы является, чтобы установить каждую строку в переменном, вызов функция с переменными, обозначаемая буквенным знаком доллара \$
. Затем в функции используйте eval
для чтения переменной и вывода, как и ожидалось.
#!/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
Выход затем:
string1 = firstString
string2 = second string with spaces
string3 = thirdString
В попытке решить подобную проблему к этому, я бегу в вопрос UNIX мышления мои переменные пространства delimeted. Я пытался передать строку с разделителем на строку с помощью функции awk
, чтобы установить серию переменных, которые позже используются для создания отчета. Сначала я попробовал решение, отправленное ghostdog74, но не смог заставить его работать, поскольку не все мои параметры передавались в кавычках. После добавления двойных кавычек к каждому параметру он начал функционировать должным образом.
Ниже приведено состояние моего кода и полностью функционирует после состояния.
Before - Non Функционирование Кодекса
#!/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
После - функционирующая кодекса
#!/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
работает для меня ... Я использую полный синтаксис для функций, хотя» функции бла () {echo $ 1; } ", не может сделать короткий в один лайнер. Не уверен, что это имеет значение. Какая версия bash? – Eugene
попробуйте' echo '$ @ "или' for i в "$ @"; do echo $ i; done' для использования правильно цитируемых параметров, содержащих пробелы. Это очень четко указано во всей документации 'bash' в разделе' positional parameters'. – Samveen
У меня была аналогичная проблема, пытаясь передать одну кавычку в качестве параметра и только первый слово строки, которое распознается как часть параметра. Предложение Самвеена изменить от $ 1 до $ @ работало для меня. Обратите внимание, что я передавал только один параметр функции, но если бы я проходил больше, используя оператор for, были необходимы. –