所有 Linux 发行版默认的 shell 都是 bash shell
,在本文侧重于基础的 GNU bash shell 下面是其他几种流行的 shell
ash: 简单的轻量级 shell 完全兼容 bash shell
korn: 兼容 Bourne shell 的编程 shell
tcsh: 融入部分 C 语言特性
dash:
Debian Linux 发行版与其许多衍生产品 dash shell,它是 ash shell 的直系后裔,是 Unix 系统中 Bourne shell 的简易复制品
在许多基于 Debian 的 Linux 发行版中,dash shell 实际上并不是默认 shell
由于 dash 以简洁为目标,因此其使用的环境变量比 bash 明显要少,但 dash 环境中无法使用的 bash 特性
zsh:
结合 bash, korn, tcsh 的特性的高级 shell
对比 bash 另一个流行的 shell,它汲取了所有现存 shell 的设计理念,增加了许多独有的特性
是为程序员而设计的一款高级 shell
独有特性
到目前为止,zsh shell 是所有 shell 中可定制性最强的
可以轻松地执行数学函数
在图形化桌面出现之前,系统交互的唯一方式就是通过 shell 提供的 文本命令行界面 command line interface,CLI
控制台终端
shell CLI
,称作 Linux 控制台,因为它模拟的早期的硬接线控制台终端Ctrl+Alt
组合键再按一个功能键(F1~F7)来进入你要使用的虚拟控制台注意:在 Linux 虚拟控制台中是无法运行任何图形化程序的,尽管虚拟控制台只是一个文本模式的控制台终端,但你也可以修改文字和背景色
setterm --inversescreen on
作用是文字色和背景色交换,使用 setterm --inversescreen off
可以关闭setterm -background
将终端的背景色改为指定颜色 setterm -foreground
将终端的前景色改为指定颜色,参数: black, red, green, yellow, blue, magenta, cyan, white 共 8 种颜色setterm -reset
可以恢复默认设置图形化终端
虚拟控制台终端的另一种替代方案是使用 Linux 图形化桌面环境中的 终端仿真软件包,终端仿真软件包会在桌面图形化窗口中模拟控制台终端
一些流行的图形化终端仿真器软件包
常用的 GNOME Terminal, Konsole, xterm
GNU bash shell 是一个程序,提供了对 Linux 系统的交互式访问,系统启动的 shell 程序取决于用户账户的配置,在 /etc/passwd
文件包含了所有系统用户账户以及每个用户的基本配置信息
尽管 bash shell 会在登录时自行启动,但是否会出现 CLI 取决于所使用的登录方式
$
,不同的 Linux 发行版会采用不同格式的提示符,shell 提示符并非一成不变大多数 Linux 发行版自带在线手册,可用于查找 shell 命令以及其他 GNU 实用工具的相关信息,man
命令可以访问 Linux 系统的手册页。
在 man
命令之后跟上想要查看的命令名,就可以显示相应的手册页
man 命令名
当你使用 man 命令查看命令手册页的时候,其中的信息是由 分页程序 pager
来显示的
可以按 q 键 退出手册页
手册页将与命令相关的信息分成了多段,每一段的惯用名标准,另外有些命令使用的段名并没有在上面的惯用标准中列出
man 命令可以使用 关键字 来搜索手册页
man -k keyword
手册页中还有不同的节,每节都分配了一个数字,从 1~9 章节
# 阅读方法
man num intro # num 是每节的数字
Linux 系统手册页可能包含一些非标准的节编号
大多数命令接受 -h 或 --help 选项
了解如何在命令行中输入该命令
COMMAND-NAME [OPTION]... [ARGUMENT]...
查看文件内容
ps: 监测进程,默认只显示运行在当前终端中属于当前用户的那些进程
process ID,PID
Linux 系统中使用的 GNU ps 命令支持以下3种类型的命令行选项:
Unix 风格选项,选项前加单连字符
需要查看系统中运行的所有进程,可以使用 -ef
选项组合
-e
选项指定显示系统中运行的所有进程
-f
选项则扩充输出内容以显示一些有用的信息列
-l
选项之后多出的信息列
F: 内核分配给进程的系统标志
S: 进程的状态
PRI: 进程的优先级(数字越大,优先级越低)
NI: 谦让度,用于决定优先级
ADDR: 进程的内存地址
SZ: 进程被换出时所需交换空间的大致大小
WCHAN: 进程休眠的内核函数地址
BSD 风格选项,选项前不加连字符
在使用 BSD 风格的选项时,ps命令会自动改变输出以模仿 BSD 格式,上述很多输出列跟使用 Unix 风格选项时是一样的,但还是有一些不同之处
VSZ: 进程占用的虚拟内存大小(以 KB 为单位)
RSS: 进程在未被交换出时占用的物理内存大小
STAT: 代表当前进程状态的多字符状态码
进程状态码:第一个字符采用了与Unix风格的 S 输出列 相同的值表明进程是在休眠、运行还是等待,第二个字符进一步说明了进程的状态
GNU 长选项,选项前加双连字符
GNU 开发人员在经过改进的新ps命令中加入了另外一些选项,其中一些 GNU 长选项复制了现有的 Unix 或 BSD 风格选项的效果,而另外一些则提供了新功能
--forest
选项能够使用 ASCII 字符来绘制图表以显示进程的层级信息top: 可以实时显示进程信息
在top命令运行时键入可改变top的行为
f
允许你选择用于对输出进行排序的字段d
允许你修改 轮询间隔 polling interval
q
可以退出 top利用该工具,可以轻易找出占用系统大量资源的罪魁祸首
kill: 会向命令行中列出的所有 PID 发送 TERM 信号,TERM 信号会告诉进程终止运行
-s
选项支持指定其他信号要检查 kill 命令是否生效,可以再次执行 ps 命令或 top 命令,看看那些进程是否已经停止运行
pkill: 可以使用程序名代替 PID 来终止进程,允许使用通配符
注意:以 root 身份使用命令中的通配符很容易意外地将系统的重要进程终止,这可能会导致文件系统损坏
mount: 用于挂载存储设备,默认情况下会输出当前系统已挂载的设备列表
命令提供了4部分信息:
手动挂载设备的基本命令:
mount -t type device directory
type: 磁盘格式化所使用的文件系统类型
与 Windows PC
共用移动存储设备,通常需要使用下列文件系统类型
大多数 U 盘会使用 vfat 文件系统 格式化,如果需要挂载数据 CD 或 DVD,则必须使用 iso9660 文件系统 类型
device: 该存储设备的设备文件位置
directory: 挂载点在虚拟目录中的位置
注意:存储设备被挂载到虚拟目录,root 用户就拥有了对该设备的所有访问权限,而其他用户的访问则会被限制
umount: 移除可移动设备时,不能直接将设备拔下,应该先卸载
命令的格式:
umount [device | directory]
支持通过 设备文件 或者 挂载点 来指定要卸载的设备,如果有任何程序正在使用设备上的文件,则系统将不允许卸载该设备
df: 查看所有已挂载磁盘的使用情况
du: 可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况
sort: 对数据进行排序
-t
选项指定字段分隔符-k
选项指定排序字段-n
选项将数字按值排序-M
选项将数字按月排序grep: 会在输入或指定文件中逐行搜索匹配指定模式的文本
gzip: 用于压缩文件
gzcat: 用于查看压缩过的文本文件的内容
gunzip: 用于解压文件
useradd: 向 Linux 系统添加新用户
sudo
命令运行userdel: 从系统中删除用户
-r
选项,则userdel会删除用户的 $HOME 目录以及邮件目录,然而系统中仍可能存有已删除用户的其他文件修改用户
usermod: 提供了修改 /etc/passwd 文件中大部分字段的相关选项只需指定相应的选项即可,大部分选项与useradd命令的选项一样
passwd: 可以方便地修改用户密码,只有 root 用户才有权限修改别人的密码
chpasswd: 能从标准输入自动读取一系列以冒号分隔的登录名和密码对偶
chfn: 提供了在 /etc/passwd 文件的备注字段中保存信息的标准方法,会将用于 Unix 的 finger 命令的信息存入备注字段
finger: 可以非常方便地查看 Linux 系统的用户信息,安装该命令可能会使你的系统受到攻击漏洞的影响
chage: 命令可用于帮助管理用户账户的有效期
groupadd: 可用于创建新组
groupdel: 删除组
groupmod: 可以修改已有组
文件权限:
文件权限符号
组权限分别对应对象安全级别
umask: 用来设置新建文件和目录的默认权限
chmod: 可以修改文件和目录的安全设置,参数允许使用八进制模式或符号模式来进行安全设置
chown: 前者可以修改文件的属主,可以修改文件的所有符号链接文件的所属关系
命令的格式
chown options owner[.group] file
chgrp: 后者可以修改文件的默认属组
访问控制列表 ACL
getfacl: 能够查看分配给文件或目录的 ACL
setfacl: 能够设置分配给文件或目录的 ACL
-m
选项修改分配给文件或目录的权限-x
选项删除特定权限3 种格式定义规则
u[ser]:uid:perms
g[roup]:gid:perms
o[ther]::perms
fdisk: 可以在任何存储设备上创建和管理分区,但是只能处理最大 2TB 的硬盘
gdisk: 如果存储设备要采用 GUID 分区表 GUID partition table,GPT
,就要用到
GNU parted: 操作命令偏向词
将数据存储到分区之前,必须使用某种文件系统对其进行格式化,并非所有的文件系统工具都已经默认安装过,要想知道某个工具是否可用,可以使用 type 命令
为分区创建好文件系统之后,下一步是将其挂载到虚拟目录中的某个挂载点,以便在新分区中存储数据
/etc/fstab
文件中文件系统的检查与修复,每种文件系统各自都有相应的恢复命令
fsck: 可以检查和修复大部分Linux文件系统类型
LVM 管理
物理卷 PV
卷组 VG
vgscan: 扫描 VG
vgcreate: 会将 物理卷 PV
加入存储池,后者随后用于构建各种逻辑卷
VG
时,也会同时添加卷组的元数据vgdisplay: 显示 VG 信息
vgremove: 删除 VG
vgextend: 拓展 VG
vgreduce: 缩小 VG
逻辑卷 LV
lvscan: 扫描 LV
lvcreate: 逻辑卷 LV
由 VG 的 存储空间块 PE
组成
lvdisplay: 显示 LV 信息,也可以使用 lvs 命令和 lvscan 命令显示系统的 LV 信息
lvremove: 删除 LV
lvextend: 拓展 LV
lvreduce: 缩小 LV
要想了解所有的 LVM 命令,可以在命令行中输入 lvm help
基于 Debian 的系统
dpkg: 是基于 Debian 的软件包管理器的核心,用于在Linux系统中安装、更新、删除 DEB 包文件
APT 工具集
apt 仓库: 仓库位置保存在文件 /etc/apt/sources.list 中
基于 Red Hat 的系统
dnf 仓库:
snap: 管理 snap 格式的应用程序容器
flatpak: 管理 flatpak 格式应用程序容器
shell 类型
default interactive shell
也称 登录 shell login shell
,只要用户登录某个虚拟控制台终端或是在 GUI 中启动终端仿真器,该 shell 就会启动default system shell
,/bin/sh
用于那些需要在启动时使用的系统shell脚本$0
当前 shell 的名称
exit 可以退出 shell
用户登录某个 虚拟控制台终端 或在 GUI 中运行 终端仿真器 时所启动的默认的交互式 shell 之后,当 CLI 提示符处输入 bash 命令(或是其他 shell 程序名)时会创建新的 shell 程序,这是一个 子 shell
生成子进程时,只有部分父进程的环境被复制到了子环境中
bash 常用选项
-c string
: 从 string 中读取命令进行处理-i
: 启动一个交互性 shell-l
: 做为 login shell-r
: 启动一个受限 shell-s
: 从标准输入读取命令命令分组
()
圆括号进程列表,生成了一个子 shell 来执行这些命令{}
花括号进行命令分组并不会像进程列表那样创建子 shell$BASH_SUBSHELL
变量判断是否存在子 shell
子 shell 在 shell 脚本中经常用于 多进程处理
在 交互式 shell 中,一种高效的子 shell 用法是 后台模式
&
jobs
命令能够显示当前运行在后台模式中属于你的所有进程coproc: 创建协程同时做两件事:
外部命令(有时也称为文件系统命令)是存在于bash shell之外的程序
forking
内建命令无须使用子进程来执行
type
命令来判断某个命令是否为内建history: 跟踪你最近使用过的命令,是一个实用的内建命令,使用 !!
执行上一条命令
alias: 别名允许为常用命令及其参数创建另一个名称,从而将输入量减少到最低,另一个实用的shell内建命令
-p
可以查看当前可用的别名unalias: 删除别名
环境变量可以存储 shell 会话和工作环境的相关信息,允许在内存中存储数据以便 shell 中运行的程序或脚本能够轻松访问到这些数据
全局变量:全局环境变量对于 shell 会话和所有生成的子 shell 都是可见的
env
命令来查看全局变量,使用 printenv
命令显示个别环境变量的值局部变量:只对创建它的 shell 可见
set
命令可以显示特定进程的所有环境变量,既包括局部变量、全局变量引用某个环境变量时,必须在该变量名前加上美元符号 $
可以在 bash shell 中直接设置自己的变量
export
命令以及要导出的变量名(不加 $
符号)来实现 全局环境变量unset
命令能删除已有的环境变量环境变量的另一个特性是可以作为数组使用
unset
命令可以删除数组中的某个值,后跟上数组名来删除整个数组默认的 shell 环境变量
当你登录 Linux 系统启动 bash shell 时,默认情况下 bash 会在几个文件中查找命令。这些文件称作 启动文件 或 环境文件
登录 shell 通常会从 5 个不同的启动文件中读取命令
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
$HOME
目录下的启动文件:提供用户专属的启动文件来定义该用户所用到的环境变量,Linux 发行版在环境文件方面存在的差异非常大,有些用户可能只有一个 $HOME/.bash_profile 文件,顺序 $HOME/.bash_profile -> $HOME/.bash_login -> $HOME/.profile 在 $HOME/.bashrc 文件通常通过其他文件运行
作为交互式 shell 启动的 bash 并不处理 /etc/profile 文件,只检查用户 $HOME 目录中的 .bashrc 文件
非交互式 shell,系统执行shell脚本时用的就是这种 shell
BASH_ENV
环境变量:当shell启动一个 非交互式 shell 进程时,会检查这个环境变量以查看要执行的启动文件名,如果有指定的文件则 shell 会执行该文件里的命令,这通常包括 shell 脚本变量设置有些 Linux 发行版使用了 可拆卸式认证模块 pluggable authentication module,PAM
,这种情况下 PAM 文件会在 bash shell 启动之前被处理,前者中可能会包含环境变量
/etc/environment
$HOME/.pam_environment
环境变量持久化
/etc/profile.d
目录中创建一个以 .sh 结尾的文件$HOME/.bashrc
文件,但如果设置了 BASH_ENV 变量除非值为 $HOME/.bashrc
,否则应该将 非交互式 shell 的用户变量放在别的地方使用多个命令,彼此用 分号 隔开
创建 shell 脚本文件
创建 shell 脚本文件时,必须在文件的第一行指定要使用的 shell
#!/bin/bash
基本是 #!
加 shell 绝对路径
注释使用 #
使用分号将两个命令放在一行中,但在shell脚本中,可以将命令放在独立的行中
使用 shell 脚本:需要 可执行权限 和 下面查找命令规则之一
echo: 输出会显示在脚本所运行的控制台显示器,可用单引号或双引号来划定字符串
变量使用
$
来引用这些环境变量${variable}
形式引用的变量,花括号 通常用于帮助界定 $ 后的变量名命令替换
可以从命令输出中提取信息并将其赋给变量
两种方法可以将命令输出赋给变量
$()
命令替换允许将 shell 命令的输出赋给变量
命令替换会创建出子 shell 来运行指定命令,这是由运行脚本的 shell 所生成的一个独立的 shell,在子 shell 中运行的命令无法使用脚本中的变量
输出重定向 >
>>
输入重定向 <
<<
,这种方法无须使用文件进行重定向,只需在命令行中指定用于输入重定向的数据即可<<
符号,必须指定一个 文本标记 来划分输入数据的起止管道 |
执行数学运算
expr: 最初,Bourne shell 提供了一个专门用于处理数学表达式的命令
使用方括号
$
和 方括号使用内建的 bash 计算器 bc
变量 $?
来保存最后一个已执行命令的退出状态码
if-then-elif-then-else
if command1
then
commands
elif command2
then
commands
else
commands
fi
if 或 elif 根据命令的退出状态码判断 then 中的命令是否执行
then 与 if, elif 是配套
fi 为闭合开始的 if
elif 和 else 为可选
test: 测试命令,目的是更好的进行条件判断
如果 test 命令中列出的条件成立,那么 test 命令就会退出并返回退出状态码 0
如果条件不成立,那么 test 命令就会退出并返回非 0 的退出状态码
test condition
condition 要测试的一系列参数和值
condition 部分没有会以非 0 的退出状态码
bash shell 提供了另一种条件测试方式,可以使用 中括号 替代 test,第一个方括号之后和第二个方括号之前 必须留有空格
test命令和测试条件可以判断 3 类条件:
数值比较
使用 -eq, -ge, -gt, -le, -lt, -ne 替代数学中的比较运算符 ==, >=, >, <=, <, != 下面是记忆
字符串比较
=
比较字符串是否相同
!=
比较字符串是否相同
<
, >
比较两个字符串大小,使用时必须转义
-n
判断字符串长度是否不为 0
-z
判断字符串长度是否为 0
文件比较
复合条件测试
bash shell 在 if 语句中的高级特性
在子 shell 中执行命令的单括号
用于数学表达式的双括号
用于高级字符串处理功能的双方括号
case: 比较变量寻找特定的值
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) commands3;;
esac
for: 循环处理
for var in list
do
commands
done
list 是迭代列表,每次迭代中变量 var 会包含列表中的当前值
list 中值之间是以 空格 分隔的
-环境变量 内部字段分隔符 IFS
可以关闭分隔规则
变量包含了用于迭代的值列表可以用于迭代列表,值列表中能追加或者拼接
do-done 中为循环体
最后一次迭代结束后,变量 var 的值在 shell 脚本的剩余部分依然有效
list 中复杂的数据处理
从命令中读取值列表
使用通配符读取目录
支持仿 C 语言风格的 for 命令,但注意是使用 (())
而不是 C 语言的 ()
,有些地方与bash shell 标准的 for 命令并不一致
因此,在脚本中使用仿 C 语言的 for 循环时要小心
while: 某种程度上糅合了 if 语句和 for 循环
该命令返回的退出状态码为0,就循环执行一组命令
while test command
do
commands
done
until: 与 while 命令工作的方式完全相反,注意测试部分是反的即可
循环控制
处理循环的输出
传递参数: 向 shell 脚本传递数据的最基本方法是使用命令行参数,命令行参数允许运行脚本时在命令行中添加数据
参数之间是以空格分隔的
bash shell 会将所有的命令行参数都指派给 位置变量
在使用位置变量之前一定要检查是否为空
特殊参数变量
$#
含有脚本运行时携带的命令行参数的个数${$#}
应该就代表了最后一个位置变量,不能在花括号内使用 $
,必须将 $
换成 !
$*
变量会将所有的命令行参数视为一个单词,变量会将这些参数视为一个整体$@
变量会将所有的命令行参数视为同一字符串中的多个独立的单词,以便你能遍历并处理全部参数$$
当前 PIDshift: 移动参数
处理选项
--
,shell 会用双连字符表明选项部分结束getopt: 能够识别命令行参数,简化解析过程,将命令行中选项和参数处理后只生成一个输出
getopt optstring parameters
optstring:
parameters: 参数列表
set: 有一个选项是 双连字符 --
,可以将 位置变量 的值替换成 set 命令所指定的值
set -- $(getopt optstring "$@")
getopts: 是 bash shell 的内建命令,比 getopt 多了一些扩展功能,能够和已有的 shell 位置变量配合默契
getopts [:]optstring variable
getopts 每次只处理一个检测到的命令行参数
在处理完所有的参数后,getopts 会退出并返回一个大于 0 的退出状态码,适合用在解析命令行参数的循环中
:
为可选,类似 getopt 命令 -p 参数,有则不显示错误消息getopts 涉及两个环境变量
OPTARG
环境变量保存带参选项的参数值OPTIND
环境变量保存着参数列表中正在处理的参数位置getopts 命令会移除起始的 连字符,所以在 case 语句中不用连字符
可以在参数值中加入空格判断引号界限,能将选项字母和参数值写在一起,在两者之间不加空格
还可以将在命令行中找到的所有 未定义的选项 统一输出成 问号
知道何时停止处理选项,并将参数留给你处理,处理每个选项时,getopts 会将 OPTIND 环境变量值增 1,可以使用 shift 命令和 OPTIND 值来移动参数
获取用户输入
read: 从标准输入或另一个文件描述符中接受输入
获取输入后,read 命令会将数据存入变量
如果指定多个变量,则输入的每个数据值都会分配给变量列表中的下一个变量
如果变量数量不够,那么剩下的数据就全部分配给最后一个变量
不指定任何变量,这会将接收到的 所有数据 都放进特殊环境变量 REPLY
-p
选项,允许直接指定提示符
-t
选项,指定一个计时器判断是否输入超时,单位秒
-n
选项,统计输入的字符数,当字符数达到预设值时,就自动退出
-s
选项,避免在输入的数据出现在屏幕上
读取文件
标准文件描述符:Linux 系统会将每个对象当作文件来处理,这包括输入和输出
文件描述符是一个非负整数,唯一会标识的是会话中打开的文件
每个进程一次最多可以打开 9 个文件描述符
在默认情况下,STDERR 和 STDOUT 指向同一个地方
STDERR 并不会随着 STDOUT 的重定向发生改变
可以将 文件描述符 索引值放在重定向符号之前,只重定向对应信息,两者必须紧挨着
1>
输出重定向标准输出2>
输出重定向错误消息bash shell 提供特殊的重定向符 &>
将 STDERR 和 STDOUT 的输出重定向
在脚本中重定向输出
临时重定向 &
&
永久重定向 exec
替代性文件描述符
关闭文件描述符
&-
lsof: 会列出整个 Linux 系统打开的所有文件描述符
抑制命令输出
/dev/null
使用临时文件
Linux 系统有一个专供临时文件使用的 特殊目录 /tmp
大多数 Linux 发行版配置系统在启动时会自动删除 /tmp 目录的所有文件
系统中的任何用户都有权限读写 /tmp 目录中的文件
mktemp: 专门用于创建临时文件
-t
选项会强制在系统的临时目录中创建文件,返回所创建的临时文件的完整路径名-d
选项会创建一个临时目录记录消息
tee
就像是连接管道的 T 型接头,它能将来自 STDIN 的数据同时送往两处
默认情况下,会在每次使用时覆盖指定文件的原先内容
-a
选项: 将数据追加到指定文件中
处理信号
Linux 系统和应用程序可以产生超过 30 个信号,信号与值在不同版本可能会存在差异,可以通过 kill
的 -l
选项查看
bash shell 会忽略收到的任何 SIGQUIT 信号和 SIGTERM 信号,保障交互式 shell 不会被意外终止
bash shell 会处理收到的所有 SIGHUP 信号和 SIGINT 信号
产生信号: bash shell 允许使用键盘上的组合键来生成两种基本的 Linux 信号
Ctrl+C 组合键会生成 SIGINT 信号
Ctrl+Z 组合键会生成 SIGTSTP 信号
捕获信号
trap
命令可以指定 shell 脚本需要侦测并拦截的 Linux 信号
trap commands signals
commands 部分列出想要与信号绑定的行为,如果是 --
会恢复信号的默认行为
signals 部分列出想要捕获的信号,多个信号之间以空格分隔,可以使用信号的值或信号名
为了保证脚本中的关键操作不被打断,请使用带有空操作命令的 trap 以及要捕获的信号列表
要捕获 shell 脚本的退出,只需在 trap 命令后加上 EXIT 信号,提前退出脚本依然能捕获
后台模式运行
&
在非控制台下运行脚本
即便退出了终端会话,也在终端会话让脚本一直以后台模式运行到结束
nohup: 能阻断发给特定进程的 SIGHUP 信号,当退出终端会话时可以避免进程退出
nohup.out
的文件中作业控制: 包括启动、停止、终止、恢复
jobs: 作业控制命令
命令输出中的加号和减号
-l
选项: 查看作业的 PID
删除已停止的作业,那么使用 kill 命令向其 PID 发送 SIGKILL 信号即可
bg: 以后台模式重启作业,存在多个作业需要在后加上作业号
fg: 以前台模式重启作业
调整谦让度
调度优先级是指内核为进程分配的 CPU 时间
shell 启动的所有进程的调度优先级默认都是相同的
调度优先级是一个整数值,取值范围从-20(最高优先级)到+19(最低优先级)
在默认情况下,bash shell 以优先级 0 来启动所有进程
nice: 允许在启动命令时设置其调度优先级
renice: 指定已运行进程的 PID 来改变其优先级
at: 允许指定Linux系统何时运行脚本
at 的守护进程 atd 在后台运行,在作业队列中检查待运行的作业
atd 守护进程会检查系统的一个特殊目录,通常位于 /var/spool/at 或 /var/spool/cron/atjobs
默认情况下,atd 守护进程每隔 60 秒检查一次这个目录
在默认情况下,命令会将 STDIN 的输入放入队列
-f
选项: 指定用于从中读取命令
命令能识别多种时间格式,具体参见 /usr/share/doc/at/timespec 文件
使用命令时,该作业会被提交至 作业队列,针对不同优先级有 52 种作业队列
-q
选项: 指定其他的队列
任何送往 STDOUT 或 STDERR 的输出都会通过 邮件系统 传给该用户,最好在脚本中进行重定向
-M
选项: 以禁止作业产生的输出信息
atq: 可以查看系统中有哪些作业在等待
atrm: 删除等待中的作业,指定要删除的作业号即可
cron: 程序调度需要定期执行的作业,相比 at 具有周期性
minutepasthour hourofday dayofmonth month dayofweek command
anacron: 弥补 Linux 系统处于关闭状态时,cron 程序不会再去运行那些错过的作业
anacron 时间表的基本格式: period delay identifier command
启动 shell 时运行脚本
应该将需要在登录时运行的脚本放在 $HOME/.bash_profile
如果需要某个脚本在两个时刻都运行可以将其放入 .bashrc
source: 这是另一种运行 bash 脚本的方法,称为 源引
bash shell 提供的用户自定义函数功能
创建函数
使用关键字 function
function name{
commands
}
bash shell 脚本中定义函数的方式创建函数
name(){
commands
}
调用函数
只需像其他 shell 命令一样写出函数名
函数可以视为一个小型脚本,运行结束时会返回一个退出状态码
函数的退出状态码是函数中最后一个命令返回的退出状态码
$?
可以确定函数的退出状态码,提取函数返回值之前执行了其他命令,那么函数的返回值会丢失
return: 以特定的退出状态码退出函数
可以将命令的输出保存到 shell 变量中一样,也可以将函数的 STDOUT 输出保存到 shell 变量中
函数可以使用 标准的位置变量 来表示在命令行中传给函数的任何参数
$0
变量保存函数名
函数参数依次保存在 $1
, $2
等变量中
$#
可以确定传给函数的参数数量
要在函数中使用脚本的命令行参数,必须在调用函数时手动将其传入
向函数传递数组
变量的作用域
全局变量
局部变量
local
关键字即可,保证了变量仅在该函数中有效,可以轻松地将函数变量和脚本变量分离开函数递归
创建库
.
sed 编辑器
被称作 流编辑器,根据事先设计好的一组规则编辑数据流
可以执行下列操作
在流编辑器匹配并针对一行数据执行所有命令之后,会重复这个过程直到处理完数据流后结束运行
命令的格式
sed options script file
options
-e
选项额外 sed 命令,执行多个命令
-f
选项在单独的文件中指定 sed 命令,目的是大量要执行时使用
.sed
作为 sed 脚本文件的扩展名,便于识别-n
选项会抑制 sed 编辑器的输出
script: 指定了应用于流数据中的单个命令
默认情况下,会将指定的命令应用于 STDIN 输入流中,可以直接将数据通过管道传入
sed 命令
替换命令 s: [address]s/替换目标/替换内容/flags
替换标识
/
不是绝对的行寻址 address
数字模式
n
: 表示特定行,$ 标识符表示最后一行n,m
: 表示 n 行到 m 行的范围正则表达式模式
/pattern/command
: pattern 匹配表达式可以对特定地址的多个命令分组
address {
sed commands
}
删除命令 d: 后面通常不接任何
[address]d
插入命令 i: 会在指定行前增加一行,每行新文本末尾使用反斜线 \
[address]i\
strings\
...\
strings
附加命令 a: 会在指定行后增加一行,每行新文本末尾使用反斜线 \
[address]a\
strings\
...\
strings
取代命令 c: 修改行,将范围内取代内容,它跟插入和附加命令的工作机制一样
[address]c\
strings\
...\
strings
转换命令 y: 唯一可以处理单个字符,inchars 和 outchars 进行一对一的映射
[address]y/inchars/outchars
写入命令 w: 向文件写入行
[address]w filename
读取命令 w: 将一条独立文件中的数据插入数据流
[address]r filename
命令 F: 告知 sed 打印出当前正在处理的文件名
[address]F
所以命令相同部分 [address]command
打印
p
命令: 打印文本行=
命令: 打印行号l
命令: 可以打印数据流中的文本和不可打印字符,行尾的美元符号表示换行符,gawk 编辑器
相比 sed 增加了一种编程语言,而不仅仅是编辑器命令
命令的格式
gawk options program file
options
.gawk
为后缀program: gawk 脚本
file: 处理数据,没有会从 STDIN 接收数据
gawk 脚本用一对花括号来定义
特性之一是会自动为每一行的各个数据元素分配一个变量
BEGIN: 会强制 gawk 在读取数据前执行 BEGIN 关键字之后指定的脚本
END: 允许指定一段脚本在 gawk 处理完数据后执行这段脚本
特殊变量 FS: 这是定义字段分隔符的另一种方法
sed, gawk 职能
正则表达式是由正则表达式引擎实现的,最流行的是以下两种
特殊字符
BRE 基础 basic
\
转义字符
锚点字符
^
行首$
行尾.
可以匹配除换行符之外的任意单个字符
[]
字符组,如果字符组中的某个字符出现在了数据流中,那就能匹配该模式
[^]
排除型字符组,匹配字符组中没有的字符
0-9
a-z
A-Z
等范围化特殊的字符组 [[:BRE:]]
其中的 BRE 允许下列词
*
表明该字符必须在匹配模式的文本中出现 0~n 次
ERE 拓展 extended
?
表明前面的字符可以出现 0~1 次
+
表明前面的字符可以出现 1~n 次
{}
允许为正则表达式指定具体的可重复次数
{n}
恰好出现 n 次{n,m}
恰好出现 n~m 次|
以或运算进行匹配
()
表达式分组,每一组会被视为一个整体
创建文本菜单
传统思路
-e
选项,可以打印非可打印字符select: 能够帮助我们自动完成这些工作
select variable in list
do
commands
done
创建文本窗口部件
dialog 软件包: 能够用 ANSI 转义控制字符,在文本环境中创建标准的窗口对话框
使用命令行选项来决定生成哪种窗口部件
要在命令行中指定某个特定部件,需要使用双连字符格式
每个dialog部件都提供了两种输出形式
图形化窗口部件
手机扫一扫
移动阅读更方便
你可能感兴趣的文章