bash 中的 perl:如何对保存在字符串中的脚本调用 perl
perl inside bash: How to call perl on a script saved in a string
我需要对不同的文件多次执行同一个 perl 脚本。
为了简化这个过程,我尝试将 perl 脚本保存为 bash 字符串,
并通过字符串调用 perl,如以下代码的 "doesn't work" 部分所示:
#!/bin/sh
# works
perl -e 'print 1;'
# doesn't work
S="'print 1;'"
perl -e $S
perl -e $S
我得到以下输出:
1Can't find string terminator "'" anywhere before EOF at -e line 1.
Can't find string terminator "'" anywhere before EOF at -e line 1.
我在这里做错了什么?我可以通过其他方式达到同样的效果吗?
您的字符串中的引号太多 $S
:
#!/bin/sh
# works
perl -e 'print 1;'
# also works
S='print 1;'
perl -e "$S"
我还在 "$S"
周围添加了一些双引号,以防止出现分词问题。
另一种选择是使用 -x
切换到 Perl:
#!/bin/sh
perl -x "[=11=]"
echo <<EOF >/dev/null
#!/usr/bin/env perl
my $a=5;
print "$a\n";
__END__
EOF
echo 'something else'
[=15=]
是当前脚本的名称,因此 Perl 查找以 #!
开始并包含 perl
的第一行,并将 __END__
之前的所有内容解释为一个 Perl 脚本。 echo >/dev/null
防止 Perl 脚本被 shell.
解释
我需要对不同的文件多次执行同一个 perl 脚本。
为了简化这个过程,我尝试将 perl 脚本保存为 bash 字符串, 并通过字符串调用 perl,如以下代码的 "doesn't work" 部分所示:
#!/bin/sh
# works
perl -e 'print 1;'
# doesn't work
S="'print 1;'"
perl -e $S
perl -e $S
我得到以下输出:
1Can't find string terminator "'" anywhere before EOF at -e line 1.
Can't find string terminator "'" anywhere before EOF at -e line 1.
我在这里做错了什么?我可以通过其他方式达到同样的效果吗?
您的字符串中的引号太多 $S
:
#!/bin/sh
# works
perl -e 'print 1;'
# also works
S='print 1;'
perl -e "$S"
我还在 "$S"
周围添加了一些双引号,以防止出现分词问题。
另一种选择是使用 -x
切换到 Perl:
#!/bin/sh
perl -x "[=11=]"
echo <<EOF >/dev/null
#!/usr/bin/env perl
my $a=5;
print "$a\n";
__END__
EOF
echo 'something else'
[=15=]
是当前脚本的名称,因此 Perl 查找以 #!
开始并包含 perl
的第一行,并将 __END__
之前的所有内容解释为一个 Perl 脚本。 echo >/dev/null
防止 Perl 脚本被 shell.