我将变量传递给已从配置文件加载的函数。该变量又传递给grep。我已经尝试了几种方法来扩展搜索变量($ 1),但似乎没有一种方法可行,但搜索文件工作正常($ 2)。
有人可以建议将变量呈现给grep函数的正确方法是什么。我试过了 " $ 1"," $ {1}",$ 1,$ {1}," $ {!1}
更新根据答案我更新了script.sh以重新选择实际的脚本复杂性,因为它仍然不起作用。
感谢 领域
RouteTableId
没有变量的工作代码
MyVar=$(grep -m 1 "RouteTableId" $2)
不能使用包含RouteTableId
config.file
myTerm="RouteTableId"
myFile="my.file"
script.sh
. config.file
myFunction(){
mySubFunction(){
myVar=$(grep -m 1 "$1" $2)
echo $myVar
}
mySubFunction ${!1} ${!2}
}
myFunction "myTerm" "myFile"
更新 我做了一些更多的测试,事实证明,当在函数之间传递变量时,在某些情况下,如果其中一个序列为null,则编号顺序会发生变化。例如,如果我使用以下函数调用myFunction,则第二个变量为null
myFunction "myTerm" "blah" "myFile"
然后myFunction将看到以下
echo "${!1}, ${!2}, ${!3}"
RouteTableId,,my.file
然后将其传递给mySubFunction
mySubFunction ${!1} ${!3}
从mySubFunction中提供
echo "${!1}, ${!2}, ${!3}"
RouteTableId,my.file,
因此似乎在订单中删除了null,后续变量按数字顺序提前。 如果有人可以验证并解释我为什么会欣赏它。
THX 领域
答案 0 :(得分:3)
您没有传递变量的值,但变量将其自身命名为值。
即
myFunction "myTerm" "myFile"
应该是
myFunction "$myTerm" "$myFile"
答案 1 :(得分:2)
如果这不是您的期望,您应该编辑您的问题以更好地定义您的期望:
$ cat my.file
foo
Here it is: RouteTableId
bar
$
$ cat config.file
myTerm="RouteTableId"
myFile="my.file"
$
$ cat script.sh
. config.file
myFunction() {
mySubFunction() {
myVar=$(grep -m 1 "$1" "$2")
echo "$myVar"
}
mySubFunction "${!1}" "${!2}"
}
myFunction "myTerm" "myFile"
$
$ ./script.sh
Here it is: RouteTableId
从您最近的更新中,我认为您对$1
等的含义感到困惑。在shell脚本中,但在任何函数$1
之外是传递给shell脚本的第一个arg。在shell脚本中的函数$1
是传递给该函数的第一个arg,而不是传递给shell脚本的第一个arg。所以如果你这样做:
func() {
echo "$1,$2,$3"
}
func "$1" "$3"
然后你将获得传递给脚本的第一个arg的值(因为那也是传递给函数的第一个arg),然后是逗号,然后第三个arg传递给脚本(因为那是第二个arg)传递给函数)然后是另一个逗号,这就是全部(因为没有第三个arg传递给函数)。
希望这是有道理的。