我有一些压缩文件(.gz格式),我想自动化这个过程。这就是我所拥有的:
!# /usr/bin/perl -w
use strict;
my $input1 = $ARGV[0];
my $unzip_command = 'gzip -d $input1';
system $unzip_command;
我收到一个错误,要求使用-f强制解压缩(尝试过,只是挂起)。你能发现我的语法错误吗?
答案 0 :(得分:2)
如果希望插值变量,请使用双引号。
my $unzip_command = "gzip -d $input1";
否则你将执行命令&#; gzip -d $ input1'而不是' gzip -d myfile.gz'。
在这种情况下,系统将命令传递给shell,它将$ input1解释为shell变量。当然那不存在。
答案 1 :(得分:2)
正如this answer中所述,您必须使用双引号来$input1
进行插值(展开)。
您的脚本容易受到代码注入。考虑这种情况(假设您的脚本名称为decompress.pl
):
$ ./decompress.pl "foo.gz; rm -rf /"
这将最终执行
gzip -d foo.gz; rm -rf /
请阅读有关可以调用的两种模式system
:要么带有字符串(然后由shell解释),要么带有参数数组(绕过shell及其解释)。
最好在这里使用数组模式:
#!/usr/bin/perl
use strict;
use warnings;
my $input1 = $ARGV[0];
my @unzip_command = ('gzip', '-d', $input1);
system( @unzip_command );
(顺便说一下:你的生物线上有一个拼写错误。它不是!#/usr/bin/perl
而是#!…
。请粘贴你的代码而不是重新输入代码来避免输入错误。)