Linux之eval命令使用方法详解

eval命令将会首先扫描命令行进行所有的替换,类似于C语言中的宏替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。

新建一个文件test将字符串”helloworld!“写入文件中,把cat test赋值给变量word,如果我们echo word并不能的到test中的内容;然而eval word则能显示文件中的内容,因为eval命令对后面的命令进行了两次扫描,第一次将word替换为 cat test,第二次执行cat test。

Linux之eval命令使用方法详解

2.eval也可以用于回写简单变量,不一定是复杂变量。
    NAME=ZONE
    eval echo $NAME等价于echo $NAME
Linux之eval命令使用方法详解
3、eval命令还可以获取传给shell的最后一个参数 
如果我们知道参数个数,我们想要查看最后一个参数的内容可以使用echo直接显示,如输入 first last两个参数我们可以用echo $2 来查看最后一个参数; 

但是,如果我们不知道参数个数还想查看最后一个参数内容该怎么办呢?这是我们就想到使用 $$#为传给shell脚本的参数个数,但是上例中 echo “$$#”后显示的其实是参数个数,而使用eval echo “$$#”才显示最后一个参数的内容。 

Linux之eval命令使用方法详解

Linux之eval命令使用方法详解

对上述第3点补充:       今天学习eval命令时,发现了这个问题:       echo "Last argument is $(eval echo \$$#)" a b c d e       这句话本意打印:Last argument is e       但实际打印的是:Last argument is -bash a b c d e          $#一般用在脚本中的,用在命令行的话就要先使用set设置位置参数,因此修改为如下:       set - a b c d e       echo "Last argument is $(eval echo \$$#)"       Last argument is e          set - a b c d e f       echo "Last argument is $(eval echo $#)"       Last argument is 6

4、条件筛选 

在file文件中写入两列数据,第一列对应KEY 、第二列为VALUE,使用eval命令将KEY与VALUE的值对应起来,从文件中读取 

eval进阶:

    1.shell 也提供了 eval 命令,如同熟悉的其他脚本语言,会将它的参数做为命令执行,初看会疑惑为什么shell要提供两种动态执行命令字串的机制,但是经过仔细分析,才发现shell的eval同其他语言有很大区别。
    2.shell 中的 eval
        2.1 不能获得函数处理结果 ,如1所说,所有命令,函数的处理结果只能通过 “来获得,那么其它语言中利用eval来获得动态生成代码执行后的输出变得不可能。
        2.2 eval 嵌套无意义 ,在其他语言中可以通过 eval(eval(“code”)),来执行(执行动态生成的code的返回),而由于shell 中 eval 将后面的eval命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代。

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

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

[root@home root]# cat myscript1    QUOTE:    #!/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命令,执行。

法语写作助手 法语写作助手

法语助手旗下的AI智能写作平台,支持语法、拼写自动纠错,一键改写、润色你的法语作文。

法语写作助手 31 查看详情 法语写作助手

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

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

Linux之eval命令使用方法详解

如果命令行复杂的话(包括管道或者其他字符),直接执行$a字符串的内容就会出错。分析如下。
$a的处理位于参数扩展,也就是说,跳过了管道分析,于是”|”, “cut”, “-f1”, “-d”都变成了id命令的参数,当然就出错啦。
但使用了eval,它把第一遍命令行处理所得的”id”, “|”, “cut”, “-f1”, “-d”这些字符串再次进行命令行处理,这次就能正确分析其中的管道了。
总而言之:要保证你的命令或脚本设计能正确通过命令行处理,跳过任意一步,都可能造成意料外的错误!

相关推荐:

JavaScript中eval的使用详解

JavaScript中的eval()函数返回值和变量环境用法实例详解

JavaScript如何使用eval()函数计算JavaScript字符串实例详解

以上就是Linux之eval命令使用方法详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/557635.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 23:13:53
下一篇 2025年11月9日 23:14:32

相关推荐

  • 如何在 VS Code 中解决折叠代码复制问题?

    解决 VS Code 折叠代码复制问题 在 VS Code 中使用折叠功能可以帮助组织长代码,但使用复制功能时,可能会遇到只复制可见部分的问题。以下是如何解决此问题: 当代码被折叠时,可以使用以下简单操作复制整个折叠代码: 按下 Ctrl + C (Windows/Linux) 或 Cmd + C …

    2025年12月24日
    000
  • 姜戈顺风

    本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

    2025年12月24日
    000
  • 粘性定位怎么用

    粘性定位怎么用,需要具体代码示例 在前端开发中,粘性定位是一种常用的布局技术,可以将元素固定在页面的某个位置,当页面滚动时,该元素将会保持在固定位置不动,给用户带来更好的视觉体验。本文将介绍粘性定位的用法,并提供具体的代码示例。 一、CSS实现粘性定位CSS的position属性可以用来实现粘性定位…

    2025年12月24日 好文分享
    000
  • 使用绝对定位来定位元素参数的方法介绍

    如何使用绝对定位的参数进行定位? 随着网页设计的发展,对元素位置的精确控制成为了设计师和开发者追求的目标。而绝对定位(Absolute Positioning)提供了一种让元素根据其父元素进行定位的方法。在这篇文章中,我将向大家介绍如何使用绝对定位的参数进行定位,并提供一些具体的代码示例。 理解绝对…

    2025年12月24日
    000
  • 在CI框架中如何引入外部CSS样式表?

    CI框架中如何使用外部CSS样式,需要具体代码示例 引言:CI(CodeIgniter) 是一个轻量级的PHP开发框架,被广泛用于构建Web应用程序。在开发Web应用程序时,外部CSS样式起着至关重要的作用,可以帮助我们美化页面、提升用户体验。本文将介绍在CI框架中如何使用外部CSS样式,并提供具体…

    2025年12月24日
    000
  • 学习CSS框架必不可少:从基础开始掌握CSS框架的使用方法

    初学者必备:从零开始学习CSS框架的使用方法,需要具体代码示例 引言:随着Web设计和开发的快速发展,CSS框架已经成为每个前端工程师必备的工具。使用CSS框架可以大大提高开发效率,简化页面布局和样式的编写,同时还能够让网站呈现出更加统一和美观的外观。本文将介绍如何从零开始学习CSS框架的使用方法,…

    2025年12月24日
    000
  • 深入剖析CSS高级选择器的应用技巧

    深入探讨CSS高级选择器的使用方法,需要具体代码示例 CSS作为一种样式表语言,不仅可以用来美化网页的外观,还可以让我们更好地对网页元素进行控制和选择。在CSS中,除了基础的选择器(如元素选择器、类选择器和ID选择器)外,还有一些高级选择器,可以根据更复杂的条件来选择特定的元素。本文将深入探讨CSS…

    2025年12月24日
    000
  • 掌握id选择器的语法使用方法

    学习id选择器的语法使用方法,需要具体代码示例 在学习CSS(层叠样式表)时,了解和掌握选择器的语法和使用方法是非常重要的。其中,id选择器是一种常用的选择器,它允许我们通过给HTML元素添加id属性,通过该属性来选择特定的元素并对其应用样式。 首先,让我们来了解一下id选择器的语法。在CSS中,使…

    2025年12月24日 好文分享
    000
  • CSS行内元素与块级元素的使用场景和方法详解

    CSS行内元素和块级元素详解:探索它们的应用场景和使用方法 在CSS中,元素可以根据其显示特性分为两种类型:行内元素和块级元素。对于网页开发者来说,理解这两个概念非常重要,因为它们的不同特性决定了它们的应用场景和使用方法。 行内元素行内元素是指在网页中只占据一行的元素。常见的行内元素有、、、等。行内…

    2025年12月24日
    000
  • css中的float属性的一些使用方法

    本篇文章给大家带来的内容是关于css中的float属性的一些使用方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在CSS浮动中,元素浮动后将自动转为块级元素,可以移动到当前行的左侧或右侧,切记没有浮动到中间的概念,所以记住只会浮动到两侧。 float:left float:ri…

    2025年12月24日
    000
  • CSS中zoom属性或overflow:auto的使用方法

    这次给大家带来CSS中zoom属性或overflow:auto的使用方法,使用CSS中zoom属性或overflow:auto的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 其实在CSS中的Zoom这个属性一般不为人知,甚至有些CSS手册中都查询不到。其实Zoom属性是IE浏览器的专有属性…

    好文分享 2025年12月24日
    000
  • CSS3的linear-gradient线性渐变使用方法

    这次给大家带来CSS3的linear-gradient线性渐变使用方法,使用CSS3的linear-gradient线性渐变注意事项有哪些,下面就是实战案例,一起来看一下。 在商城项目中,购物车是一个很重要的功能。其中最常见的是购物车中对库存的“+-”操作,包括抢购后面有很多算法。但是作为前端来说,…

    2025年12月24日
    000
  • 详解css中border-image的使用方法

    border-image-source 属性设置边框的图片的路径[none | ] p { border: 20px solid #000; border-image-source: url(border.png);} border-image-slice 属性图片边框向内偏移[ | ](1,4) …

    2025年12月23日
    000
  • 如何查看编写的html_查看自己编写的HTML文件效果【效果】

    要查看HTML文件的浏览器渲染效果,需确保文件以.html为扩展名保存、用浏览器直接打开、利用开发者工具调试、必要时启用本地HTTP服务器、或使用编辑器实时预览插件。 如果您编写了HTML代码,但无法直观看到其在浏览器中的实际渲染效果,则可能是由于文件未正确保存、未使用浏览器打开或文件扩展名设置错误…

    2025年12月23日
    400
  • html5怎么设置黑体_html5用CSS font-family设黑体或font-weight加粗【设置】

    在HTML5中实现黑体及加粗需用CSS的font-family和font-weight:一、font-family按优先级列“SimHei”,“Microsoft YaHei”,“Heiti SC”,sans-serif;二、font-weight用700或bold;三、组合声明并注意继承;四、可用…

    2025年12月23日
    000
  • navigator怎么用html5_HTML5用navigator对象查浏览器信息如语言【对象】

    可通过navigator对象获取浏览器语言、设备类型、平台信息、地理定位和媒体设备支持:navigator.language/languages返回语言代码;userAgent判断移动设备;platform返回操作系统;geolocation检测定位支持;mediaDevices检查媒体访问能力。 …

    2025年12月23日
    000
  • html5怎么找颜色_html5用取色器或CSS命名如red快速找对应颜色【查找】

    可通过浏览器开发者工具取色、CSS命名颜色对照表、在线十六进制颜色查找工具及CSS自定义属性验证四种方法快速定位颜色值对应的实际色彩效果。 如果您在HTML5开发中需要快速定位某个颜色值对应的实际色彩效果,可以通过取色器工具或CSS预定义颜色名称来识别。以下是查找颜色的具体操作方法: 一、使用浏览器…

    2025年12月23日
    000
  • html5如何清除缓存_HTML5缓存清除步骤与清理浏览器缓存方法【教程】

    HTML5网页应用异常通常由浏览器缓存旧资源导致,需依次清除常规缓存、强制刷新、清理AppCache、注销Service Worker并清空其缓存、或用无痕模式验证。 如果您在使用HTML5网页应用时遇到内容未更新、页面显示异常或资源加载错误等问题,可能是由于浏览器缓存了旧版本的HTML、CSS、J…

    2025年12月23日
    000
  • html5怎么快速输入_HTML5用编辑器代码片段或Emmet缩写快速生成【输入】

    可利用Emmet缩写、编辑器代码片段及内置HTML5模板快速生成标准结构:输入!+Tab生成HTML5骨架;自定义snippets如sect插入语义化section;WebStorm新建HTML5文件自动添加必需meta;启用Emmet插件支持header/nav等语义标签缩写。 如果您在编写HTM…

    2025年12月23日
    000
  • html如何上传到空间_将HTML文件上传到网站空间步骤【步骤】

    HTML文件无法上网访问是因为未上传至网站空间,需通过FTP客户端、主机控制面板、Git部署或SFTP命令行四种方式之一上传到服务器根目录。 如果您已经编写完成一个HTML文件,但无法在互联网上访问它,则可能是由于该文件尚未上传至网站空间。以下是将HTML文件上传到网站空间的具体步骤: 一、使用FT…

    2025年12月23日
    300

发表回复

登录后才能评论
关注微信