原文链接:http://www.361way.com/shell-eval-variable/4957.html

shell 中经常会用到变量的嵌套的情况。比如,单个或多个变量的值作为变量名,再对该变量名取$获取其内部的变量的情况,这种脚本写起来很难搞,还好有eval 命令方便我们处理这种情况。便于理解,先来一个示例:

  1. #!/bin/bash
  2. a='my'
  3. b='site'
  4. my_site='my site www.361way.com'
  5. echo a_b is "$a"_"$b"
  6. echo $("$a"_"$b")
  7. web="$a"_"$b"
  8. echo web is $web
  9. eval echo '$'"$a"_"$b"
  10. eval echo '$'{"$a"_"$b"}

比如上面这个示例,猜猜看它的运行结果是什么?执行结果如下:

  1. # sh a.sh
  2. a_b is my_site
  3. a.sh: line 6: my_site: command not found
  4. web is my_site
  5. my site www.361way.com
  6. my site www.361way.com

从上面可以看出$("$a"_"$b")这种写法会报错,可以正确取到我们想要的结果可以有两种写法:eval echo '$'"$a"_"$b" 或 eval echo '$'{"$a"_"$b"} 。

eval 这么神奇,到底是个什么东东?

eval 命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量,该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时被称为复杂变量。eval命令即可以用于回显简单变量,也可以用于回显复杂变量。

再来个示例,该例中文件有两列,第一列为变量名,第二列为变量值,读取该文件后将第二列的值赋值给第一列,通过echo ${第一列列名} 就可以获取后面的value值。如下:

  1. 变量名与变量值映射表:
  2. # more name_value.txt
  3. site www.361way.com
  4. mail itybku@139.com
  5. user admin
  6. 脚本内容:
  7. # cat b.sh
  8. #!/bin/bash
  9. while read NAME VALUE
  10. do
  11. eval "${NAME}=${VALUE}"
  12. done < name_value.txt
  13. echo "$site $mail $user"

执行该脚本,结果如下:

  1. # sh b.sh
  2. www.361way.com itybku@139.com admin

shell中的变量与eval(转)的更多相关文章

  1. shell中的变量a=100, 什么时候作整数使用, 什么时候作字符串使用呢?

    shell中的变量a=100, 什么时候作整数使用, 什么时候作字符串使用呢? 这确实是一个困扰很久的一个问题? how it can be an issue? 事实上, 在shell中, 你可以认为 ...

  2. SHELL 中的变量

    变量的分类 系统环境变量 系统本身所有,通常为大写字母 系统变量通过 set 或 declare 指令进行查看 UDV 变量(user defined variable ) 用户创建和维护,建议大写 ...

  3. C Shell中的变量数组

    今天刚刚在看一点C Shell的内容,发现一个挺好玩的东西!就是环境变量可以像数组那样来设置!具体设置语法如下: set variable=(element1 element2 ...) //注意元素 ...

  4. Linux Shell中的变量声明和一些特殊变量

    在SHELL中定义变量比较直接,无类型区别,不需要像Java那样定义好是String还是int等. 声明变量需要遵守或者注意的几点: 变量名和等号之间不能有空格. 变量名首字符必须为字母. 变量名里可 ...

  5. shell专题(四):Shell中的变量

    4.1 系统变量 1. 常用系统变量 $HOME.$PWD.$SHELL.$USER等 2.案例实操 (1)查看系统变量的值 [atguigu@hadoop101 datas]$ echo $HOME ...

  6. Shell中脚本变量的作用域

    原文地址:http://blog.csdn.net/abc86319253/article/details/46341839    在shell中定义函数可以使代码模块化,便于复用代码.不过脚本本身的 ...

  7. (二)shell中的变量

    1.常用系统变量 $HOME.$PWD.$SHELL.$USER等 2.自定义变量 基本语法: (1)定量变量:变量=值 (2)撤销变量:unset 变量 (3)声明静态变量:readonly变量 注 ...

  8. shell中环境变量

    Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的环境变量. 所以管理环境变量的文件也分为系统级和用户级的, ...

  9. 有时候shell中某些变量总是不能被改变是什么原因

    答:在子shell执行,那么变量的值总是不能如愿以偿的改变,示例如下: #!/bin/sh var="jello" cat "jello.txt" | whil ...

随机推荐

  1. BZOJ4892 Tjoi2017dna(后缀数组)

    对每个子串暴力匹配至失配三次即可.可以用SA查lcp.然而在bzoj上被卡常了.当然也可以二分+哈希或者SAM甚至FFT. #include<iostream> #include<c ...

  2. JAVA里面"=="和euqals的区别

    (1)基本数据类型,用双等号“==”比较,比较的是他们的值,值类型是存储在内存中的栈中 (2)复合数据类型中, 当他们用“==”进行比较的时候,比较的是他们在内存中的存放地址,其变量在栈中仅仅是存储引 ...

  3. JAVA中的堆、栈等内存分析

    在 JAVA 中,有六个不同的地方可以存储数据 1. 寄存器( register ) 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  4. Closest Number in Sorted Array

    Given a target number and an integer array A sorted in ascending order, find the index i in A such t ...

  5. 洛谷 P4319 变化的道路 解题报告

    P4319 变化的道路 题目描述 小 w 和小 c 在 H 国,近年来,随着 H 国的发展,H 国的道路也在不断变化着 根据 H 国的道路法,H 国道路都有一个值 \(w\),表示如果小 w 和小 c ...

  6. (转)Ubuntu 17.04_64上搭建巡风扫描系统(资产信息漏洞扫描内网神器)

    巡风简介 巡风是一款适用于企业内网的漏洞快速应急.巡航扫描系统,通过搜索功能可清晰的了解内部网络资产分布情况,并且可指定漏洞插件对搜索结果进行快速漏洞检测并输出结果报表.其主体分为两部分:网络资产识别 ...

  7. spring mybatis 多数据源配置

    1.创建好数据库的配置文件 mysql.url=jdbc:mysql://***/***?useUnicode=true&characterEncoding=UTF-8 mysql.usern ...

  8. selenium测试 - open Firefox

    环境:Python2.7+selenium3+Firefox47   问题1: 在打开火狐浏览器时报错:‘geckodriver‘ executable needs to be in PATH fro ...

  9. poj3648 Wedding

    Wedding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10975   Accepted: 3355   Specia ...

  10. STL源码分析-hashtable

    http://note.youdao.com/noteshare?id=5c8d2b09c0f72af9a12b0ed2023a338d