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:挂载一个文件。
- mount命令提供如下四部分信息:
-
卸载设备的命令是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 视角,可以选中一些字符和行。
- 替换命令允许你快速用另一个单词来替换文本中的某个单词: