第七章: 透过shell看世界

本章介绍的命令如下:

  • echo: 显示一行文本

7.1 扩展

每次输入命令行按下Enter键时, bash都会在执行命令之前对文本进行多重处理, 产生这个结果的处理过程称为扩展. 有了扩展功能, 在输入内容后这些内容将在shell对其执行之前被扩展成其他内容.

echo *

以上的命令不会输出 [*]号, 而是输出当前目录下的所有文件名. 因为shell会在执行命令之前对 [*] 字符进行扩展, 而这个字符意味着匹配文件名中的任意字符.

7.1.1 路径名扩展

使用通配符来实现扩展的机制称为路径名扩展.

echo D*
echo *s
echo [[:super:]]*
echo /usr/*/share

在文件名中以一个点号字符开头的文件都将被被隐藏, 路径名扩展也遵守这个规则. 在这种情况下, 使用以下命令进行路径名扩展:

ls -d .[!.]?*

7.1.2 波浪线扩展

如果波浪线用在一个单词的开头, 将被扩展为指定用户的主目录名, 如果没有指定用户名则扩展为当前用户的主目录. 这称为波浪线扩展.

7.1.3 算术扩展

shell支持通过扩展来运行算术表达式, 这允许我们把shell提示符当作计算器来使用.

echo $((2 + 2))

算术扩展使用如下格式,

$((expression))

其中, expression是指包含数值和算术操作符的算术表达式. 算术扩展只支持整数(全是数字, 没有小数), 支持的运算符如下:

运算符 描述
+
-
*
/ 整除
% 取余
** 次方

空格在算术表达式中是没有意义的, 而且表达式是可以嵌套的.

echo $(($((5**2)) * 3))           # 75
echo $(((5**2) * 3))              # 75

7.1.4 花括号扩展

利用花括号扩展, 我们可以按照花括号里面的模式创建多种文本字符串.

echo Front-{A,B,C}-Back
# Front-A-Back Front-B-Back Front-C-Back

用于花括号扩展的模式信息可以包含一个称为前导字符的开头部分和一个称为附言的结尾部分, 花括号表达式本身可以包含一系列逗号分割的字符串, 也可以包含一系列整数或者单个字符.

echo Number_{1..5}
# Number_1 Number_2 Number_3 Number_4 Number_5

echo {Z..A}
# Z Y X ... C B A

echo a{A{1,2},B{3,4}}b
# aA1b aA2b aB3b aB4b

花括号扩展最普遍的应用就是创建一系列的文件或者目录. 例如需要创建一系列以年月格式命名的目录.

mkdir Pics
cd Pics
mkdir {2009..2011}-0{1..9} {2009..2011}-{10..12}

7.1.5 参数扩展

参数扩展用在shell脚本中比用在命令行中更为有用, 可用于为小块数据(变量)进行扩展.

# 输出USER变量的内容
echo $USER

# 查看可用变量列表
printenv | less

7.1.6 命令替换

命令替换可以把一个命令的输出作为一个扩展模式使用.

# 输出ls命令的结果
echo $(ls)

# 输出cp命令的路径
ls -l $(which cp)

# 输出含有zip名字的文件类型
file $(ls /usr/bin/* | grep zip)

在早期的shell程序中还有命令替换的另一种语法格式, 即用反引号替代美元符号和括号.

ls -l `which cp`

7.2 引用

shell提供了一种称为引用的机制来有选择性的避免不想要的扩展.

# 不想要的扩展, shell会将$1扩展为变量, 因为未定义会称为空白
echo $100.00
# 00.00

7.2.1 双引号

第一种引用类型是双引号, 如果把文本放在双引号中则shell使用的所有特殊字符都将失去它们的特殊含义, 被看作普通字符. 字符 [$], [\]反斜杠, [`]反引号除外.

在这种情况下的单词分割, 路径名扩展, 波浪线扩展和花括号扩展都将失效, 但是参数扩展, 算术扩展和命令替换仍然生效.

默认情况下单词分割会先查找是否存在空格, 制表符以及换行(换行字符), 然后把它们作为单词间的界定符.

echo $(cal)      # 38个参数
echo "$(cal)"    # 一个参数

7.2.2 单引号

功能同双引号相似, 但是单引号可以抑制所有的扩展.

7.2.3 转义字符

如果只想要引用单个字符, 可以在该字符前加上反斜杠来实现.

echo \$100.00
echo "\$100.00"

转义字符也常用来消除文件名中某个字符的特殊含义, 如果要显示反斜杠, 可以通过使用两个反斜杠来实现. 在单引号中的反斜杠也将失去它的特殊含义, 而只是被作为一个普通字符.

一些控制码特殊字符也使用反斜杠转义实现, 如下表:

转义字符 含义
\a 响铃
\b 退格
\n 换行
\r 回车
\t 制表

在echo命令中可以带上 -e 选项或放在 [$''] 中, 就能够解释转义字符序列:

echo -e "Time's up\a"
echo "Time's up" $'\a'

7.3 扩展阅读

  • Bash 手册页有主要段落是关于展开和引用的, 它们以更正式的方式介绍了这些题目.

  • Bash 参考手册也包含章节, 介绍展开和引用:

http://www.gnu.org/software/bash/manual/bashref.html

results matching ""

    No results matching ""