我有一个脚本,它以命令(对于脚本,而不是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个带有空格的参数。如果我在子壳中重复笛卡尔乘积部分,如下所示:
$ ./my_script $(echo "-f 'cmd "{1,2,3}"'")然后它会在每个空格上分开,忽略单引号。
使用ruby一行代码来说明脚本在每种情况下如何接收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。
(如果不是,我将只在脚本中添加笛卡儿产品功能,但我想确保没有一种从外部进行处理的优雅方法。)
发布于 2014-01-27 15:37:32
这就是你需要额外的一步eval
这类似于您的红宝石脚本(没有计数):
f() {
for arg
do
echo "[$arg]"
done
}你就是这样称呼这个的:
eval f "-f 'cmd "{1,2,3}"'"预期产出如下:
[-f]
[cmd 1]
[-f]
[cmd 2]
[-f]
[cmd 3]https://stackoverflow.com/questions/21384793
复制相似问题