我有一個腳本將命令(對於腳本而不是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
。 (如果不是,我只是將笛卡爾產品功能添加到腳本中,但我覺得確保沒有從外部完成的優雅方式。)
對於bash land中的quasiquoting,'printf'%q「'是必讀的聯機幫助頁 – sehe