Linux 命令行与 shell 脚本编程大全 3.基本的bash shell命令#yyds干货盘点#

Posted toplabs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 命令行与 shell 脚本编程大全 3.基本的bash shell命令#yyds干货盘点#相关的知识,希望对你有一定的参考价值。

@toc


3 基本的 bash shell 命令

    大多数 Linux 发行版的默认 shell 都是 GNU bash shell。本文将介绍 bash shell 的一些基本特性,例如 bash 手册、tab 键自动补全以及显示文件内容,带你逐步了解怎样用 bash shell 提供的基本命令来操作 Linux 文件和目录。

3.1 启动 shell

  1. GNU bash shell 能提供对 Linux 系统的交互式访问。登录时系统启动的 shell 依赖于用户账户的配置。
  2. /etc/passwd文件包含了所有系统用户账户列表以及每个用户的基本配置信息。
  3. 以下是从/etc/passwd文件中取出的样例条目:lzyws739307453:x:1000:1000::/home/lzyws739307453:/bin/bash
  4. 每个条目有七个字段,字段之间用冒号分隔。最后一个字段指定了用户使用的 shell 程序。

3.2 shell 提示符

  1. 默认 bash shell 提示符是美元符号($),这个符号表明 shell 在等待用户输入。shell 提示符并非一成不变。你可根据自己的需要改变它。
  2. 除了作为 shell 的入口,提示符还能够当前用户ID名和系统名。

3.3 bash 手册

  1. 大多数 Linux 发行版自带用以查找 shell 命令及其他 GNU 工具信息的在线手册。

3.3.1 man 命令查看手册

  1. man 命令用来访问存储在 Linux 系统上的手册页面。在想要查找的工具的名称前面输入 man 命令,就可以找到那个工具相应的手册条目。
  2. 当使用 man 命令查看命令手册页的时候,这些手册页是由分页程序(pager)来显示的。
  3. 分页程序是一种实用工具,能够逐页显示文本。可以通过点击空格键进行翻页,或是使用回车键逐行查看。另外还可以使用箭头键向前向后滚动手册页的内容(假设你用的终端仿真软件包支持箭头键功能)。
  4. q键可以退出当前手册,按Ctrl+C是无法退出手册的。
  5. 下图就是输入 man ls 之后得到的信息。

    3.3.2 man 手册的信息划分

  6. 手册页将与命令相关的信息分成了不同的节。每一节惯用的命名标准如表3-1所示。
  7. 并不是每一个命令的手册页都包含表3-1中列出的所有节。还有一些命令的节名并没有在上面的节名惯用标准中列出。
    ::: hljs-center

表3-1 Linux手册页惯用的节名

:::

描 述
Name 显示命令名和一段简短的描述
Synopsis 命令的语法
Confi guration 命令配置信息
Description 命令的一般性描述
Options 命令选项描述
Exit Status 命令的退出状态指示
Return Value 命令的返回值
Errors 命令的错误消息
Environment 描述所使用的环境变量
Files 命令用到的文件
Versions 命令的版本信息
Conforming To 命名所遵从的标准
Notes 其他有帮助的资料
Bugs 提供提交bug的途径
Example 展示命令的用法
Authors 命令开发人员的信息
Copyright 命令源代码的版权状况
See Also 与该命令类型的其他命令
  1. 除了对节按照惯例进行命名,手册页还有对应的内容区域。每个内容区域都分配了一个数字,从1开始,一直到9,如表3-2所示。
  2. man 工具通常提供的是命令所对应的最低编号的内容。
    ::: hljs-center

表3-2 Linux手册页的内容区域

:::

区 域 号 所涵盖的内容
1 可执行程序或 shell 命令
2 系统调用
3 库调用
4 特殊文件
5 文件格式与约定
6 游戏
7 概览、约定及杂项
8 超级用户和系统管理员命令
9 内核例程

3.4 浏览文件系统

  1. 当登录系统并获得 shell 命令提示符后,你通常位于自己的主目录中。

3.4.1 Linux 文件系统

  1. Linux 在路径名中不使用驱动器盘符。
  2. Linux 将文件存储在单个目录结构中,这个目录被称为虚拟目录(virtual directory)。虚拟目录将安装在 PC 上的所有存储设备的文件路径纳入单个目录结构中。
  3. Linux 虚拟目录结构只包含一个称为(root)目录的基础目录。根目录下的目录和文件会按照访问它们的目录路径一一列出,这点跟 Windows 类似。
  4. 路径本身并没有提供任何有关文件究竟存放在哪个物理磁盘上的信息。
  5. 在 Linux PC 上安装的第一块硬盘称为根驱动器。根驱动器包含了虚拟目录的核心,其他目录都是从那里开始构建的。
  6. Linux 会在根驱动器上创建一些特别的目录,我们称之为挂载点(mount point)。挂载点是虚拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,然而实际上它们却存储在另外一个驱动器中。
  7. 通常系统文件会存储在根驱动器中,而用户文件则存储在另一驱动器中。
  8. Linux 文件系统结构是从 Unix 文件结构演进过来的。在 Linux 文件系统中,通用的目录名用于表示一些常见的功能。表3-3列出了一些较常见的 Linux 顶层虚拟目录名及其内容。
  9. 常见的目录名均基于文件系统层级标准(filesystem hierarchy standard,FHS)。很多 Linux 发行版都遵循了 FHS。
    ::: hljs-center

表3-3 常见Linux目录名称

:::

目 录 用 途
/ 虚拟目录的根目录。通常不会在这里存储文件
/bin 二进制目录,存放许多用户级的 GNU工具
/boot 启动目录,存放启动文件
/dev 设备目录,Linux 在这里创建设备节点
/etc 系统配置文件目录
/home 主目录,Linux 在这里创建用户目录
/lib 库目录,存放系统和应用程序的库文件
/media 媒体目录,可移动媒体设备的常用挂载点
/mnt 挂载目录,另一个可移动媒体设备的常用挂载点
/opt 可选目录,常用于存放第三方软件包和数据文件
/proc 进程目录,存放现有硬件及当前进程的相关信息
/root root 用户的主目录
/sbin 系统二进制目录,存放许多 GNU 管理员级工具
/run 运行目录,存放系统运作时的运行时数据
/srv 服务目录,存放本地服务的相关文件
/sys 系统目录,存放系统硬件信息的相关文件
/tmp 临时目录,可以在该目录中创建和删除临时工作文件
/usr 用户二进制目录,大量用户级的 GNU 工具和数据文件都存储在这里
/var 可变目录,用以存放经常变化的文件,比如日志文件

3.4.2 遍历目录

  1. 在 Linux 文件系统上,可以使用切换目录命令cd将 shell 会话切换到另一个目录。
  2. cd 命令的格式非常简单:cd destination
  3. cd 命令可接受单个参数 destination,用以指定想切换到的目录名。如果没有为 cd 命令指定目标路径,它将切换到用户主目录。
  4. destination 参数可以用两种方式表示:一种是使用绝对文件路径,另一种是使用相对文件路径

3.4.2.1 绝对文件路径

  1. 绝对文件路径定义了在虚拟目录结构中该目录的确切位置,以虚拟目录的根目录开始,相当于目录的全名。
  2. 绝对文件路径总是以正斜线(/)作为起始,指明虚拟文件系统的根目录。
  3. 例如,如果要指向usr目录所包含的bin目录下的用户二进制文件,可以使用该绝对文件路径:/usr/bin
  4. 要用绝对文件路径来切换到文件系统中的某个特定位置,只需在 cd 命令后指定全路径名:
  5. pwd命令可以显示出shell会话的当前目录,这个目录被称为当前工作目录pwd命令
    的用法如下:

    3.4.2.2 相对文件路径

  6. 相对文件路径允许用户指定一个基于当前位置的目标文件路径。
  7. 假如你位于 home 目录中,并希望切换到 lzyws739307453 子目录,那你可以使用 cd
    命令加上一个相对文件路径:
  8. 可以在任何包含子目录的目录中使用相对路径来进行快速的目录跳转。
  9. 有两个特殊字符可用于相对文件路径中:
     单点符(.),表示当前目录
     双点符(..),表示当前目录的父目录
  10. 单点符号的添加看上去没有什么意义,但我认为这可以更清晰的表示是从当前目录向下级子目录跳转。
  11. 双点符号则是让相对路径跳转的功能更强大,可以实现从当前目录跳转到父级目录后再进入其它目录。
  12. 下图展现了使用相对路径时添加单点符和双点符后的效果。

    3.5 文件和目录列表

  13. 要想知道系统中有哪些文件,可以使用列表命令(ls)。

3.5.1 基本列表功能

  1. ls命令最基本的形式会显示当前目录下的文件和目录,如下图。ls命令输出的列表是按字母排序的(按列排序而不是按行排序)。

    3.5.1.1 使用 -F 区分文件和目录

  2. 如果用户用的是支持彩色的终端仿真器,ls 命令还可以用不同的颜色来区分不同类型的文件。
  3. 如果没安装彩色终端仿真器,可用带 -F 参数的 ls 命令轻松区分文件和目录。如下图:

    其中,“@”表示符号链接、“|”表示FIFOS、“/”表示目录、“=”表示套接字,“*”表示可执行文件。

3.5.1.2 使用 -a 显示隐藏文件

  1. Linux 经常采用隐藏文件来保存配置信息。
  2. 在 Linux 上,隐藏文件通常是文件名以点号开始的文件。这些文件并没有在默认的 ls 命令输出中显示出来,因此我们称其为隐藏文件
  3. 要把隐藏文件和普通文件及目录一起显示出来,就得用到-a参数,如下图。

    3.5.1.3 使用 -R 显示子目录

  4. -R参数是 ls 命令可用的另一个参数,叫作递归选项。它列出了当前目录下包含的子目录中
    的文件。如果目录很多,这个输出就会很长,所以不要在层级太高的目录中使用。
  5. 以下是 -R 参数输出的简单例子:

    3.5.1.4 使用合并参数简化操作

  6. 如果想在查看目录的同时区分文件和目录、显示隐藏文件、显示子目录,可以将参数直接拼接。
  7. 不用每个参数都添加短横杠来标记参数,可以直接使用一个短横杠来拼接所有想要使用的参数,如下图。

    3.5.2 显示长列表

  8. 在基本的输出列表中,要显示附加信息,需要加上常用的参数-l-l参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息,如下图。
  9. 输出的第一行显示了在目录中包含的总块数。在此之后,每一行都包含了关于文件(或目录)的下述信息:
     文件类型,比如目录(d)、文件(-)、字符型文件(c)或块设备(b)
     文件的权限
     文件的硬链接总数
     文件属主的用户名
     文件属组的组名
     文件的大小(默认以字节为单位)
     文件的上次修改时间
     文件名或目录名

3.5.3 过滤输出列表

  1. ls 命令还支持在命令行中定义过滤器。它会用过滤器来决定应该在输出中显示哪些文件或目录。
  2. 当用户指定特定文件的名称作为过滤器时,ls 命令只会显示该文件的信息。
  3. 这个过滤器就是一个进行简单文本匹配的字符串。可以在要用的命令行参数之后添加这个过滤器:
  4. 有时你可能不知道要找的那个文件的确切名称。ls 命令能够识别标准通配符,并在过滤器中用它们进行模式匹配:
     问号(?)代表一个字符,可用于过滤器字符串中替代任意位置的单个字符,例如$ ls -l te?t.txt
     星号()代表零个或多个字符,可用于过滤器字符串中匹配零个或多个字符,例如```$ ls -l t\\t.txt```。
  5. 在过滤器中使用星号和问号被称为文件扩展匹配(file globbing),指的是使用通配符进行模式匹配的过程。通配符正式的名称叫作元字符通配符(metacharacter wildcards)。
  6. 除了星号和问号之外,还有更多的元字符通配符可用于文件扩展匹配:
     中括号([])指定字符范围,中括号表示一个字符位置并给出多个可能的选择。可以将待选的字符列出来(例如$ ls -l te[ax].txt,表示可能出现的两种字符:a或x),也可以指定字符范围(例如$ ls -l te[a-x].txt,表示可能出现的a到x之间的所有字符)。
     感叹号(!)将不需要的内容排除在外,例如$ ls -l te[!a]t.txt查找第三个字符不是a的.txt文件。

3.6 处理文件

3.6.1 创建文件

  1. 使用touch fileName命令可以创建一个空文件,创建文件的同时,将当前执行命令的用户作为文件的属主,如下图。
  2. 用 touch 命令在相同目录创建同名文件可用来改变文件的修改时间。这个操作并不需要改变文件的内容。
  3. 如果只想改变访问时间,可用-a参数,如果只使用ls –l命令,默认显示的是修改时间。要想查看文件的访问时间,需要加入另外一个参数:--time=atime。如下图。

    3.6.2 复制文件

  4. cp命令可以将文件和目录从一个位置复制到另一个位置。
  5. 在最基本的用法里,cp命令需要两个参数——源对象和目标对象:cp source destination
  6. 当 source 和 destination 参数都是文件名时,cp命令将源文件复制成一个新文件,并且以 destination 命名。新文件就像全新的文件一样,有新的修改时间,如下图。
  7. 如果目标文件已经存在,cp命令可能并不会提醒这一点。最好是加上-i选项,强制 shell 询问是否需要覆盖已有文件。输入n则表明不覆盖,输入y表明覆盖。
  8. 如果要将原文件复制到其他目录,只需要在目标文件名之前带上目录名即可,目录名可以是相对路径或绝对路径,下图中是绝对路径,如下图。
    • 绝对路径:
    • 相对路径:
  9. 如果需要将一个带有很长的源对象名的文件复制到当前工作目录中时,单点符(.)能够简化该任务。
  10. cp命令的-R参数可以在一条命令中递归地复制整个目录的内容。在执行cp –R命令之前,目录 testDir2 并不存在。它是随着cp –R命令被创建的,整个 testDir1 目录中的内容都被复制到其中。
  11. 前文中在 ls 命令中使用的通配符,在 cp 命令中也可以使用。

3.6.3 制表键自动补全

  1. 在输入文件名或目录名时按一下制表键,可以让 shell 帮忙将其目录下唯一与当前输入内容的相匹配的名称补充完整。
  2. 如果在其目录下与当前输入内容的相匹配的名称并不是唯一的,按两下 Tab 制表键,则会在命令下方将这些待选项全部列出。

3.6.4 链接文件

  1. 如果在系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就称为链接
  2. 链接是目录中指向文件真实位置的占位符。在 Linux 中有两种不同类型的文件链接:
     符号链接
     硬链接

3.6.4.1 符号链接

  1. 符号链接就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。
  2. 两个通过符号链接在一起的文件,彼此的内容并不相同。
  3. 要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用ln命令以及-s选项来创建符号链接(ln -s sourceName targetName)。
  4. 注意,千万别创建软链接文件的软链接,这会形成混乱的链接链,不仅容易断裂,还会造成各种麻烦。

    3.6.4.2 硬链接

  5. 硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。
  6. 硬链接创建的文件从根本上而言是同一个文件,引用硬链接文件等同于引用了源文件。
  7. 要创建硬链接,原始文件必须事先存在,只不过这次使用ln命令时不再需要加入额外的参数了(ln sourceName targetName)。
  8. 只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。

3.6.5 重命名文件

  1. 在 Linux 中,重命名文件称为移动(moving)。mv命令可以将文件和目录移动到另一个位置或重新命名。
  2. 需要注意的是,对文件进行移动或重命名操作时,只会改变文件路径或名称,不会改变该文件的 inode 编号,这说明这个文件不论移动/重命名多少次,依旧是一开始的那个文件。
  3. 下面是重命名和移动文件的实例:
    • 重命名文件:
    • 移动并重命名文件:

      3.6.6 删除文件

  4. 在 Linux 中,删除(deleting)叫作移除(removing)。bash shell 中删除文件的命令是 rm。使用rm fileName可以直接删除文件。
  5. -i命令参数会提示你是不是要真的删除该文件。bash shell 中没有回收站或垃圾箱,文件一旦删除,就无法再找回。
  6. 可以使用通配符删除成组的文件。
  7. 如果要删除很多文件且不受提示符的打扰,可以用-f参数强制删除。

3.7 处理目录

  1. 在 Linux 中,有些命令(比如 cp 命令)对文件和目录都有效,而有些只对目录有效。创建新目录就是这种的一个特殊命令。

3.7.1 创建目录

  1. 在 Linux 中创建目录很简单,用mkdir命令即可,系统创建了一个名为New_Dir的新目录。新目录长列表是以 d 开头的,这表示 New_Dir 并不是文件,而是一个目录。
  2. 要想同时创建多个目录和子目录,需要加入-p参数:

    3.7.2 删除目录

    3.7.2.1 rmdir 删除空目录

  3. 默认情况下,rmdir命令只删除空目录。要删除目录,得先把目录中的文件删掉,然后才能在空目录上使用rmdir命令。

    3.7.2.2 rm -r 删除多级目录

  4. 要删除非空目录需要使用rm命令。使用-r选项使得命令可以向下进入目录,删除其中
    的文件或目录,然后再删除目录本身。

    3.7.2.3 rm -rf 强制删除目录

  5. 一口气删除目录及其所有内容的终极大法就是使用带有-r参数和-f参数的rm命令。
  6. rm -rf命令既没有警告信息,也没有声音提示,所以这肯定是一个危险的工具,尤其是在拥有超级用户权限的时候。

    3.8 查看文件内容

    3.8.1 查看文件类型

  7. file命令是一个随手可得的便捷工具。它能够探测文件的内部,并决定文件是什么类型的:
  8. file命令查看文件链接类型,能够告诉你它链接到了哪个文件上:
  9. 对于二进制可执行程序,file命令能够确定该程序编译时所面向的平台以及需要何种类型的库。如果你有从未知源处获得的二进制文件,这会是个非常有用的特性。

3.8.2 查看整个文件

3.8.2.1 cat 命令

  1. cat命令是一次性把文件的内容全部显示出来,如果文件内容过多,不推荐使用该命令。
  2. cat -n会给所有的行加上行号。
  3. cat -b只给有文本的行加上行号,过滤掉空行。
  4. cat -T不让制表符出现,-T参数会用^I字符组合去替换文中的所有制表符。

    3.8.2.2 more 命令

  5. 使用more fileName会按照分页的模式显示文件内容。more命令是分页工具,操作方式是标准的分页模式,空格键翻页,回车键逐行。浏览完之后,按q键退出。

    3.8.2.3 less 命令

  6. less命令的操作和more命令基本一样,一次显示一屏的文件文本。除了支持和more命令相同的命令集,它还包括更多的选项。
  7. 要想查看less命令所有的可用选项,可以输入man less浏览对应的手册页。也可以这样查看more命令选项的参考资料。

3.8.3 查看部分文件

3.8.3.1 tail 命令

  1. tail命令会显示文件最后几行的内容(文件的“尾部”)。默认情况下,它会显示文件的末尾 10 行。
  2. 可以向tail命令中加入-n参数来修改所显示的行数。在下面的例子中,通过加入-n 2使tail命令只显示文件的最后两行:
  3. 使用tail -f fileName可以持续监听文件末尾的内容,它允许你在其他进程使用该文件时查看文件的内容。tail命令会保持活动状态,并不断显示添加到文件中的内容。这是实时监测系统日志的绝妙方式。要停止监听操作,只需要按Ctrl+C即可。

3.8.3.2 head 命令

  1. head命令,顾名思义,会显示文件开头那些行的内容。默认情况下,它会显示文件前 10 行的文本:
  2. 类似于tail命令,它也支持-n参数,这样就可以指定想要显示的内容了。这两个命令都允许你在破折号后面输入想要显示的行数:

    3.9 小结

  3. 讨论了 bash shell,并介绍了怎样和 shell 交互。命令行界面(CLI)采用提示符来表明你可以输入命令。
  4. 讨论了 Linux 虚拟目录的基础知识,然后展示了 Linux 如何引用存储设备。
  5. cd命令在虚拟目录里切换目录。
  6. ls命令列出目录中的文件和子目录。ls命令有很多参数可用来定制输出内容。可以通过ls命令获得有关文件和目录的信息。
  7. touch命令可以创建空文件和变更已有文件的访问时间或修改时间。
  8. 使用cp命令将已有文件复制到其他位置。
  9. 使用ln命令链接文件,可以实现在两个位置上拥有同一个文件且不用生成单独的副本。
  10. mv命令重命名文件(在 Linux 中称为移动文件)。
  11. rm命令删除文件(在 Linux 中称为移除文件)。
  12. mkdirrmdir命令对目录执行创建和删除。
  13. catmoreless命令可以非常方便地查看文件全部内容。
  14. tailhead命令可查看文件中的一小部分内容。

以上是关于Linux 命令行与 shell 脚本编程大全 3.基本的bash shell命令#yyds干货盘点#的主要内容,如果未能解决你的问题,请参考以下文章

持续更新中Linux命令行与Shell脚本编程大全(第3版)读书笔记12-20章

Linux命令行与shell脚本编程大全.第3版(文字版) 超清文字-非扫描版 [免积分免登录]

《Linux命令行与Shell脚本编程大全(第3版)》读书笔记

免费Linux命令行与Shell脚本编程大全 第3版 PDF全本 21MB 百度网盘下载

更新完毕Linux命令行与Shell脚本编程大全(第3版)读书笔记21-26章

《Linux命令行与shell脚本编程大全》第十五章 呈现数据