怎么在通过变量来执行命令,并接受参数

YanbinQiu Senior Developer  2015-08-11 12:58:51
在 Linux Bash 中,我们可以用圆括号 () 括住变量来执行简单命令,并传入参数,例如:


bash-3.2$ greet="echo hello $1"
bash-3.2$ ($greet world)
hello world


但是,如果引入了像 if, for 那样的控制结构的话,传入参数就不行了,像


bash-3.2$ greet="if [ 1 == 1 ]; then echo hello $1; fi"
bash-3.2$ ($greet world)
bash: if: command not found


得到的错误是 bash: if: command not found

虽然对于上面我们可以使用 eval 命令, 但是无法传入参数


bash-3.2$ eval $greet
hello
bash-3.2$ eval $greet world
bash: syntax error near unexpected token `world'


请问如何执行上面的 greet 变量中的指令,并且能传入参数? 期望的效果是:


bash-3.2$ greet="if [ 1 == 1 ]; then echo hello $1; fi"
bash-3.2$ ($greet world)
bash-3.2$ hello world
...全文
149 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
nswcfd 2015-08-26
学习了,把 “函数调用(内部包含传参过程)”分解成“参数设置+eval 执行命令”两个子过程。 PS#1,stack overflow上好像在让楼主该一下问题描述,加上为什么不使用函数的原因,以避免被标记为duplicate。 PS#2,()是个必要元素吗?
回复
YanbinQiu 2015-08-12
不能用函数,只能用变量,然后执行变量中的脚本内容,并传入参数 在 Stackoverflow 同问了一下,http://stackoverflow.com/questions/31925118/how-to-execute-a-bash-command-from-variable-with-argument 我标记了这是我想要的 greet='if [ 1 == 1 ]; then echo hello $1; fi' (set -- word && eval "$greet") This will output: hello word
回复
奔跑的路 2015-08-11
函数确实是比较好的选择
回复
nswcfd 2015-08-11
()的本义是在子shell里执行命令。 这个问题跟用不用()关系不大,第二个例子(greet="if ...")不用()同样不可以。 这是因为shell在做完parameter expansion之后,不会重新解释里面的控制结构。 楼主的需求,正如其他人所言,还是用函数来完成吧。 本来“参数”就是在函数或者脚本上下文才有意义的一个概念。 除非哪天shell也支持匿名函数或lamda算子类之类的概念,楼主想要的东西才有可能?
回复
cater_ndsc 2015-08-11
把你的脚本语句,定义成函数,函数名赋给变量,如: function func(){ #任何语句 } var=func $var params #($var parama) 不知是不是你想要的
回复
发动态
发帖子
系统维护与使用区
创建于2007-08-27

1.9w+

社区成员

系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
申请成为版主
社区公告
暂无公告