Bash 传递给函数的变量的grep

Bash 传递给函数的变量的grep,bash,awk,grep,Bash,Awk,Grep,我正在将一个变量传递给从配置文件加载的函数。该变量依次传递给grep。我尝试了几种方法来扩展搜索变量($1),但似乎都不起作用,但是要搜索的文件效果很好($2) 有人能告诉我们什么是向grep函数表示变量的正确方法吗。我试过了 “$1”,“${1}”,$1,${1},”${1} 更新根据答案,我更新了script.sh,以重新选择实际的脚本复杂性,因为它仍然不起作用 谢谢 艺术 工作代码,没有用于RouteTableId的变量 MyVar=$(grep -m 1 "RouteTableId" $

我正在将一个变量传递给从配置文件加载的函数。该变量依次传递给grep。我尝试了几种方法来扩展搜索变量($1),但似乎都不起作用,但是要搜索的文件效果很好($2)

有人能告诉我们什么是向grep函数表示变量的正确方法吗。我试过了 “$1”,“${1}”,$1,${1},”${1}

更新根据答案,我更新了script.sh,以重新选择实际的脚本复杂性,因为它仍然不起作用

谢谢 艺术

工作代码,没有用于
RouteTableId的变量

MyVar=$(grep -m 1 "RouteTableId" $2)
不使用带有变量的代码,用于
RouteTableId

MyVar=$(grep -m 1 "RouteTableId" $2)
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,
因此,空值似乎是按顺序删除的,后续变量是按数字顺序向前推进的。 如果有人能证实并解释为什么我会很感激

thx Art

您不是在传递变量的值,而是将变量本身命名为值

i、 e

应该是

myFunction "$myTerm" "$myFile"
您没有传递变量的值,而是将变量本身命名为值

i、 e

应该是

myFunction "$myTerm" "$myFile"

如果这不是您所期望的,您应该编辑您的问题以更好地定义您所期望的:

$ 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脚本的第一个参数。在shell脚本内的函数中,
$1
是传递给该函数的第一个参数,而不是传递给shell脚本的第一个参数。因此,如果您做:

func() {
   echo "$1,$2,$3"
}
func "$1" "$3"
然后,您将获得传递给脚本的第一个参数的值(因为这也是传递给函数的第一个参数),然后是逗号,然后是传递给脚本的第三个参数(因为这是传递给函数的第二个参数),然后是另一个逗号,仅此而已(因为没有传递给函数的第三个参数)


希望这是有意义的。

如果这不是你所期望的,你应该编辑你的问题以更好地定义你所期望的:

$ 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脚本的第一个参数。在shell脚本内的函数中,
$1
是传递给该函数的第一个参数,而不是传递给shell脚本的第一个参数。因此,如果您做:

func() {
   echo "$1,$2,$3"
}
func "$1" "$3"
然后,您将获得传递给脚本的第一个参数的值(因为这也是传递给函数的第一个参数),然后是逗号,然后是传递给脚本的第三个参数(因为这是传递给函数的第二个参数),然后是另一个逗号,仅此而已(因为没有传递给函数的第三个参数)


希望这是有意义的。

是的,你是正确的,所以我更新了我的Q以反映更多的复杂性。thx ART是的,你是正确的,所以我更新了我的Q以反映更多的复杂性。thxArt@Ed,很高兴我能为杰出的职业生涯带来新的东西:)。是的,有几个子功能在其他处理选项中调用。节日快乐s!@artvanderlay你确定你可以使用这样的子函数吗?不是100%,但很确定你不能在函数中声明函数。即使你可以,但我认为最好将它们声明为单独的函数,然后将调用包含在另一个函数中。@Ed,很高兴我能为杰出的职业带来新的东西:)。是的,有在其他处理选项上调用的几个子函数。Happy Festitus!@artvanderlay你确定你可以使用这样的子函数吗?不是100%,但非常确定你不能在函数中声明函数。即使你可以,但我认为最好将它们声明为单独的函数,然后在其他处理选项上包含调用e、 感谢您的帮助。基于您之前帖子中的一些想法,我开始检查实际代码,因为它要复杂得多。您可以查看我的更新以了解我的发现。为了您的帮助,我以您的名义向人类基金会捐款-在这个节日期间为人们捐款。我在任何地方都看不到您的更新,但感谢您的帮助但是,我会将其重定向到制作更安全的邮票胶水。我现在看到了您的更新。看起来问题只是您没有引用变量。顽皮…使用
“${!1}”
,而不是
${!1}
。另外,当您调用
func“$1”“$3”
时,请在
func
第二个参数内(即
$2
)是您在调用代码中从
$3
提取的值,因此如果这不是您想要的,那么就不要这样做!我明白了,所以Null值不会作为value=Null传递,而是值不再存在。thx ArtNo,没有Null值。您将2个参数传递给函数,因此在函数中填充$1和$2,仅此而已。事实并非如此如果调用函数时使用了从调用方上下文中存在的$1和$3值填充的参数,则调用函数的内容与此完全无关。感谢您的帮助。基于您之前文章中的一些想法,我开始查看实际代码,因为它要复杂得多。您可以看到我的更新,以了解我的发现。为了您的帮助,我制作了一个dona在这个节日期间,以你的名义向人类基金会捐款。除了感谢你的捐款,我没有看到你的更新。但是,我会将它重定向到制作更安全的邮票胶水。我现在看到你的更新。它看起来像