我正在尝试使用Bash和Perl的组合来修改一些脚本。问题是Perl认为$index
是它自己的变量,但该变量从未定义:
for index in {1..25}; do
perl -pi -e 's/\d+/$index/' cmd_$index.sh;
done
有没有办法让$index
在Perl one-liner中穿上它的Bash外衣?在do
循环中添加一个export index;
。在Perl程序体中引用$ENV{index}
。
或者:使用双引号"… $index … "
将shell变量插值到组成Perl程序体的表达式中。如果您想扩展此一行程序,请注意正确转义Perl表达式,例如对于变量名称上的$
和反斜杠,以便由Perl而不是shell解释。
使用"
代替'
。这样,bash就可以在perl看到变量之前替换它。
使用双引号而不是单引号,$index将在将-e字符串传递给Perl之前插入插值。
generatep() {
perl -e '
$_stem=$ARGV[0];
$_ctx=$ARGV[1];
$_role=$ARGV[2];
$i=$ARGV[3];
$ct=$i + $ARGV[4];
while ($i < $ct) {
print "user=$_stem$i,$_ctx,$_role\n";
$i++;
}
' ${stem} ${ctx} ${role} ${startix} ${count}
}
-pi
处理吗? - Donal Fellows我猜问题在于 Bash shell 的通配符不支持范围,出于某种原因,我曾经认为它们支持。无论如何,Perl 完全支持范围:
perl -pi -e '
BEGIN { @ARGV = map "cmd_$_.sh", 1 .. 25; }
my ($index) = $ARGV =~ /(\d+)/;
s/\d+/$index/'
有点笨拙,但毕竟都是同一种语言。
BEGIN
块可以嵌在爱斯基摩亲吻中间吗 :) ? : $ perl -e '... } BEGIN { ...'
- Zaid
$index_
在 Perl 和 bash 中都是有效的符号名称。也许您想为s///
运算符使用不同的分隔符? - mob