如何正确运行Perl“单行”命令行脚本?

我已经看了很多教程,但我仍然无法弄清楚我做错了什么..我想下面的代码(在.pl Perl文件,作为一个可执行文件):

#!/usr/bin/perl perl -e 'print "Hello";' 

我运行这个脚本,并得到:

执行/home/user1/Desktop/file_backups.pl由于编译错误而中止。

(我是使用Perl调用Linux命令行的新手。)

perl在Perl脚本中不是一个有效的命令。 如果你已经把该文件命名为.sh脚本,并且在shebang行上使用了#!/bin/bash ,那么它就可以工作了,但是编写一个bash文件只是为了调用Perl并没有多大意义(为什么不直接调用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";' 

背景: #! 是一个解释指令 。

当命令执行时,它被转换为解释器的执行。

只需在命令行上键入(不是在文件中)

perl -e 'print "Hello World\n";'

这对于在线人员来说只是非常好的。 更长的脚本需要自己的文件…

这应该工作。 双引号内的双引号;)

 perl -e "print 'Hello'" 

你可能试图做到这一点:

 system("/usr/bin/perl -e 'print \"Hello!\\\\n\";'"); 

假设你有以下的输入:

  $ for abc; 做回声“$我是$我”> $我;  DONE

 $猫abc
 a是a
 b是b
 c是c 

大家都知道大写字母好多了!

  perl -i.bak -pe'$ _ = uc'abc 

所以现在

  $猫abc
 A是A.
 B是B.
 C IS C 

但是我们真的想用一个叫upcase的命令来做到这upcase ,这很容易!

 #! /usr/bin/perl -pi.bak $_ = uc 

在工作中看到它:

  $ for abc; 做回声“$我是$我”> $我;  DONE

 $猫abc
 a是a
 b是b
 c是c

 $ ./upcase abc

 $!猫
猫abc
 A是A.
 B是B.
 C IS C 

从类似的问题的答案更多的提示:

-e选项引入了要执行的Perl代码(可能会在命令行中将其视为脚本),请将其删除并将代码粘贴到主体中。 在shebang( #! )行中留下-p

一般来说,最安全的做法就是坚持最好的一组“选择”。 如果你需要更多的东西,你总是可以将它们的等价物放在BEGIN {}块中。

不要忘记打开执行位!

 chmod +x script-name 

因为你没有给出你想要转换的实际的一行,所以我不得不给出一个广泛的,一般的答案。 如果你编辑你的问题,使其具体到你想要做的,我们可以给更多有用的答案。

既然你说你正在寻找相反的,这可能是你的意思:

 # 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! #