var1=AB var2=CD var3=var1 不准直接用var1 ,将AB变量赋值为CD unset AB eval ` eval echo '$'$var3'='$var2` echo $AB 这样就将AB赋值为CD
+-------------+ 单引号 |------------------------->| |--------------------------| | ----------------------->| 1.分隔成记号|---- ---------------| | | | ------------------->| | 双引号 | | | | | +-------------+ | | | | | || | | | | |读取下一个命令 \/ | | | | | +-------------------------------------------+ | | | | | | 2. | | | | | ------| 检验第一个记号 | | | | | |开放的关键字 其他关键字 | | | | | | 非关键字 | | | | | +-------------------------------------------+ | | | | || | | | | \/ | | | | +-----------------------------+ | | | | 扩展别名 | 3. 检验第一个记号 | | | | |------------| 别名 | | | | | 不是别名 | | | | +-----------------------------+ | | | || | | | \/ | | | +--------------+ | | | | 4.大括号扩展 | | | | +--------------+ | | | || | | | \/ | | | +--------------+ | | | | 5.~符号扩展 | | | | +--------------+ | | | || | | | \/ | | | +--------------+ 双引号 | | | | 6.参数扩展 |<--------------------------| | | +--------------+ | | || | | \/ | | +------------------------------+ | | | 7.命令替换(嵌套命令行处理) | | | +------------------------------+ | | || | | \/ | | +--------------+ 双引号 | | | 8.算术扩展 |----------------------------| | | +--------------+ | | | || | | | \/ | | | +--------------+ | | | | 9.单词分割 | | | | +--------------+ | | | || | | | \/ | | | +--------------+ | | | | 10.路径名扩展| | | | +--------------+ | | | || | | | \/ | | | +----------------------------------------+ | | | | 11.命令查寻:函数,内置命令,可执行文件|<----|----| | +----------------------------------------+ | || | \/ |将参数带入下一个命令 +-------------+ |----------eval--------------| 12.运行命令 | +-------------+ 在回车之后会发生什么?
回车之后会发生什么? l shell解释你的命令行 l shell执行一些替换 l shell在内存中装载你的命令 l shell建立I/O的重定向 l shell执行你的命令程序 l shell等待你程序执行结束 l shell等待下一条命令
当用户输入命令按回车之后,shell在执行命令之前会先解释该命令。当shell执行脚本文件时也是相同的顺序。 命令执行的次序是相当重要的。如果你违反了执行的次序将会得到意想不到的结果。下面将帮助你了解shell执行的次序。为了更清楚,一些关于shell关键字的内部控制命令已经得到了简化。
Shell 处理过程 1.Shell首先从命令行中找出特殊字符(元字符),在将元字符翻译成间隔符号。元字符将命令行划分成小块tokens。Shell中的元字符如下所示: SPACE , TAB , NEWLINE , & , ; , ( , ) ,< , > , | 2. 程序块tokens被处理,检查看他们是否是shell中所引用到的关键字。 3. 当程序块tokens被确定以后,shell根据aliases文件中的列表来检查命令的第一个单词。如果这个单词出现在aliases表中,执行替换操作并且处理过程回到第一步重新分割程序块tokens。 4.Shell对~符号进行替换。 5.Shell对所有前面带有$符号的变量进行替换。 6.Shell将命令行中的内嵌命令表达式替换成命令;他们一般都采用$(command)标记法。 7.Shell计算采用$(expression)标记的算术表达式。 8.Shell将命令字符串重新划分为新的块tokens。这次划分的依据是栏位分割符号,称为IFS。缺省的IFS变量包含有:SPACE , TAB 和换行符号。 9.Shell执行通配符* ? [ ]的替换。 10.shell把所有從處理的結果中用到的注释删除,並且按照下面的顺序实行命令的检查: A. 内建的命令 B. shell函数(由用户自己定义的) C. 可执行的脚本文件(需要寻找文件和PATH路径) 11.在执行前的最后一步是初始化所有的输入输出重定向。 12.最后,执行命令。 最后执行的命令的形式可能与开始时敲进去的命令形式大不相同。这就是POSIX shell的强大之处:非常简短的指令可以产生不同凡响的结果。
|