传递给函数的变量grep

时间:2014-12-18 22:29:11

标签: bash awk grep

我将变量传递给已从配置文件加载的函数。该变量又传递给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 领域

2 个答案:

答案 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传递给函数)。

希望这是有道理的。