Bash:将不同的参数列表传递给函数

Bash: passing different lists of arguments to a function

提问人:stander 提问时间:10/31/2021 最后编辑:stander 更新时间:10/31/2021 访问量:878

问:

我使用这个函数将一些文件名提供给另一个命令。

function fun(){  
  find "${@}" -print0 | xargs -r0 other_command
}

调用时,所有参数都会传递给以过滤文件名(等)find-type, -name,

有没有办法将其中一些参数传递给? 如果可能,参数数量可变。other_command

像这样的东西

fun [list of aguments for find] [list of aguments for other_command]   # pseudo-phantasy syntax

可能吗?

bash shell 脚本参数 参数传递

评论

1赞 Léa Gris 10/31/2021
在允许将变量参数传递给函数的每种语言中,有两个常见的约束:1)变量参数必须位于位置参数的最后或之后。2) 变量参数只能有一个集合/类型。当需要函数处理两个或多个条目列表时;通常通过引用而不是值来传递这些内容。查看Andrej的回答
0赞 stander 11/1/2021
是的,这回答了我的问题。我设法构建了一个包含 find 和 grep 的字符串,每个字符串都有自己的参数取自 2 数组,并使用 eval: cmdLine=“find $paramFirst -print0 |xargs -r0 grep $paramSecond“ eval $cmdLine 但正如我们所知,它是不安全的,到目前为止,我还没有找到一种方法来确保它的安全eva
0赞 stander 11/1/2021
我已经尝试了 stackoverflow.com/a/52538533/17281195 的解决方案,但它在这里不起作用,因为“查找”是在token_quote内部执行的。并且管道字符不能引用。

答:

2赞 Andrej Podzimek 10/31/2021 #1

通过“nameref”将几个数组传递给函数。

fun() {
  local -n first_args="$1"
  local -n second_args="$2"
  local -i idx
  for idx in "${!first_args[@]}"; do
    printf 'first arg %d: %s\n' "$idx" "${first_args[idx]}"
  done
  for idx in "${!second_args[@]}"; do
    printf 'second arg %d: %s\n' "$idx" "${second_args[idx]}"
  done
  echo 'All first args:' "${first_args[@]}"
  echo 'All second args:' "${second_args[@]}"
}

one_arg_pack=(--{a..c}{0..2})
another_arg_pack=('blah blah' /some/path --whatever 'a b c')

fun one_arg_pack another_arg_pack