我想连续执行两个或更多命令。但是这些命令存储在我的脚本中的变量中。例如,
var="/usr/bin/ls ; pwd ; pooladm -d; pooladm -e"
当我通过我的脚本执行此变量时出现问题。 假设我去了:
#!/bin/ksh -p
..
..
var="/usr/bin/ls ; pwd;pooladm -d; pooladm -e"
..
..
$var # DOES NOT WORK ..BUT WORKS WITH EVAL
它不起作用.. 但是我使用eval的那一刻:
eval $var
它的工作非常出色。
我只是想知道是否有其他方法可以在不使用eval的情况下执行存储在变量中的一堆命令。
同样,eval使用是否被认为是一种糟糕的编程习惯,因为我的编码标准似乎避免使用它而不是接受它。请告诉我。
答案 0 :(得分:2)
请记住,shell只解析一次该行。因此,当您扩展$ var时,它将成为包含空格的一个字符串。由于您没有名为'/ usr / bin / ls的可执行文件; pwd; pooladm -d; pooladm -e',它无法运行它。
另一方面,eval将其参数重新扫描它们,现在你得到'/ usr / bin / ls','pwd'等等。它有效。
eval
是一个小小的问题因为它留下了一个可能的安全漏洞 - 考虑是否有人设法将'rm -rf /'放入字符串中。但它是一个有用的工具。
答案 1 :(得分:1)
使用反引号和回声。在你的情况下
`echo $var`
答案 2 :(得分:1)
您可以调用shell的另一个副本来运行命令:
sh -c "$var"
这不一定比使用eval更好。主要的实际区别是eval将在当前shell的上下文中运行命令,而“sh -c”在单独的shell实例中运行命令。如果var
包含设置环境变量或更改当前目录的命令,则您或可能不希望这些命令影响当前shell。