2011-08-18 114 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