如何正确运行Perl“单行”命令行脚本?
我已经通过一些教程看,但我仍然无法找出我做错了..我想下面的代码(在Perl的特等文件,作为一个可执行文件):如何正确运行Perl“单行”命令行脚本?
#!/usr/bin/perl
perl -e 'print "Hello";'
我运行此脚本,并得到:
/home/user1/Desktop/file_backups.pl的执行中止由于编译错误。
(我是新来使用Perl调用Linux命令行。)
perl
不是一个Perl脚本中一个有效的命令。如果你已经将该文件命名为.sh脚本,并且在shebang行上使用了#!/bin/bash
,那么它就可以工作,但编写一个仅用于调用Perl的bash文件并没有多大意义(为什么不调用Perl直接?)
既然你提到你想要与命令行进行交互,我会在这里提到你可以通过@ARGV
数组获得Perl内的命令行选项。 (见perldoc perlvar)
尝试:
#!/usr/bin/perl
# This is a comment ~~~
# This script will be run as a Perl script
# since 'perl' isn't a keyword or function in Perl
# something like this must fail:
#
# perl -e 'print "Hello";'
#
# The following should work.
print "Hello"; print " World\n";
或者,如果你希望你的shell脚本来执行Perl代码:
#!/bin/sh
# That's a Bash script ~~~
# It's just a command line in a file ...
perl -e 'print "Hello World";'
背景:#!
是interpreter directive。
当命令执行时,它被转换为执行解释器。
你可能会试图做到这一点:
system("/usr/bin/perl -e 'print \"Hello!\\\\n\";'");
感谢您的回复..以及我想要做的是编写perl脚本,与命令行进行交互,我想我已经倒过来了,因为我正在看的是bash/shell脚本来调用perl – Rick 2010-07-10 17:47:47
这只是不好的建议。 OP想要在Perl脚本中打印hello。所以只需使用打印。 – ghostdog74 2010-07-10 17:49:00
@ghostdog:我没有试图提出这个建议,它只是一个直接问题的答案。我试图不去判断。看起来他正在寻找相反的东西,无论如何,所以我们都没有了。 :-) – eruciform 2010-07-10 17:55:14
既然你说你要找的相反,这可能是你的意思:
# vi stdin.pl
# cat stdin.pl
#!/usr/bin/perl
while(<STDIN>)
{
if(/^hello/){ print "Hello back to ya!\n"; }
}
# chmod 0777 stdin.pl
# ./stdin.pl
foo
hello
Hello back to ya!
#
只需键入
perl -e 'print "Hello World\n";'
这只对真的很棒。长一些的脚本需要自己的文件...
假设你有以下输入:
$ for i in a b c ; do echo "$i is $i" > $i; done $ cat a b c a is a b is b c is c
大家都知道大写字母是多更好!
perl -i.bak -pe '$_ = uc' a b c
所以现在
$ cat a b c A IS A B IS B C IS C
但我们真的很想能在这个命令叫upcase
,这是很容易做到!
#! /usr/bin/perl -pi.bak
$_ = uc
在看到它的工作:
$ for i in a b c ; do echo "$i is $i" > $i; done $ cat a b c a is a b is b c is c $ ./upcase a b c $ !cat cat a b c A IS A B IS B C IS C
从answer to a similar question更多提示:
的
-e
选项引入了被执行,其中Perl代码你可能会想,作为一个脚本命令行 - 所以放下它并将代码粘贴到主体中。留在012b在shebang(#!
)行。一般来说,最安全的做法是坚持最多一个“丛”选项。如果你需要更多的东西,你可以在
BEGIN {}
块中扔掉它们的等价物。不要忘记打开执行位!
chmod +x script-name
因为你没有给你想要转换的实际一行代码,我不得不放弃一个广泛的,普遍的答案。如果您编辑问题以使其具体针对您想要执行的操作,我们可以提供更有帮助的答案。
这应该工作。双引号内部单引号;)
perl -e "print 'Hello'"
我很抱歉重振这篇旧文章,但我在哪里可以查看选项的含义? (即你的“-e”)谢谢 – Sosi 2014-10-30 10:49:45
@Sosi“man perl” – 2016-01-15 06:47:38
你的意思是让Perl调用linux(shell)命令行,或者让shell调用Perl? – Ether 2010-07-10 18:06:07