2011-08-18 84 views
2

我做了一个perl脚本,它使用Getopt :: Long来解析命令行参数。但是,我有一个可以接受字符串(带空格)的参数。我怎样才能把整个字符串变成一个变量。例如:Getopt ::长得到一个空格到一个变量字符串

./script.pl --string=blah blah blah blah yup --another-opt 

我需要“等等等等等等”变量$字符串。我知道Getopt :: Long支持一个参数的多个输入,当你知道你会有多少(我不知道)。这可能吗?

回答

7

你需要要么把周围参数报价:

./script.pl --string="blah blah blah blah yup" --another-opt 

或逃避的空间:

./script.pl --string=blah\ blah\ blah\ blah\ yup --another-opt 
+7

换句话说:

这是下的“选项有多个值”的文档的部分解释相当不错这是一个shell的问题,而不是一个getopt的问题。 – DarkDust

+1

你也可以在整个事情中加上引号:''--string = blah等等等等等等''。 – cjm

+0

所以引号不会混淆我的脚本? – n0pe

7

这实在是对欧内斯特的回答MaxMackie的问题的答复,但它太长时间,所以在这里:

你的脚本从来没有看到引号,只有传递参数的shell。当你调用一个脚本(或程序)时,较低级别发生的事情是该命令在数组中使用多个参数调用。 shell通常会根据空白分隔参数。你的程序将看到现在的问题是:

[0]./script.pl 
[1]--string=blah 
[2]blah 
[3]blah 
[4]blah 
[5]yup 
[6]--another-opt 

把引号括起来的周围或逃避它会导致在此:

[0]./script.pl 
[1]--string=blah blah blah blah yup 
[2]--another-opt 

壳(bash的特别,别人我敢肯定)允许散布报价没有空间就像你喜欢的那样。 ls -"l""h"ls -lh相同,因此您需要做"--string=blah blah"--string="blah blah"。使用getopt解析各个参数,可以让您将它们按顺序排列并使用--long-name-l发生在将所有内容都转换为数组项并传递给程序后。外壳与此无关。

+0

很好的解释,谢谢! – n0pe

0

现在谜语我这个......在下列情况下,我想通过生成,然后被传递到Perl脚本,这样一个shell命令引用命令行参数:

script.pl `echo --string \"blah blah yup\"` 

麻烦是,GetOptions ("string=s" => \$string)套字符串的值到

"blah 

包含初始双引号字符,并在所述第一空白断裂。本身echo命令用引号的字符串看起来桃色的输出参数:

--string "blah blah yup" 

,如果我叫script.pl --string "blah blah yup"没有回音,包含字符串空白的Perl脚本被设定为预期。

我想,也许反引号是问题,但同样的结果接踵而至这些变种:

script.pl $(echo --string \"blah blah yup\") 
script.pl $(echo "--string \"blah blah yup\"") 
script.pl $(echo --string \"blah\ blah\ yup\") 
script.pl $(echo '--string \"blah blah yup\"') 

虽然是最后一个例子导致字符串= \"blah(包含初始反斜杠双引号字符)。

似乎从shell命令的STDOUT返回的输出不会像Perl的参数解析机器那样通过键入命令行的字符串进行处理。字符串可替换性明显缺乏有些令人惊讶,但可能是由于bash的某些方面,我不明白。 (顺便说一下,我在Darwin的Perl 5.24和Linux上的5.16上测试过)

1

虽然我当然同意你应该逃避论点,如果像我一样,你有不容易控制输入那么实际上可以使用Getopt :: Long来做到这一点。

实施例:[https://www.jdoodle.com/a/oHG]

use strict; 
use Getopt::Long qw(GetOptions); 


my @spaces_string; 

GetOptions('test=s{1,}' => \@spaces_string); 
printf "String is: '%s'\n" ,join " ",@spaces_string; 

您要定义的选择,因为其具有1点或更多的值,将其分配给一个数组,然后加入回成一个字符串。 http://perldoc.perl.org/Getopt/Long.html#Options-with-multiple-values