您可以将命令作为变量传递给另一个函数吗?如果是,语法是什么?
我的代码看起来像。
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'`
但这只传递了命令的第一个值(我理解为什么会这样)。
有没有人知道将命令作为变量传递的语法?
答案 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为,否则返回状态为零 大于$#或小于零,否则为非零。