首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash元编程

Bash元编程
EN

Stack Overflow用户
提问于 2014-01-27 15:28:54
回答 1查看 891关注 0票数 1

我有一个脚本,它以命令(对于脚本,而不是bash)作为参数。

它处理下面的两个调用:

代码语言:javascript
复制
$ ./my_script -f 'cmd1','cmd2','cmd3' #etc
$ ./my_script -f 'cnd1' -f 'cmd2' -f'cmd3' #etc

脚本的常用用例会让它接受同一家族的命令,但使用不同的参数或标志:

代码语言:javascript
复制
$ ./my_script -f 'cmd arg1','cmd arg2','cmd arg3'

我希望能够简洁地将其键入,本质上是{"'cmd "} {arg1,arg2,arg3,...}的笛卡儿积,每一个后面都是“‘”。

我知道bash可以做笛卡尔产品,事实上:

代码语言:javascript
复制
$ echo "-f 'cmd "{arg1,arg2,arg3}"'"

以第二种形式输出我调用的第二部分:

代码语言:javascript
复制
 -f 'cmd arg1' -f 'cmd arg2' -f 'cmd arg3'

但是,如果在调用中像这样使用:

代码语言:javascript
复制
$ ./my_script "-f 'cmd "{1,2,3}"'"

当然,脚本把它看作是3个带有空格的参数。如果我在子壳中重复笛卡尔乘积部分,如下所示:

代码语言:javascript
复制
$ ./my_script $(echo "-f 'cmd "{1,2,3}"'")

然后它会在每个空格上分开,忽略单引号。

使用ruby一行代码来说明脚本在每种情况下如何接收params:

代码语言:javascript
复制
$ 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

(如果不是,我将只在脚本中添加笛卡儿产品功能,但我想确保没有一种从外部进行处理的优雅方法。)

EN

回答 1

Stack Overflow用户

发布于 2014-01-27 15:37:32

这就是你需要额外的一步eval

这类似于您的红宝石脚本(没有计数):

代码语言:javascript
复制
f() {
  for arg
  do
    echo "[$arg]"
  done
}

你就是这样称呼这个的:

代码语言:javascript
复制
eval f "-f 'cmd "{1,2,3}"'"

预期产出如下:

代码语言:javascript
复制
[-f]
[cmd 1]
[-f]
[cmd 2]
[-f]
[cmd 3]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21384793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档