您可以使用 bash -c 向 bash 函数传递多个参数吗?

您可以使用 bash -c 向 bash 函数传递多个参数吗?

我正在使用bash -c命令和函数:

fun ()
{
echo "$0"  ## it reads the parameter $i
}

for i in {1..5}
do
bash -c "fun" $i &
done

我的问题是,我们可以使用 ? 将多个参数传递给函数吗bash -c?例如:

fun ()
{
echo "$0"  ## it reads the parameter $i
}

var="string"  #variable

for i in {1..5}
do
bash -c "fun" $i $var &
done

答案1

您实际运行过代码吗?两个代码片段都返回了结果fun: command not found,这是您需要首先解决的问题。

除非你设法将其导出fun为函数,或者定义它别处以允许内部bash识别命令的方式(我不会详细说明)。这种情况会非常具有误导性,因此在进一步的问题背景下是不幸的。

让我们从简单的代码开始,它可以完成你可能想要做的事情:

#!/bin/bash

fun ()
{
   echo "$1"
}

for i in {1..5}
do
   fun "$i" &
done

如果您得到的数字不按顺序排列,那是因为&。我&在这里使用它,因为它在您的原始代码中。

您对函数的定义在语法上没有问题。我的定义使用$1而不是$0,我们会讲到它。要使用函数,只需调用其名称,带或不带参数即可。在我们的例子中:

fun
fun arg1
fun arg1 arg2

在函数内部$1,,$2… 展开为相应的参数。您可以使用$@(或者$*如果您知道自己在做什么)来获取所有参数。您可以使用$#来获取参数的数量。这与funshell 脚本的情况非常相似。

$0函数内部是$0主 shell 的。它与传递给函数的参数无关。

您可以在子 shell 中运行该函数:

( fun arg1 )

或者在后台运行(这也隐式地在子 shell 中运行它):

fun arg1 &

如果fun是主 shell 中的一个函数,那么这些子 shell 也会知道当命令是时该做什么fun。另一方面,以 启动的 shellbash -c不知道fun

再说一遍:除非你设法export……或者……

在你的情况下,bash -c这反而是一个障碍。我认为没有必要使用它。让它工作是可能的,但会很麻烦。不过,你的明确的问题是:

我们可以通过使用向函数传递多个参数bash -c吗?

我们可以。下面是繁琐的示例。请注意,函数略有不同(出于教育原因)。我也放弃了,&因为它只会混淆结果。

#!/bin/bash

fun ()
{
   echo "$2"
}

export -f fun
var="string"

for i in {1..5}
do
   bash -c 'fun "$2" "$1"' inner-bash "$i" "$var"
done

将函数从 Bash 导出到 Bash 是可能的,我们刚刚就做到了。将函数从 Bash 导出到另一个 shell 是不可能的,除非 shell 试图兼容并故意将某些环境变量解释为函数。

fun "$2" "$1"是单引号,因此在主 shell 中"$2",并且"$1"不会展开(是单引号,他们是不是双引号)。在内部上下文中,bash这些$2$1被双引号引起来,并且它们扩展为之后提供的参数inner-bash(此处是任意名称)。

看看存储为的数字会发生什么情况$i

  • 它处于$i主 shell 的上下文中;
  • 那么它就$1在内壳的上下文中;
  • 那么它就位于$2内壳函数的上下文中。

在这里使用没有任何好处bash -c,只有不便。不要用这种方式使你的代码复杂化。

还有一件事:双引号变量

相关内容