另一种解决方案是在每个字符串设定为一个变量,通话带有由字面美元符号\$
表示的变量的函数。然后在函数中使用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发布的解决方案,但无法让它工作,因为并非所有的参数都被引用。在为每个参数添加双引号后,它开始按预期工作。
下面是我的代码之前的状态,并在状态之后完全运作。
前 - 未正常运行的代码
#!/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
对我的作品时,空间分隔arguements ......我用充满语法虽然功能”功能BLA( ){echo $ 1; }“,不能确定它是否为一个班轮,不知道它有什么不同。什么版本的bash? – Eugene 2009-12-30 23:28:11
尝试'echo”$ @“'或'for i in”$ @“; echo $ i; done'因为使用正确引用的包含空格的参数,这在'位置参数“部分下的所有'bash'文档中都清楚地提到了 – Samveen 2013-06-14 07:06:09
我有一个类似的问题,试图传递一个带引号的字符串作为参数,字符串被识别为参数的一部分Samveen建议将$ 1更改为$ @为我工作注意,我只向函数传递了一个参数,但如果我使用for语句传递的更多, – 2014-04-20 08:01:57