Linux Bash Course by GPS
参考
- Linux Bash Course by GPS 介绍 Bash 的视频。是该系列文章所参考的教程 Learn to Cloud 的作者所制作,介绍一些有用的 Bash 命令
- Workshop 的 Github 仓库
- Bash 简介 由 Microsoft 推出的 Bash 教程
基础概念
- 何为 CLI:基于文本的用户交互界面/接口,一般通过该界面执行命令。
CLI 是单词 Common Line Interface 的缩写 - 何为 Shell:命令行解析器,执行用户输入的命令并输出运行的结果
如果输入的是 shell 的内置命令,则可以直接运行;如果输入的是软件特有的命令,则通过各软件所提供的 CLI 接口来解析并运行命令
有很多种 Unix shells,但是大部分都是参考自 Bourne Shell/bin/sh
- 何为终端:终端 terminal 是文本输入与输出环境,通过终端来调用 Shell
常见的终端:- iTerm2
- Guake
- Windows Terminal
- 何为 Bash:一个增强型的 Bourne Shell,全称为 Bourne Again Shell
- 何为 Shell Script:Shell 脚本是一个文本文档,包含一系列的 shell 命令
Bash 基础
提示
除了可以在本地安装 Linux 系统,还可以使用云服务器来练习,例如 shell.azure.com
Bash 全称是 Bourne Again Shell,一个增强型的 Bourne Shell,目前已经成为 Linux 各种发行版中的首选 Shell
Bash 命令的语法格式如下
# command 是命令
# options 是一些参数,也称为 flags,用于配置命令
# arguments 是命令所接受的变量值,例如目录路径、文件名称等
command [options] [arguments]
例如以下命令 ls
查询特点目录中包含的内容
# ls 是列出内容的命令
# -a 是参数,表示列出的内容中包括隐藏的文件/目录
# /etc 是要查看的目录
ls -a /etc
# 还可以使用多种参数
# -l 表示以列表的形式列出,查看更详细的信息
ls -a -l /etc
帮助
通过命令 man
来查询本机的帮助手册,例如查看命令 mkdir
的帮助页面
man mkdir
此外命令一般支持在后面添加参数 --help
来查看它的帮助文档
以下是一些常用的命令
ls
列出目录里的内容- 参数
-a
包含隐藏文件/目录 - 参数
-l
列出详细信息
- 参数
pwd
打印当前的工作目录cat
连接多个文件并作为标准输出,这是将文件内容打印到控制台的一种方法man
查看帮助手册cd
切换目录- 参数
..
切换到上一级目录 - 参数
~
切换到home
目录
提示
可以使用
man builtins
查看该命令的帮助文件- 参数
mkdir
创建一个目录。
如果带有参数-p
表示创建一个子目录bash# 在 folder 目录下创建一个名为 subfolder 的子目录 # 如果原本也没有 folder 目录,则会同时创建它 mkdir -p folder/subfolder
rmdir
删除空目录rm
删除文件。与通配符*
配合使用,表示删除所有文件。推荐
因为删除文件后无法恢复(并没有垃圾箱),所有推荐在每次使用该命令时,都设置参数
-i
。这样在执行命令时,终端会有警告提示,需要二次确认后(输入
y
后)才执行命令cp
复制文件(或目录)到指定的目录下。参数r
以递归的方式来复制,即复制目录时,会包含其中的子孙目录推荐
因为复制文件时,如果目录下有同名的文件会被覆盖,所以推荐每次使用该命令时,都设置参数
-i
。这样在执行命令时,终端会有警告提示,需要二次确认后(输入
y
后)才执行命令mv
(剪切)移动文件到指定的目录下ps
查看当前运行的进程sudo
临时获取 root 超级用户权限,以便运行一些普通用户权限受限的命令
通配符
通配符 Wildcards 是一类表示模式的符号(构成正则表达式),它们与 Bash 命令配合使用,可以让命令的适用性/通用性大大增强
*
表示 0 个或任意个的字符bash# 列出当前目录下所有的后缀(文件拓展名)为 .png 的文件 ls *.png # 列出当前目录下所有 .jpeg 或 .jpg 的图片 # 当然如果存在 .jpNg 的文件,也会列出来,但这个情况很少见 ls *.jp*g
?
表示 1 个字符bash# 列出当前目录下名称为 000X 形式的 .jpg 文件 ls 000?.jpg
[]
表示一组候选的字符bash# 列出当前目录下的后缀以 j 或 p 开头的文件 # 例如 *.jpg 或 *.png ls *.[jp]* # 通过连字符 - 可以表示匹配一个范围内的字符 # 以下命令表示列出当前目录下的以字母(a 至 z 中任意一个)开头的文件 ls [a-z]* # 以下命令就表示以大小写字母中任意一个作为开头的文件 ls [a-zA-Z]*
重定向
输入输出 I/O 重定向可以让上一个命令的结果(输出的内容)保存到文件,或作为下一个命令的输入
常见的重定向符:
<
输入重定向,将指定内容作为输入源(而不是一般的以键盘作为输入)>
输出重定向,将命令的运行结果输出到指定的地方(而不是一般的以控制台/屏幕作为输出地方)>>
输出重定向,但是以追加的形式(而不是覆写的形式)|
管道操作符,在该符号前面的命令,其输出作为该符号后面的命令的输入
# 将 sample.txt 文件作为命令 cat 的输入
cat < sample.txt
# 命令 ls 默认是将内容输出到屏幕上
# 称为标准输出 stardard output,简写为 stdout
# 这里使用符号 > 将标准输出重定向到一个名为 result.txt 的文件
# 即将命令 ls 的结果写入 result.txt 文件
ls -l /usr/bin > result.txt
注意
使用符号 >
将输出重定向写入文件时,采用覆写 overwrite 的方式,即文件的原内容会被清空。
如果希望采用追加 append 的方式写入,可以采用符号 >>
将输出重定向。
提示
对于输出的错误信息,也可以进行重定向,但需要指定目标文件的描述符 descriptor。
对于标准输出 stdout
、标准输出 stdin
、标准错误 stderr
其相应的描述符依次为 0
、1
、2
所以采用以下方法将标准错误信息重定向输出到文件
# 如果执行该命令时遇到错误(因为该目录不存在)
# 就将错误信息输出到名为 error.txt 的文件
ls -l /bin/usr 2> error.text
# 还可以将标准输出和标准错误信息,输出到同一个文件
# 前面的 > 是将标准输出重定向写入到 output.txt 文件
# 后面的 2>&1 是将标准错误信息作为标准输出,同样也就写入到 output.txt 文件中
ls -l /bin/usr > output.txt 2>&1
# 还有另一种更简单的方法,也是将标准输出和标准错误信息输出到同一个文件
ls -l /bin/usr &> output.txt
管道
管道 pipeline 是指通过 |
符号将一系列的命令串联在一起,将上一个命令的输出作为下一个命令的输入,在一个链式流程里依次执行完成一系列的操作。
最常见的操作是配合 grep
对结构进行筛选过滤,只显示出包含关键字的内容
# 寻找包含关键字 daemon 的线程
ps -ef | grep daemon
提示
命令 grep
是单词 global regular expression 的缩写,在 Bash 中经常使用,用于匹配筛选文本内容,并输出符合条件的那一行内容
以下是命令 grep
的一些常用参数:
-i
大小写敏感的匹配-v
反转匹配结果,将不匹配的内容输出
一些常用的正则表达式,以匹配特定的模式:
.*
匹配任何数量的字符(包括无).+
匹配任何一个或多个字符.
匹配一个字符
# 通过命令 less 开启交互模式(逐行或搜索)查看前一个命令输出的内容
ls -l /usr/bin | less
# 命令 tee 读取标准输入 stdin 作为标准输出 stdout 的同时,并拷贝一份写入文件
# 这个样例中命令 tee 将命令 ls 的输出内容写入 ls.txt 文件的同时,输出给下一个命令 grep
ls /usr/bin | tee ls.txt | grep zip