正确引用以将 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
我正在尝试生成一些虚拟进程。每个 /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