eval让shell脚本动态的构建命令
来源:互联网 发布:百度盘限速 知乎 编辑:程序博客网 时间:2024/06/07 08:51
简单来说eval对程序语言来说是如虎添翼[《shell脚本学习指南》09年4月第一版,P199]
eval命令的存在是为了取代一般命令行替换与执行顺序,让shell脚本可以动态的构建命令,这个功能很好用,但得小心使用。[P190]
工作原理及用法
用法:eval command-line
原理:eval主要用在对参数的特殊处理上面的,一般的命令行,shell处理参数就只执行一遍,像转义和变量转变;但加上eval后就可以对参数多进行一遍处理;
一个eval只能使shell对参数多一次处理,因此有几个eval就可以多加几次,即eval eval command-line 这样就能对参数进行三次编译,但此时应特别注意参数的转义,下面有例子说明。
eval命令会计算(evalue)它的参数,这些参数作为表达式计算后重新组合为一个字符串,然后作为一个命令被执行。
eval最常见的用法是将动态生成的命令行计算并执行。
1. eval command-line
其中command-line是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。如:
pipe="|"
eval ls $pipe wc -l
shell第1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|作为管道符号了。
如果变量中包含任何需要shell直接在命令行中看到的字符(不是替换的结果),就可以使用eval。命令行结束符(; | &),I/o重定向符(< >)和引号就属于对shell具有特殊意义的符号,必须直接出现在命令行中。
2. eval echo \$$# 取得最后一个参数
如:cat last
eval echo \$$#
./last one two three four
four
第一遍扫描后,shell把反斜杠去掉了。当shell再次扫描该行时,它替换了$4的值,并执行echo命令
3.以下示意如何用eval命令创建指向变量的“指针”:
x=100
ptrx=x
eval echo \$$ptrx 指向ptrx,用这里的方法可以理解b中的例子
100 打印100
eval $ptrx=50 将50存到ptrx指向的变量中。
echo $x
50 打印50
附eval用法三例(网络收集):
例一:
#寻找合符条件的变量名,然后将该变量的值赋予另一变量
v1=aaa
v2=bbb
c=1
if [ $c -eq 1 ]
then
vname=v$c #找到符合条件的变量名为v1
eval vvv="$"$vname ; echo vvv: $vvv #将变量v1的值赋予vvv,即,使vvv=aaa
eval vvv='$'$vname ; echo vvv: $vvv #将变量v1的值赋予vvv,即,使vvv=aaa
#eval vvv=$$vname ; echo vvv: $vvv #错误用法
fi
#例二:
#以变量v1的值aaa作为变量名,将变量vaaa的值赋予这一新定义的变量aaa
v1=aaa ; vaaa="This is aaa"
#eval $v1=$vaaa ; echo aaa: $aaa #错误用法
#eval $v1="$vaaa" ; echo aaa: $aaa #错误用法
eval $v1='$vaaa' ; echo aaa: $aaa
#例三:
#以变量v1的值aaa作为变量名,并将变量名字串作为值赋予自身
v1=aaa ; vaaa="This is aaa"
eval $v1=$v1 ; echo aaa: $aaa #与例二的错误用法不同,这一用法是正确的
eval $v1="$v1" ; echo aaa: $aaa #与例二的错误用法不同,这一用法是正确的
eval $v1='$v1' ; echo aaa: $aaa
- eval让shell脚本动态的构建命令
- 【Linux】shell脚本下的命令代换` `和$() 以及eval
- shell脚本 符号 `` 和$()的对比 及eval命令
- Linux下shell脚本中的eval命令
- 【shell脚本】命令代换 ` `, $( ) ,整数运算$(( )),变量代换${ },eval命令
- 【shell脚本】eval命令详解及命令代换
- [shell 脚本]eval命令和命令代换 ` `和 $()
- shell脚本eval
- shell脚本中命令代换:反引号、$()、eval区别
- shell eval命令使用
- shell中的eval命令
- shell eval命令使用
- shell eval命令使用
- shell eval命令使用
- shell eval命令
- linux shell eval命令
- shell脚本---构建基础脚本和结构化命令
- shell脚本中的eval、‘‘和$()
- Uva 3027 Corporative Network
- Ubuntu12.04密码正确无法登陆
- Android数据存储与IO之二 SQLite数据库
- Docker学习笔记(1)-- 如何安装Docker
- Struts2之验证框架一(通过覆盖validate()方法)
- eval让shell脚本动态的构建命令
- Android数据存储与IO之三 手势Gesture
- 对话机器学习大神Yoshua Bengio(上)
- git大神的文章
- Android的ContentProvider之一 功能、Uri用法、ContentResolver
- hdu 1081 To The Max(二维最大连续和)
- Android的ContentProvider之二 实现自己的ContentProvider
- Docker学习笔记(2)--Docker常用命令
- 导出、导入模块:《一 -- 针对【叶子节点】》