路径名展开
为何echo
不打印 * ?是因为shell把 * 展开成了另外的东西(在这种情况下,就是在当前工作目录下的文件名字)
这种通配符工作机制叫做路径名展开
算术表达式展开
shell 允许算术表达式通过展开来执行。这允许我们把 shell 提示当作计算器来使用:
算术表达式展开使用这种格式:
$((expression))
(以上括号中的)表达式是指算术表达式,它由数值和算术操作符组成。
算术表达式只支持整数(全部是数字,不带小数点),但是能执行很多不同的操作:
操作符 | 说明 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除(但是记住,因为展开只是支持整数除法,所以结果是整数。) |
% | 取余,只是简单的意味着,“余数” |
** | 取幂 |
花括号展开
可以从一个包括花括号的模式中创建多个文本字符串:
花括号展开模式可能包含一个开头部分叫做报头,一个结尾部分叫做附言。花括号表达式本身可能包含一个由逗号分开的字符串列表,或者一系列整数,或者单个的字符串。这种模式不能嵌入空白字符。
应用场景:创建一系列的文件或目录列表。例如,把大量相片按年月先后组织起来,需要创建一系列以数值”年-月”形式命名的目录。
参数展开
这个特性在 shell 脚本中比直接在命令行中更有用。它的许多性能 和系统存储小块数据,并给每块数据命名的能力有关系。许多像这样的小块数据, 更适当些应叫做变量,可以方便地检查它们。例如,叫做”USER”的变量包含你的 用户名。唤醒参数展开,揭示 USER 中的内容,可以这样做:
命令替换
命令替换允许我们把一个命令的输出作为一个展开模式来使用:
Linux
我们已经知道 shell 有许多方式可以完成展开,现在是时候学习怎样来控制展开了。 以下面例子来说明:
在第一个例子中,shell 从 echo 命令的参数列表中,删除多余的空格。
在第二个例子中, 参数展开把 $1 的值替换为一个空字符串,因为 1 是没有定义的变量。shell 提供了一种 叫做引用的机制,来有选择地禁止不需要的展开。
双引号
我们将要看一下引用的第一种类型,双引号。如果你把文本放在双引号中, shell 使用的特殊字符,除了 $,\ (反斜杠),和 `(倒引号)之外, 则失去它们的特殊含义,被当作普通字符来看待。这意味着单词分割,路径名展开, 波浪线展开,和花括号展开都被禁止,然而参数展开,算术展开,和命令替换 仍然执行。使用双引号,我们可以处理包含空格的文件名。
记住,在双引号中,参数展开,算术表达式展开,和命令替换仍然有效:
单引号
如果需要禁止所有的展开,使用单引号
转义字符
有时候我们只想引用单个字符。我们可以在字符之前加上一个反斜杠,在这个上下文中叫做转义字符。经常在双引号中使用转义字符,来有选择地阻止展开。
注意在单引号中,反斜杠失去它的特殊含义,它 被看作普通字符。
反斜杠转义字符序列
反斜杠除了作为转义字符外,反斜杠也是一种表示法的一部分,这种表示法代表某种 特殊字符,叫做控制码。ASCII 编码表中前32个字符被用来把命令转输到像电报机 一样的设备。一些编码是众所周知的(制表符,退格符,换行符,和回车符),其它 一些编码就不熟悉了(空值,传输结束码,和确认)。
转义序列 | 含义 |
---|---|
\a | 响铃(”警告”-导致计算机嘟嘟响) |
\b | 退格符 |
\n | 新的一行。在类 Unix 系统中,产生换行。 |
\r | 回车符 |
\t | 制表符 |