Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2043643
  • 博文数量: 470
  • 博客积分: 10206
  • 博客等级: 上将
  • 技术积分: 5620
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-03 12:50
文章分类

全部博文(470)

文章存档

2012年(1)

2011年(18)

2010年(47)

2009年(404)

分类:

2009-04-20 17:34:54

14.10.2  eval命令和命令行解析

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)和这条消息。

阅读(921) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~