shell命令代换与eval命令

命令代换:在shell中用以下两种方式实现命令代换:

`COMMAND`   //反引号
$(COMMAND)   //$()

命令代换即首先执行反引号或括号里的命令,将其结果立刻代换到当前命令行中或者代换赋予一个变量:
如下图,在一个shell脚本中打印日期:
这里写图片描述

以上执行过程中:第一种先执行反引号与()中date命令,执行完成,结果代换到命令行中然后用echo命令输出;第二种先执行了$()中的data命令,然后将此命令执行结果代换到当前命令行,赋予一个变量,将此变量echo输出。
执行结果如下:
这里写图片描述

从以上可知,两种方式的命令代换都可以实现相同效果,那区别在于那些方面:
1.最主要的区别如下:
这里写图片描述
即可以看出用$()最后输出的“\”是按照普通字符输出的,使用反引号则是将“\”转义为”\”在执行,所以此处输出一个‘\’.
2.并且反引号是旧用法,()是新用法,反引号基本适用于全部unix shell中,()则相反;
3.命令代换是允许嵌套的,在多层次的复合替换中,反引号是比较复杂的如下:

echo `echo \`echo 'hello world'\``

$()如下:

echo $(echo $(echo 'hello world'))

所以$()是比较直观的,一般都推荐使用.

eval命令首先扫描命令行进行所有的替换,然后在执行该命令,如:
这里写图片描述
如以上图:先创建一个文件test内容有上图显示,然后将”cat test”作为一个字符串赋予变量mytest,直接echo这个变量则其只会打印“cat test”,但是当用eval命令时其则会打印出test文件内容:即其先将变量mytest替换为cat test,最后执行此命令。
所以1.该命令适用于执行那些一次扫描无法实现其功能的变量,其对变量进行两次扫描,而这些需被两次扫描才能实现其功能的变量称为复杂变量。
2.eval命令依然可以回显简单变量,不一定只处理复杂变量。如:

NAME=test
eval echo $NAME  等价于   echo $NAME

3.eval命令可以显示出传递给脚本的最后一个参数;
4.eval命令可以给变量一个值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值