命令代换:在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命令可以给变量一个值。