将命令作为变量传递给Unix中的函数

时间:2016-06-29 10:20:57

标签: bash function unix parameters

您可以将命令作为变量传递给另一个函数吗?如果是,语法是什么?

我的代码看起来像。

function1(){

for a in $1 
do
   echo $a
done
}

function2(){

function1 "ls -lrt folder/Name | grep 'foo' | grep 'bar'"

}

但这不起作用。我甚至尝试将它传递给:

function1 `ls -lrt folder/Name | grep 'foo' | grep 'bar'` 

但这只传递了命令的第一个值(我理解为什么会这样)。

有没有人知道将命令作为变量传递的语法?

1 个答案:

答案 0 :(得分:0)

如评论中所示,您使用的是$1,但这只包含第一个参数。相反,您需要使用$@

来自Bash Manual → 3.4.2 Special Parameters

  

<强> $ @

     

($ @)从1开始扩展到位置参数。当。。。的时候   扩展发生在双引号内,每个参数扩展为a   单词。也就是说,&#34; $ @&#34;相当于&#34; $ 1&#34; &#34; $ 2#34; ...。如果   双语扩张发生在一个词内,扩展了   第一个参数与原始的开头部分连接在一起   单词,并将最后一个参数的扩展与最后一个参数连接起来   原始单词的一部分。没有位置参数时   &#34; $ @&#34;并且$ @扩展为空(即,它们被删除)。

然后你问

  

如果function1需要多个参数怎么办?命令是   传递的第三个参数,然后使用$ @接受一些   不必要的价值如何从$ 3开始获取价值?

为此,您要使用shift

$ cat myscript.sh
#!/bin/bash
shift 2

echo "$@"
$ ./myscript.sh a b c d
c d
  

<强>移

 shift [n]
     

将位置参数向左移动n。位置   来自n + 1 ... $#的参数被重命名为$ 1 ... $# - n。参数   由$#到$# - n + 1的数字表示未设置。 n必须是   非负数小于或等于$#。如果n为零或更大   比$#,位置参数不会改变。如果n不是   如果提供,则假定为1.除非n为,否则返回状态为零   大于$#或小于零,否则为非零。