在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
如果变量包含if
,for
或其他语句,请获取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
答案 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/等问题。