
bash 基础特性
命令补全
shell 程序在接受到用户执行命令的请求,分析完成后,最左侧的字符串会被当做命令。
命令查找机制:
先查找内建命令,再根据 PATH 环境变量中设定的目录,自左而右逐个搜索目录下的文件名。给定的打头字符串如果能唯一标识某命令程序文件,则直接补全;如果不能,则再按 Tab 键一次,将给出命令程序列表。
路径补全
在给定的起始路径下,以对应路径下的打头字符串来逐一匹配起始路径下的每个文件。如果能唯一标识某目录或文件,则直接补全;如果不能,则再按 Tab 键一次,将给出文件列表。
命令行展开
~:自动展开为用户的家目录,或指定的用户的家目录。
{}:可承载一个以逗号分隔的路径列表,并且能够将其展开为多个路径。例如:/tmp/{a,b} 相当于 /tmp/a /tmp/b。
示例:
# 一条命令同时创建 4 个目录 /tmp/x/y1、/tmp/x/y2、/tmp/x/y1/a、/tmp/x/y1/b:
mkdir -p /tmp/x/{y1/{a,b}, y2}
# 一条命令同时创建 4 个目录 a_b、a_d、c_b、c_d:
mkdir {a, c}_{b, d}
命令的执行状态
命令的执行状态分为成功和失败,bash 通过返回值来输出这两个状态:
成功:0
失败:1 至 255
命令执行完成后,其状态返回值保存于 bash 的特殊变量 $? 中。
很多命令执行成功后,会返回其命令自身功能的返回值,根据功能不同,返回值各不相同,例如 ls 命令执行成功后,将返回列表数据。如下图:

如果需要引用命令的执行结果使用 $(COMMAND) 或 `COMMAND`
引用
bash 的引用分为以下 3 种:
强引用:
''弱引用:
""命令引用:
$(COMMAND)或`COMMAND`
可以看出,强引用和弱引用的用法和 PHP 是一样的,单引号不解析变量,双引号解析变量。
示例:
# 根据当前时间创建一个目录,格式为:时-分-秒(即 00-00-00)
mkdir `date +%H-%M-%S`
mkdir $(date +%H-%M-%S)
快捷键
Ctrl 键 + a 键:跳转至命令行首。
Ctrl 键 + e 键:跳转至命令行尾部。
Ctrl 键 + u 键:删除行首至光标所在处之间的所有字符(包含光标所在字符)。
Ctrl 键 + k 键:删除行尾至光标所在处之间的所有字符(包含光标所在字符)。
Ctrl 键 + l 键:清屏,相当于 clear 命令。
文本查看类命令
cat、tac、head、tail、more、less
more 命令
使用格式:more [options] file [...]
特点:翻屏至文件尾部后自动退出。
less 命令
man 命令查看手册时调用的就是 less 命令,所以使用此命令查看文本,和使用 man 命令查看手册时相关用法相同,在此不再作过多说明。
使用格式:less file
head 命令
主要用来查看一个文件的头部(前 N 行,默认是 10 行)。
使用格式:head [OPTION]... [FILE]...
options:
-n #:想要查看的行数,例如:head -n 20即可查看前 20 行。
-#:和-n一样,例如:head -20即可查看前 20 行。
tail 命令
主要用来查看一个文件的尾部(后 N 行,默认是 10 行)。
使用格式:tail [OPTION]... [FILE]...
options:
-n #:想要查看的行数,例如:tail -n 20即可查看前 20 行。
-#:和-n一样,例如:tail -20即可查看前 20 行。
-f:查看文件尾部内容结束后不会退出,而是跟随显示新增的行。
stat 命令
显示文件或文件系统的状态(display file or file system status)。
使用格式:stat [OPTION]... FILE...
效果如下图:

touch 命令
上图可以看到使用 stat 命令后会输出一些关于文件的元数据,其中包含 Access、Modify 和 Change 3 个时间戳。
顾名思义,Access 代表文件最后一次被访问的时间,Modify 代表文件内容最后一次被修改的时间,Change 代表文件元数据最后一次被修改的时间(也就是说 Access 和 Modify 任意一个被修改,Change 就会同时更新为最后一次被修改的时间)。
当然我们也可以主动更改前 2 个时间戳( Change 无法主动更改,系统会自动更新),使用 touch 命令即可。
格式:touch [OPTION]... FILE...
OPTION:
-c:该命令默认情况,文件路径不存在时会主动创建一个空文件,若使用-c选项则不会主动创建。
-a:该命令默认情况,会同时修改所有的时间戳,若使用-a选项则只修改 Access 时间戳。
-m:该命令默认情况,会同时修改所有的时间戳,若使用-m选项则只修改 Modify 时间戳
-t:该命令默认情况,会修改时间戳为当前时间,若使用-t选项则可以指定时间,格式为:
[[CC]YY]MMDDhhmm[.ss],例如修改error.log的Access 时间戳和Modify 时间戳为2019 年 6 月 16 日 0 时 0 分 0 秒:touch -t 1906160000.00 error.log