我做了一个perl脚本,它使用Getopt :: Long来解析命令行参数。但是,我有一个可以接受字符串(带空格)的参数。我怎样才能把整个字符串变成一个变量。例如:Getopt ::长得到一个空格到一个变量字符串
./script.pl --string=blah blah blah blah yup --another-opt
我需要“等等等等等等”变量$字符串。我知道Getopt :: Long支持一个参数的多个输入,当你知道你会有多少(我不知道)。这可能吗?
我做了一个perl脚本,它使用Getopt :: Long来解析命令行参数。但是,我有一个可以接受字符串(带空格)的参数。我怎样才能把整个字符串变成一个变量。例如:Getopt ::长得到一个空格到一个变量字符串
./script.pl --string=blah blah blah blah yup --another-opt
我需要“等等等等等等”变量$字符串。我知道Getopt :: Long支持一个参数的多个输入,当你知道你会有多少(我不知道)。这可能吗?
你需要要么把周围参数报价:
./script.pl --string="blah blah blah blah yup" --another-opt
或逃避的空间:
./script.pl --string=blah\ blah\ blah\ blah\ yup --another-opt
这实在是对欧内斯特的回答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
发生在将所有内容都转换为数组项并传递给程序后。外壳与此无关。
很好的解释,谢谢! – n0pe
现在谜语我这个......在下列情况下,我想通过生成,然后被传递到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上测试过)
虽然我当然同意你应该逃避论点,如果像我一样,你有不容易控制输入那么实际上可以使用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
换句话说:
这是下的“选项有多个值”的文档的部分解释相当不错这是一个shell的问题,而不是一个getopt的问题。 – DarkDust
你也可以在整个事情中加上引号:''--string = blah等等等等等等''。 – cjm
所以引号不会混淆我的脚本? – n0pe