正确引用以将 shell 变量传递给 perl

Correct quoting to pass a shell variable to perl

我正在尝试生成一些虚拟进程。每个 /path/to 都相同,但我似乎无法打印 DAEMON 名称。使用以下代码的结果是 2 个名为 /path/to/ 的进程。我怎样才能达到 /path/to/test1D/path/to/test2D

declare -a DAEMONS=('test1D' 'test2D')

for i in "${DAEMONS[@]}"
do
    perl -e '[=11=]="/path/to/'$i'"; sleep infinity' &
done

这应该可以满足您的要求:

perl -e "$0='/path/to/$i'; sleep infinity" &

通过使用双引号作为引号,您可以指定应由 Perl 计算的字符串,但保留使用 shell 变量的能力:

因为以 $ 开头的所有内容现在都将被视为 shell 变量,因此 shell 将尝试解析 [=13=]。但是您希望它在 Perl 中以 [=13=] 结束,因此您需要转义 $ 符号。这就是为什么您会在此处看到 $0

我们保持 $i 不变,因此 shell 将用 i 的值替换它。

所以假设 i 的值为 test1D,Perl 现在将收到:

[=11=]='/path/to/test1D'; sleep infinity

更安全的替代方法是通过环境传递数据,而不是代入代码:

declare -a DAEMONS=('test1D' 'test2D')

for i in "${DAEMONS[@]}"
do
    daemon="$i" perl -e '[=10=]="/path/to/" + $ENV{daemon}; sleep infinity' &
done

只是想让你知道,你不需要像这样的数组:

daemons="test1D test2D"

for deamon in $daemons
do
    perl -e '[=10=]="/path/to/'$daemon'"; sleep infinity' &
done

或者,甚至更好:

set test1D test2D
for daemon in $*
do
    perl -e '[=11=]="/path/to/'$daemon'"; sleep infinity' &
done