我正在尝试使用Bash和Perl的组合修改一些脚本。麻烦的是,Perl认为$index
是它自己的变量,从未定义过:
for index in {1..25}; do
perl -pi -e 's/\d+/$index/' cmd_$index.sh;
done
有没有办法让$index
在Perl单行内穿Bash斗篷?
答案 0 :(得分:19)
挤压export index;
循环中的do
。请参阅Perl程序正文中的$ENV{index}
。
或者:使用双引号"… $index … "
将shell变量插入到构成Perl程序主体的表达式中。如果你想扩展这个单行,请注意正确地转义Perl表达式,例如变量名上的$
,也许还有反斜杠,以便由Perl解释,而不是shell。
答案 1 :(得分:7)
使用"
代替'
。然后bash可以在perl看到它之前替换变量。
答案 2 :(得分:3)
使用双引号而不是单引号,并且在将-e字符串传递给Perl之前将插入$ index。
答案 3 :(得分:2)
这是一个有效的例子(虽然不是你的问题 - 对不起!):
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}
}
答案 4 :(得分:1)
我想这里的问题是bash shell globs不支持范围。出于某种原因,我认为他们做到了。无论如何,perl支持范围就好了:
perl -pi -e '
BEGIN { @ARGV = map "cmd_$_.sh", 1 .. 25; }
my ($index) = $ARGV =~ /(\d+)/;
s/\d+/$index/'
有点笨拙,但无论如何都是一种语言。