Shell的预处理
当我们在shell中敲击命令按下enter键时,其实bash在这些命令字符送到命令前做了一些处理,这些处理叫expansion,比如“*”字符在shell命令行中有很多意义。在命令行enter后,这些特殊字符将会扩展成另外的一些东西。
echo是shell內建的程序,打印出该命令的参数到stdout。但是如果是echo *,命令将不是打印出*而是另外一些东西。shell在echo命令执行之前将*扩展成了另外的东西。
-
通配符“*”的工作机制被称为pathname expansion。
- “”在单词前扩展为该单词名称的家目录,如syl。
- “$”是算术扩展。echo $((expression)),可以嵌套。echo $((2 + 2));echo $(($((5**2)) * 3))。
-
{}花括号扩展。可以根据花括号中的模型pattern创建多个text字符串
-
参数扩展parameter expansion。在系统中存储着一些有名字的数据集,实际上这些数据集叫做变量。echo $USER显示USER变量的内容。想要知道可用的变量列表可以printenv | less。
-
命令替换。可以让我们使用一个命令的输出作为另一个命令的参数。
引号的使用
- 忽略了参数中多余的空格
- 由于$1是一个没有定义的变量所以为空字符
引号的出现解决这些问题。
双引号
将字符放在双引号内,shell中那些拥有特有含义的字符就失去了这些特殊含义,只是普通的字符文本,但是其中“$”“\”“`”三个例外。
ls命令会认为这是两个参数。用ls -l "two words.txt"就可以去除空格的影响,修复mv "two words.txt" two_words.txt。然而$依然可用,echo "$USER $((2 + 2)) $(cal)"。
通常,单词分割是根据空格space,制表符tab,换行newlines这些单词间的分隔符。这就是说,没有在引号内的spaces,tabs,newlines并不是文本的一部分,他们只是分隔符,因此就变成了多个命令参数。加上双引号就取消了这些分隔符的意义,变成一个参数。
单引号
为了消除所有的expansion,使用单引号
转义字符
通常在双引号中出现的消除特殊含义的扩展。