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当做命令来执行