如果命令行字符第一个字符为波浪号或者变量指定的值里任何未被引号括起来的冒号之后的第一个字符为波浪号时,shell便会执行波浪号展开。波浪号展开的目的,是要将用户根目录的符号型表示方式,改为实际的目录路径。
shell环境下的通配符展开,有几个基本的通配符:? , * , [set] [!set] ,前俩略过,第三个是匹配出现中括号集合中的字符,第四个取反义。比如可以查找 *.html 就知道处所有类似的文件。另外有一点注意的,在linux下文件名里的.号没有任何特殊意义,匹配所有文件时只需用一个*即可,不用像windows下那样*.*。
习惯上,当执行通配符展开时,shell会忽略文件名开头为一个点号的文件。像这样的点号文件(dot files)通常用作程序配置文件或启动文件。
命令替换,书上写的概念很绕口,其实就是一个命令的用法或者写法,例如:
echo outer `echo inner1 `echo inner2 ` `
这样输出结果就是 outer inner1 inner2 类似命令嵌套,从最内层开始执行。注意是反单引号,键盘1左边与波浪号同键那个。但是这样嵌套多了之后会非常难以阅读,就出现了新的语法:
$ echo outer $(echo inner1 $(echo inner2) inner1) outer
这样输出结果就是outer inner1 inner2 inner1 outer。这样清晰多了。
书中教了一个expr命令,从提到这个命令,到接下来的两段都在说这个命令不好用,并且可以是由$(( )) ,test替代。但是可以了解一下,作用就是计算之后跟着的一个表达式比如:expr 1 + 1 。这里注意加号两边的空格,是必要的,书里貌似没说,郁闷半天才发现必须添加空格。。- -!
这里又提了引用,就是说用来防止shell将某些东西解释成你不想要的意义,比如你就是有就想要*,而不是需要一个通配符,这时候你需要转义() ,或者是单引号引起来(单引号引起来的内容转义符号也无效),或是双引号。混用的时候请小心。
书中详细说了一下命令的执行顺与,感觉很有必要细看一下,全都摘录一下。
shell从标准输入或脚本中读取的每一行成为管道;它包含了一个或多个命令,这些命令被零或多个管道字符隔开。事实上还有很多特殊符号可用来分隔单个的命令:分号;、管道|、&、逻辑AND&&、还有逻辑OR||。对于每一个读取的管道,shell都会将命令分割,为管道设置I/O,并且对每一个命令依次执行下面操作:
1、将命令分割成token,是以固定的一组meta字符分隔,有空格、制表符、换行字符、;、(、)、<、>、|、和&。token的种类包括单词、关键字、输出入重定向器,以及分号。这是微妙的,但是变量、命令还有算符替换,都可以在shell执行token认定的时候被执行。这就是为什么先前所举例子vi ~$user/.profile中波浪符号可以展开像预期的那样工作。










