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

Yanbin_Q 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
...全文
287 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
nswcfd 2015-08-26
  • 打赏
  • 举报
回复
学习了,把 “函数调用(内部包含传参过程)”分解成“参数设置+eval 执行命令”两个子过程。 PS#1,stack overflow上好像在让楼主该一下问题描述,加上为什么不使用函数的原因,以避免被标记为duplicate。 PS#2,()是个必要元素吗?
Yanbin_Q 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) 不知是不是你想要的

19,619

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧