我已经看了很多教程,但我仍然无法弄清楚我做错了什么..我想下面的代码(在.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! #