Linux Bash Course by GPS

code

Linux Bash Course by GPS

参考

基础概念

  • 何为 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 命令的语法格式如下

bash
# command 是命令
# options 是一些参数,也称为 flags,用于配置命令
# arguments 是命令所接受的变量值,例如目录路径、文件名称等
command [options] [arguments]

例如以下命令 ls 查询特点目录中包含的内容

bash
# ls 是列出内容的命令
# -a 是参数,表示列出的内容中包括隐藏的文件/目录
# /etc 是要查看的目录
ls -a /etc
# 还可以使用多种参数
# -l 表示以列表的形式列出,查看更详细的信息
ls -a -l /etc
帮助

通过命令 man 来查询本机的帮助手册,例如查看命令 mkdir 的帮助页面

bash
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 重定向可以让上一个命令的结果(输出的内容)保存到文件,或作为下一个命令的输入

常见的重定向符:

  • < 输入重定向,将指定内容作为输入源(而不是一般的以键盘作为输入)
  • > 输出重定向,将命令的运行结果输出到指定的地方(而不是一般的以控制台/屏幕作为输出地方)
  • >> 输出重定向,但是以追加的形式(而不是覆写的形式)
  • | 管道操作符,在该符号前面的命令,其输出作为该符号后面的命令的输入
bash
# 将 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 其相应的描述符依次为 012

所以采用以下方法将标准错误信息重定向输出到文件

bash
# 如果执行该命令时遇到错误(因为该目录不存在)
# 就将错误信息输出到名为 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 对结构进行筛选过滤,只显示出包含关键字的内容

bash
# 寻找包含关键字 daemon 的线程
ps -ef | grep daemon
提示

命令 grep 是单词 global regular expression 的缩写,在 Bash 中经常使用,用于匹配筛选文本内容,并输出符合条件的那一行内容

以下是命令 grep 的一些常用参数:

  • -i 大小写敏感的匹配
  • -v 反转匹配结果,将不匹配的内容输出

一些常用的正则表达式,以匹配特定的模式:

  • .* 匹配任何数量的字符(包括无)
  • .+ 匹配任何一个或多个字符
  • . 匹配一个字符
bash
# 通过命令 less 开启交互模式(逐行或搜索)查看前一个命令输出的内容
ls -l /usr/bin | less
bash
# 命令 tee 读取标准输入 stdin 作为标准输出 stdout 的同时,并拷贝一份写入文件
# 这个样例中命令 tee 将命令 ls 的输出内容写入 ls.txt 文件的同时,输出给下一个命令 grep
ls /usr/bin | tee ls.txt | grep zip

进程

查看进程

命令 ps 查看进程

bash
# 参数 e 查看所有进程
# 参数 f 对结果进行格式化便于阅读
# 通过管道操作,将查询结果传递给下一个命令
# 命令 grep 基于关键词对结果进行筛选,找出含有 python 关键词的进程
ps -ef | grep python

结束进程

命令 kill 结束进程

bash
# 列出所有的停止标志信号
kill -l
bash
# 以标志信号 9 即完全终止的方式结束进程
kill -9 PROCESS_ID

Copyright © 2024 Ben

Theme BlogiNote

Icons from Icônes