全部博文(470)
分类:
2009-04-20 17:34:54
eval命令处理命令行,先执行所有的shell替换,然后执行命令行。当通常的命令行解析无法满足要求时,就要使用eval命令。
范例14-76
1 $ set a b c d
2 $ echo The last argument is \$$#
3 The last argument is $4
4 $ eval echo The last argument is \$$#
The last argument is d
5 $ set -x
$ eval echo The last argument is \$$#
+ eval echo the last argument is '$4'
++ echo the last argument is d
The last argument is d
说明
1. 设置4个位置参量。
2. 用户希望得到的结果是显示最后一个位置参量的值。\$打印出一个美元符。$#的值是4,即位置参量的个数。shell求出$#的值后,不会再次解析命令行以得出$4的值。
3. 显示的结果是$4,而不是最后那个参数。
4. shell执行完所有的变量替换后,eval命令又执行一次变量替换,然后执行echo命令。
5. 打开反显选项来观察解析的顺序。
范例14-77
(来自Shutdown程序)
1 eval `/usr/bin/id | /usr/bin/sed 's/[^a-z0-9=].*//'`
2 if [ "${uid:=0}" -ne 0 ]
then
3 echo $0: Only root can run $0
exit 2
fi
说明
1. 这个范例难度较高。id程序的输出送给sed,以提取出字符串中uid部分。id的输出结果是:
id=9496(ellie) gid=40 groups=40
uid=0(root) gid=1(daemon) groups=1(daemon)
sed命令中正则表达式的含义是:从字符串首开始,找出任何一个不是字母、数字或等号的字符,删除该字符和它后面的所有字符。结果是将第一个左圆括号到行尾的所有内容替换为空。这样处理后所剩的内容是uid=9496和uid=0。
eval完成对命令行的转换后,将执行所得的命令:uid=9496或 uid=0。
例如,如果用户的ID是root,eval执行的命令将是uid=0。这条命令将在脚本中创建一个名为uid的局部变量,并将它赋值为0。
2. 测试变量uid的值是不为0,则使用命令修饰符。
3. 如果uid的值不为0,则echo命令显示脚本名($0)和这条消息。