命令代换
Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就执行一条,这种方式称为交互式,Shell还有一种执行命令的方式称为批处理,即用户事先写一个Shell脚本,让Shell一次把这些命令执行完。
Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令。
命令代换:Shell执行命令并将命令替换部分替换为执行该命令的后的结果。。
命令代换的两个指令为`(反引号)和$()
1.使用反引号括起来的命令代换指令,Shell会先执行该命令,然后将输出立刻代换到当前命令行中
例:已知echo $LOGNAME是查询当前用户的登录名的指令
建立一个shell脚本文件,以文件名.sh为后缀
输入内容
该脚本文件的运行结果为
检测结果
由以上的测试结果和检测结果可以看出,脚本文件中的命令,先执行了反引号中的echo $LOGNAME命令,即查询当前登录用户的用户名,然后将执行的结果代换到当前的命令中。
2.同样$()命令也可完成上述的操作
Shell脚本文件为
该脚本文件的运行结果
3.由上可以看出反引号和$()看起来执行了相同的操作,可是熟悉系统的都知道,系统中是不会有冗余的指令的,所以我们来看看这两条指令的不同之处
Shell脚本文件为1.0
程序运行结果
由此版本可以看出(1)转义字符在反引号中使用两个连续的转义字符可以转为一个普通的字符,(2)在$() 中两个连续的转义字符会输出一个反斜杠,即第一个转义字符发挥了转义字符的作用,成功的将第二个转义字符转为普通的反斜杠
脚本文件2.0
在此版本中可以看出,(1)反引号中的转义字符并没有成功转义$符号,所以该转义字符没有任何意义。(2)$()中的转义字符将$符号转义为了普通字符,没有成功执行该命令
脚本文件3.0
脚本文件运行结果
由此文件可以看出(1)在反引号中4个转义字符可以输出一个反斜杠,(2)$()中连续的四个转义字符可以输出两个反斜杠
总结:由上边三个程序可以看出
(1)$()中每个转义字符都是转义字符的含义
(2)反引号中的转义字符只有一个时,没有任何意义,两个连续连续的可以起到一个转义字符的含义
区别:
(1)反引号在执行时,会不管反引号内是什么都先进行解释,再把解释后的结果给shell执行
(2)$()在执行时,若()中的是命令,则会直接给shell去执行,如果是变量取值,则也仅作第一层的字面解释会给shell执行
4.eval命令
功能:告知shell取出eval的参数,重新运算求出参数的内容
用法:eval [参数] (参数数目不限,使用分号分隔)
eval可读取一连串的参数,然后再依参数本身的特性执行
参数是在终端上键入一条普通命令,然而当在它前面放上eval时,其结果是shell在执行命令行前扫描它两次,再次运算求出参数内容
(1)用于回显简单变量
(2)执行含有字符串的命令
(3)
eval命令显示出传递给脚本的最后一个参数