概述
我呢在初始了shell之后呢,在学习shell符号的命令代换这个部分呢,对于这个呢不是很了解,所以就再往上查了查,下面呢我就这个总结一下吧。
命令代换`和$()
在shell中,如果想获得一个命令的返回值,如果为整数,可以直接用$?获取其退出码。
但如果一条命令的返回值不是整数,怎么实现?
这里就不得不提shell下的命令代换功能!
由反引号括起来的也是一条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。
我们有两种方式实现命令代换功能:
分别是``和$()这两种方式。
反引号`与$()均可执行命令代换,同一条命令的代换,执行的结果是一样的,例如:
运行后可以看到两个的结果是一样的。
但是呢,我们换一种方式再去使用这两个命令代换:
我们在运行后可以看到这里的两个结果是不一样的
用反引号是会输出真正的hostname,但是用$()时只输出命令。
这是因为反引号齐本身就对\进行了转义,保留了其本身意思。而$()中则不需要考虑\的问题。
两者的区别
1.$()看起来比较简洁直观,而``很容易与‘’进行混淆
2.在多层替换中``需要进行转义,比较麻烦
3.``的移植性更强,因为$()不保证所有linux系统都能支持
补充:对eval命令的调研
eval命令用来告知shell取出eval的参数,重新运算求出参数内容。比如:
然后运行可以看到
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命令可以给变量一个值