我做了一個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