`

eval学习与应用

 
阅读更多
eval的作用是再次执行命令行处理,也就是说,对一个命令行,执行两次命令行处理。这个命令要用好,就要费一定的功夫。我举两个例子,抛砖引玉。

1、例子1:用eval技巧实现shell的控制结构for

用eval技巧实现shell的控制结构for。



[root@home root]# cat myscript1
#!/bin/sh
evalit(){
       if [ $cnt = 1 ];then
               eval $@
               return
       else
               let cnt=cnt-1
               evalit $@
       fi
       eval $@
}
cnt=$1
echo $cnt | egrep "^[1-9][0-9]*$" >/dev/null
if [ $? -eq 0 ]; then
       shift
       evalit $@
else
       echo 'ERROR!!! Check your input!'
fi
[root@home root]# ./myscript1 3 hostname
home
home
home
[root@home root]# ./myscript1 5 id |cut -f1 -d' '
uid=0(root)
uid=0(root)
uid=0(root)
uid=0(root)
uid=0(root)

注意:bash里有两个很特殊的变量,它们保存了参数列表。


$*,保存了以$IFS指定的分割符所分割的字符串组。
$@,原样保存了参数列表,也就是"$1""$2"...

这里我使用了函数递归以及eval实现了for结构。
当执行eval $@时,它经历了步骤如下:
第1步,分割成eval $@
第6步,扩展$@为hostname
第11步,找到内置命令eval
重复一次命令行处理,第11步,找到hostname命令,执行。

注意:也许有人想当然地认为,何必用eval呢?直接$@来执行命令就可以了嘛。

例子2:一个典型错误的例子

错误!这里给个典型的例子大家看看。



[root@home root]# a="id | cut -f1 -d''"
[root@home root]# $a
id:无效选项 -- f
请尝试执行‘id --help’来获取更多信息。
[root@home root]# eval $a
uid=0(root)

如果命令行复杂的话(包括管道或者其他字符),直接执行$a字符串的内容就会出错。分析如下。
$a的处理位于第6步──参数扩展,也就是说,跳过了管道分析,于是"|", "cut", "-f1","-d"都变成了id命令的参数,当然就出错啦。
但使用了eval,它把第一遍命令行处理所得的"id", "|", "cut", "-f1","-d"这些字符串再次进行命令行处理,这次就能正确分析其中的管道了。


总而言之:要保证你的命令或脚本设计能正确通过命令行处理,跳过任意一步,都可能造成意料外的错误!

例子3:设置系统的ls色彩显示



eval $(dircolors -b/etc/dircolors)

eval语句通知shell接受eval参数,并再次通过命令行处理的所有步骤运行它们。
它使你可以编写脚本随意创建命令字符串,然后把它们传递给shell执行;
$()是命令替换,返回命令的输出字符串。
其中dircolors命令根据/etc/dircolors配置文件生成设置环境变量LS_COLORS的bash代码,内容如下
[root@localhost root]# dircolors -b> tmp
[root@localhost root]# cat tmp
LS_COLORS='no=00:fi=00:di=01;34:ln=01; ......
export LS_COLORS
#这里我没有指定配置文件,所以dircolors按预置数据库生成代码。
其输出被eval命令传递给shell执行。

eval是对Bash Shell命令行处理规则的灵活应用,进而构造"智能"命令实现复杂的功能。
上面提及的命令是eval其中一个很普通的应用,它重复了1次命令行参数传递过程,纯粹地执行命令的命令。
其实它是bash的难点,是高级bash程序员的必修之技。

例子3:环境变量的使用


#!/bin/ksh
DB_NAME=EDADB
FILE_INCOMING_DIR=$(eval echo $`echo ${DB_NAME}_EVM_INCOMING_DIR`)
echo "${FILE_INCOMING_DIR}"


测试结果:



./test.sh
/headend/EDADB/evm/incoming
分享到:
评论

相关推荐

    js中eval()函数和trim()去掉字符串左右空格应用

    对于js中eval()函数的理解和写一个函数trim()去掉字符串左右空格;对于js中eval()函数的理解是本人心得不一定正确,感兴趣的朋友参考下,或许对你学习eval()函数有所帮助

    轻松入门开发ARM程序.pdf

    本手册以 IAR 公司的EWARM 开发环境和ST 公司的STR710-EVAL 评估板为基础,介绍如何编写STR710(ARM7 内核)的C 语言应用程序。手册的前半部分介绍IAR Systems 公司的ARM 开发环境EWARM 的使用方法,后半部分介绍...

    SpringBoot使用MQTT详解含完整代码

    随着物联网(IoT)技术的快速发展,消息队列遥测传输(MQTT)协议已成为实现设备间轻量...通过本文的学习,读者将能够掌握在Spring Boot框架下使用MQTT进行设备间通信的核心技术,为构建智能物联网应用打下坚实的基础。

    NK1-COVID-Eval

    学习Laravel Laravel拥有所有现代Web应用程序框架中最广泛,最全面的和视频教程库,因此轻而易举地开始使用该框架。 如果您不想读书,可以使用Laracasts提供帮助。 Laracasts包含1500多个视频教程,涉及各种主题,...

    。NET经典技术

    程序的学习是一个循序渐进的过程,一些常用的或经典代码应该保存下来以便日后使用。本文就给出一些.net的经典代码,希望对大家有所帮助……  1.弹出对话框.点击转向指定页面  Response.Write("");  Response....

    本人的练习集跟大家分享一下-总的matlab_study.rar

    打开文件并应用,edit、text,button,axes以及eval命令的使用(文件为Engine_Trq_fileopen) GUI调用GUI(文件为GUI_open_GUI) 一个用纯粹的matlab语言编写的GUI(文件为Practice_matGUI) 图线上的右键菜单...

    一小时 Python 入门

    Python 是一个简洁易读的语言,学习者几乎可以立刻上手,也适用于大量的商 业应用上。目前已超越 C/C++、 Java,成为各大学课程中的主流入门程序语言, 美国 Top 10 Computer Science (计算机科学) 系所中便有 8 所...

    tcl快速入门.pdf

    谁应该学习本教程? 4 Tcl/Tk 基础知识 4 Tcl/Tk 的起源 4 工具和文件 5 Tcl 语言 6 Tcl tick 的构成 6 Tcl 元字符 7 Tcl 全局变量和反斜杠替代 9 Tcl 运算符和数学函数 12 Tcl 中的循环和分支 14 Tcl 字符串和模式...

    es6新特性 学习word版2018最新

    它的目标是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 ECMAScript 和 JavaScript 的关系:前者是后者的语法规格,后者是前者的一种实现 Babel:将ES6代码转为ES5代码 ...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    eval以及时间操作 JavaScript作用域 JavaScript面向对象及原型 Dom选择器以及内容文本操作 Dom样式操作 Dom属性及创建标签 Dom提交表单及其他 Dom事件操作 Dom事件操作补充 Dom绑定时间的另外一种方式 JavaScript ...

    Finding_Donors:根据人口普查数据识别某人捐赠可能性的应用程序

    Finding_Donors 从Udacity寻找捐赠者项目项目概况该项目将机器学习算法与美国人口普查数据一起应用,以确定一个人是否会向慈善机构捐款,以及在做出此决定时最重要的特征是什么。软件要求(参考:Udacity)档案...

    redhat linux教材20课程学习文档

    7.3.5 应用程序自带的文档 7.3.6 how-to和mini-how-to 第八章 用户管理 8.1 用户管理简介 8.2 用户类型 8.2.1 超级用户 8.2.2 普通用户 8.2.3 特殊用户 8.3 账号配置文件 8.3.1 /etc/passwd 文件 8.3.2 /etc/...

    Tcl_TK编程权威指南pdf

    这些命令与你的应用程序所提供的C或C++过程关联。结果应用程序就分割成一组用编译语言编写的原语,并输出成为相应的Tcl命令。使用Tcl脚本程序可以将这些原语组装成完整的应用程序。脚本语言层可以存取与shell类似的...

    颜色分类leetcode-pcc_geo_cnn:学习点云几何压缩的卷积变换

    高效的点云压缩是部署虚拟和混合现实应用程序的基础,因为代码点的数量可以达到数百万。 在本文中,我们提出了一种基于学习卷积变换和均匀量化的静态点云数据驱动几何压缩方法。 我们使用权衡参数对速率和失真进行...

    ng-js:Angular JS 微版(学习用)

    ng-js Angular JS 微版(学习用)。 它的开发是为了好玩和学习 AngularJS 框架...作用域,嵌套作用域观察者表达式和解析器(与 AngularJS 不同,它使用eval实现以简化实现) 编译(树遍历)和应用指令脏检查和消化周期

    基于Unet分割与CNN识别的车牌识别(python)

    车牌识别系统是基于深度学习技术的一个应用,旨在通过图像处理和模式识别算法实现对车牌的自动识别和提取。该系统采用了UNet网络进行车牌分割和CNN网络进行车牌识别,可以准确、高效地识别车辆上的车牌信息。 系统...

    dgl-ke:高性能,易于使用且可扩展的软件包,用于学习大规模知识图嵌入

    知识图(KG)是存储有关不同实体(节点)及其关系(边缘)的信息的数据结构。 在各种机器学习任务中使用KG的常见方法是计算知识图嵌入。 DGL-KE是一种高性能,易于... 评估,读取预训练的嵌入,并使用dglke_eval在测

    PHP和MySQL WEB开发(第4版)

    1.2 创建一个示例应用:Bob汽车零部件商店 1.2.1 创建订单表单 1.2.2 表单处理 1.3 在HTML中嵌入PHP 1.3.1 使用PHP标记 1.3.2 PHP语句 1.3.3 空格 1.3.4 注释 1.4 添加动态内容 1.4.1 调用函数 1.4.2 使用date()函数...

    PHP和MySQL Web开发第4版pdf以及源码

    1.2 创建一个示例应用:Bob汽车零部件商店 1.2.1 创建订单表单 1.2.2 表单处理 1.3 在HTML中嵌入PHP 1.3.1 使用PHP标记 1.3.2 PHP语句 1.3.3 空格 1.3.4 注释 1.4 添加动态内容 1.4.1 调用函数 1.4.2 使用...

    PHP和MySQL Web开发第4版

    1.2 创建一个示例应用:Bob汽车零部件商店 1.2.1 创建订单表单 1.2.2 表单处理 1.3 在HTML中嵌入PHP 1.3.1 使用PHP标记 1.3.2 PHP语句 1.3.3 空格 1.3.4 注释 1.4 添加动态内容 1.4.1 调用函数 1.4.2 使用...

Global site tag (gtag.js) - Google Analytics