longjiang-uestc

Linux 命令行与shell 脚本编程大全

基本的 bash shell 命令

  • 如果养成了阅读手册的习惯,尤其是阅读第一段或是DESCRIPTION部分的前两段,最终你会学到各种
    技术行话,手册页也会变得越来越有用。

  • /etc/passwd文件包含了所有系统用户账户列表以及每个用户的基本配置信息。

  • man k termina 查找相关的命令.

  • man 的区域号:

    区域号 所覆盖的内容
    1 可执行程序或 shell 命令
    2 系统调用
    3 库调用
    4 特殊文件
    5 文件格式与约束
    6 游戏
    7 概览、约定及杂项
    8 超级用户和系统管理员命令
    9 内核例程
  • man工具通常提供的是命令所对应的最低编号的内容。

  • 大多数命令都可以接受-help或--help选项, 关于帮助的更多信息,可以输入help help。

  • Linux会在根驱动器上创建一些特别的目录,我们称之为挂载点(mount point)。挂载点是虚
    拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,然
    而实际上它们却存储在另外一个驱动器中。

  • 常见的 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 可变目录,用以存放经常变化的文件,比如日志文件
  • ls 的 -F 参数选项的作用: ls -F

    • Display a slash (\'/\') immediately after each pathname that is a directory, an asterisk (\'*\') after each that is executable, an at sign (\'@\') after each symbolic link, an equals sign (\'=\') after each socket, a percent sign (\'%\') after each whiteout, and a vertical bar (\'|\') after each that is a FIFO.
    • -R 参数是ls命令可用的另一个参数,叫作递归选项。
    • 文件类型,比如目录(d)、文件(-)、字符型文件(c)或块设备(b)。
  • 如果目标文件已经存在,cp命令可能并不会提醒这一点。最好是加上-i选项,强制shell询问是否需要覆盖已有文件。

  • 链接是目录中指向文件真实位置的占位符。在Linux中有两种不同类型的文件链接:

    • 符号连接(软连接): 符号链接就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。
      • 使用ln命令以及-s选项来创建符号链接。
      • 另一种证明链接文件是独立文件的方法是查看inode编号。文件或目录的inode编号是一个用于标识的唯一数字,这个数字由内核分配给文件系统中的每一个对象。
      • ls命令加入-i参数, 查看文件或目录的inode。
    • 硬链接: 硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。
      • 引用硬链接文件等同于引用了源文件, ln 默认是创建硬链接。
    • 千万别创建软链接文件的软链接。
  • 在Linux中,重命名文件称为移动(moving)。mv命令可以将文件和目录移动到另一个位置或重新命名。

  • rmdir命令只删除空目录.

  • file命令是一个随手可得的便捷工具。它能够探测文件的内部,并决定文件是什么类型。

  • cat -n 参数会给所有的行加上行号。

    • cat -b 只会给文本行加上行号。
    • cat -T 忽略制表符。
  • more命令只支持文本文件中的基本移动。如果要更多高级功能,可以试试less命令。

  • tail -n 2 log_file 查看最后两行。

  • 此head命令并像tail命令那样支持-f参数特性, 支持不断显示添加到文件中的内容。

更多的bash shell命令

  • Linux系统中使用的GNU ps命令支持3种不同类型的命令行参数:

    • Unix风格的参数,前面加单破折线;
    • BSD风格的参数,前面不加破折线;
    • GNU风格的长参数,前面加双破折线。
    • ps --forest参数。它会显示进程的层级信息
  • mount命令, 挂载命令,mount 显示已挂载的列表。

    • mount命令提供如下四部分信息:
      • 媒体的设备文件名.
      • 媒体挂载到虚拟目录的挂载点.
      • 文件系统类型.
      • 已挂载媒体的访问状态.
    • 手动挂载: mount -t type device directory
      • ro:以只读形式挂载。
      • rw:以读写形式挂载。
      • user:允许普通用户挂载文件系统。
      • check=none:挂载文件系统时不进行完整性校验。
      • loop:挂载一个文件。
  • 卸载设备的命令是umount, umount [directory | device ], umount命令支持通过设备文件或者是挂载点来指定要卸载的设备.

  • df命令可以让你很方便地查看所有已挂载磁盘的使用情况。

  • du命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。

    • -c:显示所有已列出文件总的大小。
    • -s:显示每个输出参数的总计。
  • sort命令会把数字当做字符来执行标准的字符排序, 如果按数字排序,则是 sort -n

    • sort用-M参数(sort -M),sort命令就能识别三字符的月份名,并相应地排序。
  • grep 搜索数据,grep [options] pattern [file]

    • 如果要进行反向搜索(输出不匹配该模式的行),可加-v参数。
    • 如果要显示匹配模式的行所在的行号,可加-n参数。
    • 如果只要知道有多少行含有匹配的模式,可用-c参数。
    • 如果要指定多个匹配模式,可用-e参数来指定每个模式。
      • 取并集。
    • grep命令用基本的Unix风格正则表达式来匹配模式。
  • 压缩数据:

    工 具 文件扩展名 描 述
    bzip2 .bz2 采用Burrows-Wheeler块排序文本压缩算法和霍夫曼编码
    compress .Z 最初的Unix文件压缩工具,已经快没人用了
    gzip .gz GNU压缩工具,用Lempel-Ziv编码
    zip .zip Windows上PKZIP工具的Unix实现
  • Unix和Linux上最广泛使用的归档工具是tar命令, tar命令最开始是用来将文件写到磁带设备上归档的,然而它也能把输出写到文件里.

    • tar function [options] object1 object2 ...

      功 能 长 名 称 描 述
      -A --concatenate 将一个已有tar归档文件追加到另一个已有tar归档文件
      -c --create 创建一个新的tar归档文件
      -d --diff 检查归档文件和文件系统的不同之处
      --delete 从已有tar归档文件中删除
      -r --append 追加文件到已有tar归档文件末尾
      -t --list 列出已有tar归档文件的内容
      -u --update 将比tar归档文件中已有的同名文件新的文件追加到该tar归档文件中
      -x --extract 从已有tar归档文件中提取文件
    • tar命令选项

      选 项 描 述
      -C dir 切换到指定目录
      -f file 输出结果到文件或设备file
      -j 将输出重定向给bzip2命令来压缩内容
      -p 保留所有文件权限
      -v 在处理文件时显示文件
      -z 将输出重定向给gzip命令来压缩内容

理解shell

  • 一个 shell 命令就是一个子进程。

  • 命令列表就是使用括号包围起来的一组命令,它能够创建出子shell来执行这些命令。

    • echo $BASH_SUBSHELL 查看子 shell 的个数。
  • jobs命令可以显示出当前运行在后台模式中的所有用户的进程(作业)。

  • 协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令。

    • 要进行协程处理,得使用coproc命令,还有要在子shell中执行的命令。
  • 外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中.

    • ps就是一个外部命令。你可以使用which和type命令找到它.
    • which ps
    • type -a ps
  • 内建命令和外部命令的区别在于前者不需要使用子进程来执行。它们已经和shell编译成了一体,作为shell工具的组成部分存在。不需要借助外部程序文件来运行。

    • type cd 来查看是否是内建命令。
  • history命令, 记录已经使用过的命令。

    • !! 会执行上一条 shell 命令。
  • iterm2 中 ctrl + r 可以进行搜素 使用过的命令。

  • env或printenv 查看全局变量。

    • printenv HOME
    • echo $HOME
  • set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。

  • 变量名、等号和值之间没有空格,这一点非常重要。如果在赋值表达式中加上了空格,bash shell就会把值当成一个单独的命令.

    • 应该为 my_variable="Hello World", 不应该为 my_variable = "Hello World"
  • 通过export命令来导入一个全局的变量,变量名前面不需要加$。

    • 子shell甚至无法使用export命令改变父shell中全局环境变量的值。
  • 可以用unset命令, 删除一个环境变量。

    • 一般 如果要用到变量,使用$;如果要操作变量,不使用$
  • PATH=$PATH:/home/christine/Scripts, 向 PATH 中添加新的环境变量。

  • 登录shell会从5个不同的启动文件里读取命令:

    • /etc/profile : 是系统上默认的bash shell的主启动文件, 系统上的每个用户登录时都会执行这个启动文件。
    • $HOME/.bash_profile
    • $HOME/.bashrc
    • $HOME/.bash_login
    • $HOME/.profile
    • 存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件
  • 数组变量:

    • mytest=(one two three four five), 声明一个数组。
    • echo ${mytest[*]}, 显示数组中所有的值。
    • unset mytest 删除整个数组

理解 Linux 文件权限

  • 用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。

  • 每个用户都有唯一的UID,但在登录系统时用的不是UID,而是登录名。

  • root用户账户是Linux系统的管理员,固定分配给它的UID是 0 。

  • Linux为系统账户预留了500以下的UID值, 普通用户创建账户时,大多数Linux系统会从500开始。

  • 用户密码加密后一般存在 /etc/shadow 文件中。

  • 添加新用户: /usr/sbin/useradd -D

    • useradd -m test, 添加用户
    • /usr/sbin/userdel -r test, 删除用户
    • usermod 修改用户账户的字段,还可以指定主要组以及附加组的所属关系
    • passwd 修改已有用户的密码
    • chpasswd 从文件中读取登录名密码对,并更新密码
    • chage 修改密码的过期日期
    • chfn 修改用户账户的备注信息
    • chsh 修改用户账户的默认登录shell
  • chmod 改变权限,chown 改变所属关系。

管理文件系统

  • fdisk工具用来帮助管理安装在系统上的任何存储设备上的分区。

  • Linux 逻辑卷管理器(logical volume manager,LVM)软件包 可以动态地添加存储空间。

  • 无需重建整个文件系统的情况下,轻松地管理磁盘空间。

    • 在逻辑卷管理的世界里,硬盘称作物理卷(physical volume,PV)。每个物理卷都会映射到硬盘上特定的物理分区。
    • 多个物理卷集中在一起可以形成一个卷组(volume group,VG)。
    • 是逻辑卷(logical volume,LV), 逻辑卷为Linux提供了创建文件系统的分区环境,作用类似于到目前为止我们一直在探讨的Linux中的物理硬盘分区
  • 条带化有助于提高硬盘的性能,因为Linux可以将一个文件的多个数据块同时写入多个硬盘,而无需等待单个硬盘移动读写磁头到多个不同位置。

  • LVM快照功能提供了一些安慰,你可以随时创建逻辑卷的备份副本,但对有些环境来说可能还不够。

  • LVM镜像: 是一个实时更新的逻辑卷的完整副本。

  • vim中复制命令是 y(代表yank)。

    • yw表示复制一个单词,y$表示复制到行尾
    • p命令 是粘贴。
    • ctr + r 是反撤销
    • vim 中, v 是 virtual 视角,可以选中一些字符和行。
    • 替换命令允许你快速用另一个单词来替换文本中的某个单词:

分类:

技术点:

相关文章: