如何使用参数从变量执行bash命令

时间:2015-08-10 16:55:05

标签: linux bash

在Linux Bash中,我们可以使用()从变量执行简单命令,并获取参数。例如:

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

但是如果我们引入其他控制声明,如

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

如果变量包含iffor或其他语句,请获取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

2 个答案:

答案 0 :(得分:4)

将整个命令行存储在变量中并不安全,并且会有很多问题。

改为使用功能:

greet() { if [ 1 == 1 ]; then echo hello $1; fi; }

然后将其称为:

greet world

将输出:

hello world

更新:(根据以下评论)

对于eval的已知风险,您可以执行以下操作:

greet='if [ 1 == 1 ]; then echo hello $1; fi'
(set -- word && eval "$greet")

这将输出:

hello word

答案 1 :(得分:1)

if不是命令,而是关键字。除非使用eval,否则不能将其存储在字符串变量中。这是因为关键字解析在变量扩展之前发生。

但是,您仍然可以解决http://jsfiddle.net/cxpq0cjy/1/等问题。