【问题标题】:Passing a command as a variable to a function in Unix将命令作为变量传递给 Unix 中的函数
【发布时间】:2016-06-29 10:20:57
【问题描述】:

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

我的代码看起来像。

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'` 

但这只会传递命令的第一个值(我明白为什么会发生这种情况)。

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

【问题讨论】:

  • 当您在function1 中说for a in $1 时,这意味着您正在处理第一个参数。如果要循环遍历所有参数,需要使用$@
  • 上面的评论是正确的,你也可以省略 for 循环,只做echo @a - 如果你打算只传递一个字符串/函数
  • 我试过了,它有效!非常感谢! :)
  • 如果function1有多个参数怎么办?命令是传递的第三个参数,然后使用 $@ 接受一些不必要的值。我如何获取从 3 美元起的价值?

标签: bash function unix parameters


【解决方案1】:

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

来自Bash Manual → 3.4.2 Special Parameters

$@

($@) 扩展为位置参数,从一开始。当。。。的时候 扩展发生在双引号内,每个参数扩展为 单独的词。也就是说,“$@”等价于“$1”“$2”……。如果 双引号扩展出现在一个单词中,扩展 第一个参数与原始的开始部分连接 词,最后一个参数的扩展与最后一个连接 原词的一部分。当没有位置参数时, "$@" 和 $@ 扩展为空(即,它们被删除)。

那你问

如果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 为 大于 $# 或小于零,否则为非零。

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 2016-05-31
    • 2023-02-21
    • 2019-02-16
    • 2017-12-15
    • 2012-06-24
    • 1970-01-01
    • 2021-01-03
    • 2021-01-01
    相关资源
    最近更新 更多