Linux【Shell脚本】—eval命令和命令代换(`和$())
2017-07-01 20:22
316 查看
1、eval命令:
1.eval命令将首先会扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。
2.eval也可以用于回显简单变量,不一定是复杂变量。
name
3.两次扫描
创建test.txt文件写入“hello world”,然后执行以下命令:
4.获得最后一个参数
shell 也提供了 eval 命令,如同熟悉的其他脚本语言,会将它的参数做为命令执行,初看会疑惑为什么shell要提供两种动态执行命令字串的机制,但是经过仔细分析,才发现shell的eval同其他语言有很大区别:
1.shell 中的函数虽然可以通过return 返回,但是这里的return 相当于 exit,只能是个状态值用于测试,而不能像其它语言一样返回复杂的结果,其处理结果只能通过输出到标准输出经过
(2)eval 嵌套无意义 ,在其他语言中可以通过 eval(eval(“code”)),来执行(执行动态生成的code的返回),而由于shell 中 eval 将后面的eval命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代。
eval是对Bash Shell命令行处理规则的灵活应用,进而构造”智能”命令实现复杂的功能。上面提及的命令是eval其中一个很普通的应用,它重复了1次命令行参数传递过程,纯粹地执行命令的命令。
2、命令代换(`和$())
1)由反引号括起来的也是一条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。
2)命令代换也可以用$()表示:
(
区别二、(COMMAND)形式的命令替换是允许嵌套的在多层次的复合替换中,反引号须要额外的跳脱(‘)处理,而( ) 则比较直观。例如:`cmd1`cmd2`` 就是错的。需要`cmd1\`cmd2\``如果有多个命令嵌套就比较复杂了。而用()就比较直观比如(cmd1(cmd2(cmd3)))
但是,()也是有缺点的反引号基本上可用在全部的unixshell中使用,若写成shellscript,其移植性比较高。而() 并不见的每一种 shell 都能使用。
算术代换:(())用于算术计算,(())中的Shell变量取值将转换成整数
$(())中只能⽤用+-*/和()运算符,并且只能做整数运算。
本文中所有实例是在终端直接输入得出结果,读者也可编写成.sh脚本文件运行
1.eval命令将首先会扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。
2.eval也可以用于回显简单变量,不一定是复杂变量。
Value=name eval echo $Value
name
3.两次扫描
创建test.txt文件写入“hello world”,然后执行以下命令:
$ myfile="cat test.txt" $ echo $myfile cat test.txt $ eval $myfile hello world!
4.获得最后一个参数
echo "Last argument is $(eval echo \$$#)" Last argument is bash echo "Last argument is $(eval echo $#)" Last argument is 0
shell 也提供了 eval 命令,如同熟悉的其他脚本语言,会将它的参数做为命令执行,初看会疑惑为什么shell要提供两种动态执行命令字串的机制,但是经过仔细分析,才发现shell的eval同其他语言有很大区别:
1.shell 中的函数虽然可以通过return 返回,但是这里的return 相当于 exit,只能是个状态值用于测试,而不能像其它语言一样返回复杂的结果,其处理结果只能通过输出到标准输出经过
,$()取得。 2.shell 中的 eval (1) 不能获得函数处理结果 ,如1所说,所有命令,函数的处理结果只能通过来获得,那么其它语言中利用eval来获得动态生成代码执行后的输出变得不可能。
(2)eval 嵌套无意义 ,在其他语言中可以通过 eval(eval(“code”)),来执行(执行动态生成的code的返回),而由于shell 中 eval 将后面的eval命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代。
eval是对Bash Shell命令行处理规则的灵活应用,进而构造”智能”命令实现复杂的功能。上面提及的命令是eval其中一个很普通的应用,它重复了1次命令行参数传递过程,纯粹地执行命令的命令。
2、命令代换(`和$())
1)由反引号括起来的也是一条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。
$ Date=`date` $ echo $Date Sat Jul 1 08:42:37 PDT 2017
2)命令代换也可以用$()表示:
$ Date=$(date) $ echo $Date Sat Jul 1 08:43:37 PDT 2017
(
和$())间的区别和联系: 均可用于命令代换 区别一、Bash中的后置引用COMMAND`会将命令中的\转义为\再执行,而$(COMMAND)则不会进行转义
$ echo `echo 'hello world\\'` hello world\
$ echo $(echo 'hello world\\') hello world\\
区别二、(COMMAND)形式的命令替换是允许嵌套的在多层次的复合替换中,反引号须要额外的跳脱(‘)处理,而( ) 则比较直观。例如:`cmd1`cmd2`` 就是错的。需要`cmd1\`cmd2\``如果有多个命令嵌套就比较复杂了。而用()就比较直观比如(cmd1(cmd2(cmd3)))
但是,()也是有缺点的反引号基本上可用在全部的unixshell中使用,若写成shellscript,其移植性比较高。而() 并不见的每一种 shell 都能使用。
$ echo `echo \`echo 'hello world'\`` hello world
$ echo $(echo $(echo 'hello world')) hello world
算术代换:(())用于算术计算,(())中的Shell变量取值将转换成整数
$(())中只能⽤用+-*/和()运算符,并且只能做整数运算。
$ VAR=45 $ echo $(($VAR+3)) 48
本文中所有实例是在终端直接输入得出结果,读者也可编写成.sh脚本文件运行
相关文章推荐
- 【Linux】shell脚本下的命令代换` `和$() 以及eval
- Linux下shell脚本中的eval命令
- 【shell脚本】命令代换 ` `, $( ) ,整数运算$(( )),变量代换${ },eval命令
- 【shell脚本】eval命令详解及命令代换
- [shell 脚本]eval命令和命令代换 ` `和 $()
- Linux:shell脚本之命令替换(eval,反引号和$())
- linux下shell脚本执行方法及exec和source命令
- Linux命令-学习shell脚本之前的基础知识
- linux下shell脚本执行方法及exec和source命令
- Shell脚本编程——了解你的Linux系统必须掌握的20个命令
- Linux脚本Shell命令
- linux C程序中获取shell脚本输出(如获取system命令输出)
- Linux中使用crontab命令定时执行shell脚本或其他Linux命令
- Linux新手生存笔记[10]——shell脚本基础3-函数及常用命令
- linux-shell脚本命令之grep
- Linux test 脚本 shell 命令详解
- Linux执行shell脚本方式及区别&命令后台运行
- 在java程序中如何调用linux的命令?如何调用shell脚本呢?
- linux下shell脚本执行方法及exec和source命令
- Linux新手生存笔记[10]——shell脚本基础3-函数及常用命令