我正在使用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
… 展开为相应的参数。您可以使用$@
(或者$*
如果您知道自己在做什么)来获取所有参数。您可以使用$#
来获取参数的数量。这与fun
shell 脚本的情况非常相似。
$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
,只有不便。不要用这种方式使你的代码复杂化。
还有一件事:双引号变量。