1

我有一個腳本將命令(對於腳本而不是bash)作爲參數。Bash元編程

它把下同兩個調用:

$ ./my_script -f 'cmd1','cmd2','cmd3' #etc 
$ ./my_script -f 'cnd1' -f 'cmd2' -f'cmd3' #etc 

一個頻繁使用的情況下的腳本將有它採取同一家族的命令,但使用不同的參數或標誌:

$ ./my_script -f 'cmd arg1','cmd arg2','cmd arg3' 

我希望能夠簡潔地輸入它,實際上是作爲{"'cmd "}{arg1,arg2,arg3,...}的笛卡爾積,其中每個都跟着「'」'

我知道Bash可以做笛卡爾乘積,而事實上:

$ echo "-f 'cmd "{arg1,arg2,arg3}"'" 

我調用的第二形式的第二部分輸出:

-f 'cmd arg1' -f 'cmd arg2' -f 'cmd arg3' 

但是,如果在這樣的調用中使用:

$ ./my_script "-f 'cmd "{1,2,3}"'" 

腳本當然將它看作是3個帶有空格的參數。如果我贊同笛卡兒積部分在子shell如下:

$ ./my_script $(echo "-f 'cmd "{1,2,3}"'") 

然後它會分裂每個空間,忽視了單引號。

使用紅寶石的一行來說明腳本如何接收在每種情況下PARAMS:

$ ruby -e 'puts ARGV.each_with_index.map {|a,i| (i+1).to_s+" : "+a}' -- "-f 'cmd "{1,2,3}"'" 
1 : -f 'cmd 1' 
2 : -f 'cmd 2' 
3 : -f 'cmd 3' 

$ ruby -e 'puts ARGV.each_with_index.map {|a,i| (i+1).to_s+" : "+a}' -- $(echo "-f 'cmd "{1,2,3}"'")                                
1 : -f 
2 : 'cmd 
3 : 1' 
4 : -f 
5 : 'cmd 
6 : 2' 
7 : -f 
8 : 'cmd 
9 : 3' 

所以我的問題是,我可以得到的bash評估echo命令的輸出就好像它是由用戶鍵入? (工藝引號和一切?)

更新

我應該提到的是,腳本需要能有空格他們的其他參數,可以所以其實我一直在尋找某種部分 ,本地化eval(如果有這樣的事情),否則我不得不逃脫其他引號讓他們通過eval。 (如果不是,我只是將笛卡爾產品功能添加到腳本中,但我覺得確保沒有從外部完成的優雅方式。)

+3

對於bash land中的quasiquoting,'printf'%q「'是必讀的聯機幫助頁 – sehe

回答

3

這就是你需要的eval額外的步驟:

這類似於你的Ruby腳本(不帶票):

f() { 
    for arg 
    do 
    echo "[$arg]" 
    done 
} 

這就是你再怎麼罵這個:

eval f "-f 'cmd "{1,2,3}"'" 

輸出是預期的:

[-f] 
[cmd 1] 
[-f] 
[cmd 2] 
[-f] 
[cmd 3]