eval命令的使用
eval
eval arg1 [arg2] ... [argN]
将表达式中的参数,或者表达式列表,组合起来,并且评估它们.包含在表达式中的任何变量
都将被扩展.结果将会被转化到命令中.这对于从命令行或者脚本中产生代码是很有用的.
写了个脚本测试
#!/bin/bash
y=`eval ls -l`
echo "$y"
echo "--------------------------------------"
for i in ls df
do
value=eval $i
echo $value
done
exit 0
输出
[root@nms probe_test]# ./eval.sh
总计 24
-rwxr-xr-x 1 oracle oinstall 157 04-14 09:29 29.5.sh
-rwxr-xr-x 1 oracle oinstall 108 04-14 12:12 29.6.sh
-rwxr-xr-x 1 oracle oinstall? 93 04-14 12:47 33.sh
-rwxr-xr-x 1 oracle oinstall 139 04-14 14:19 eval.sh
-rwxr-xr-x 1 oracle oinstall? 34 04-14 08:40 restart.sh
-rwxr-xr-x 1 oracle oinstall? 44 04-14 09:06 test.sh
--------------------------------------
29.5.sh? 29.6.sh? 33.sh? eval.sh? restart.sh? test.sh
文件系统?????????????? 1K-块??????? 已用???? 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
????????????????????? 23297916?? 8251172? 13844160? 38% /
/dev/hda1?????????????? 101086???? 10784???? 85083? 12% /boot
tmpfs?????????????????? 257800???????? 0??? 257800?? 0% /dev/shm
/dev/hdb1????????????? 1031800???? 17692??? 961696?? 2% /mnt/ultrapower
?
这里可以看出使用了eval后,eval将会评估"df"和"ls",他们被解释成命令,而不是字符串本身
如果去掉eval又有啥不同呢?
看输出
[root@nms probe_test]# ./eval.sh
总计 24
-rwxr-xr-x 1 oracle oinstall 157 04-14 09:29 29.5.sh
-rwxr-xr-x 1 oracle oinstall 108 04-14 12:12 29.6.sh
-rwxr-xr-x 1 oracle oinstall? 93 04-14 12:47 33.sh
-rwxr-xr-x 1 oracle oinstall 134 04-14 14:21 eval.sh
-rwxr-xr-x 1 oracle oinstall? 34 04-14 08:40 restart.sh
-rwxr-xr-x 1 oracle oinstall? 44 04-14 09:06 test.sh
--------------------------------------
ls
df
第一个去掉eval并无什么不一样,因为使用了``,第二个eval去掉了,就把df和ls当初字符串来解释了。
?
有一个例子
运行脚本的 shell 一般都是非交互的shell. 但脚本仍然可以存取它拥有的终端. 脚本里甚至可
以仿效成可交互的 shell
这个例子不知道在实际写脚本的时候会有什么用,先记录下
#!/bin/bash
my_prompt='$'
while :
do
echo -n "$my_prompt"
read line
eval "$line"
done
exit 0
输出
[root@nms probe_test]# ./33.sh
$ls
29.5.sh? 29.6.sh? 33.sh? eval.sh? restart.sh? test.sh
$ll
./33.sh: line 7: ll: command not found
?
会把读入的line当做命令来执行
?
?