Shell具有不同的风格,就像UNIX操作系统有不同的风格一样。每种不同风格都具有各自的命令喝功能,最常用的Shell包括Bourne Shell,、Bourne Again Shell、C Shell 、Korn Shell和Perl Shell等。
后面编程部分所设计的脚本语言,以Bourne Again Shell为例(Bash)。
Shell中支持使用通配符,常用的通配符如下所示。
一个
字符多个
字符)以及前导字符串和后继字符串作为匹配条件我们可以看一下案例来了解其具体用法
其实这里可能会比较混淆 [] 和 **{}**的用法。可以通过下面这个例子看出前面标出强调的一个和多个的区别
常用的输入输出重定向命令格式说明
命令行 | 说明 |
---|---|
命令 1 > 文件 1 | 将命令1的输出结果重定向到文件1 |
命令 1 &> 文件1 | 将命令1的输出结果和标准错误输出一起重定向到文件1 |
命令1 >> 文件 1 | 将命令1的输出结果追加到文件1中 |
命令 1 2> 文件1 | 将命令1的标准错误输出的结果重定向到文件1中 |
命令1 < 文件1 | 将文件1 作为命令1的标准输入 |
命令1 << 字符串1 | 允许连续输入数据,直到接收到字符1 |
为了理解上述表格中的命令,我们以 >>
作为案例
最后我们查看a.txt
中有两行数据为:
a.txt
a.txt
cat 命令
cat 命令用于连接文件并打印到标准输出设备上
cat 通常与IO重定向同时使用
实例
把txt1 的文档内容加上行号输入txt2这个文档中:
cat -n txt1 > txt2
把txt1 的文档内容加上行号(空白行不加编号)输入到txt2这个文档中:
cat -b txt1 >> txt2
清空txt1 的文档内容:
cat /dev/null > txt1
在Liunx系统中,管道的主要功能时将其他程序的输出结果直接导出到另一个程序来当成输入数据,管道的操作符是 |
。管道语法格式为:
命令1 | 命令2 | ……
注意: 管道操作符的左边一定是一条送往标准输出设备的命令,管道操作符的右边一定是一条从标准输入设备读入的命令。
实例
通过这个案例综合使用卡面提到的IO重定向以及liunx通配符的使用方法。
命令的执行顺序可分为顺序执行和有条件执行。顺序执行是指多个命令依次执行,前后的命令并无因果关系。而有条件执行是指命令的前后之间存在条件关系,只有满足一定条件才能执行或不被执行。
顺序执行
顺序执行多个命令是指在命令行一条一条地输入命令,命令之间用(;)分隔,且分号前后的命令无因果关系。例如:
这个例子中可以看到其中的三条命令依次被执行,并被输出。
这个其实就跟C语言里一行写多条命令差不多。
有条件执行
有条件执行分为 && 和 || ,区别如下:
有条件执行可以在很多高级语言中可以看到。感觉最常见的是在js中,通过有条件执行来避免执行指令失败时奔溃。
实例
这里我们简单实现一个sh可执行文件,见下例子:
简单说明:
这里我们首先通过
cat
命令创建一个a.sh文件,并且通过vi
查看文件中的内容。然后我们尝试执行该
sh
文件 ,发现由于文件权限问题无法执行成功。我们使用
chmod u+x ./a.sh
将文件的权限设成可读、可执行
若希望把文件名作为命令执行时,都必须具有执行权限。如果该文件时一个Shell脚本,用户尝试执行这个文件时,还需具备读权限。而在执行一个二进制可执行文件时,不需要读权限。
cal 命令用于显示日历,配合选项“-y”可以显示全年的年历。cal命令的语法格式如下所示:
cal [-1] [-3] [-s] [-m] [-j] [-y] [month] [year]
各个选项的说明表
选项 | 说明 |
---|---|
-1 | 显示单月份信息,默认设置 |
-3 | 显示前一月、当前以及下一月月历信息 |
-s | 显示输出时将星期日作为每周的第一天,默认设置 |
-m | 显示输出将星期一作为每周的第一天 |
-j | 显示距1月1日的天数,即从1月1日开始计算 |
-y | 显示整年日历 |
month | 月份 |
year | 年份 |
例如下图
注意:
/proc
目录下的文件并不是真正意义上的文件,关闭系统后,该目录中的文件不再存在。该目录通常用来帮助查看内核运行信息。
free
命令用于显示系统使用和空闲的内存情况,设计的内存包括物理内存、交换分区内存(swap)和内核缓冲区内存以及高速缓存。free
命令的参数列表如下:
选项 | 说明 |
---|---|
-b | 显示内存单位为字节 |
-k | 显示内存的单位为KB |
-m | 显示内存的单位为MB |
-g | 显示内存的单位为GB |
-o | 按旧格式进行显示,即不显示"-/ + buffers/cache"行 |
-t | 显示RAM以及swap的总和 |
-s delay | 每隔指定时间刷新一次命令,单位为秒 |
-c count | 设定刷新的次数 |
-V | 显示输出版本信息并退出该命令 |
例如
文件/proc/cpuinfo
中保存了处理器的相关信息,通过cat命令查看/proc/cpuinfo
,可以查询CPU的相关信息。例如下图,由于信息过长这里只显示最后的10行
文件/proc/modules
中保存了当前系统中被加载模块的相关信息。配合cat命令可以查看当前系统加载模块的情况。
proc
不是一个真实的文件系统,不占用外存空间,只是以文件的方式为访问Liunx内核数据提供接口。用户和应用程序可以通过查看/proc
目录中的相关文件得到系统的运行信息,并可以改变内核的某些参数。由于系统的信息总是动态变化的,所以用于或应用程序读取/proc
目录下的文件时获得的数据也是瞬时的。许多应用程序通过proc来访问Liunx内核信息。查看 /proc
目录如下。
其中,每个以数字命令的目录对应系统中运行的一个进程,该数字即为进程的PID号。数字目录中存放了该进程的运行信息,可以通过相应的命令进行查询。例如查询系统中运行的vi程序的相关信息。
注意:
在
/proc
目录中,可以通过查看cpuinfo
文件获得处理器的详细信息;通过interrupts
文件可以查看当前系统使用的中断号;通过uptime
文件可以查看系统运行的时间;通过filesystems
文件,可以查看当前文件系统支持的文件系统类型
modinfo
命令用来显示内核模块信息。 modinfo
命令会检测到与内核相关的模块文件,并显示检测的结果。其中,下表为参数选项说明:
选项 | 说明 |
---|---|
-a | 显示模块作者 |
-d | 显示模块描述信息 |
-l | 显示模块许可 |
-n | 显示模块文件名称 |
-p | 显示模块支持的参数信息 |
-V | 显示版本信息 |
-h | 显示帮助信息 |
使用这个命令时我们可以搭配前面的cat /proc/modules
先找到想要查看的模块信息,例如:
windows子系统下的Ubantu好像没有
/proc/modules
文件/etc/issue
中保存了当前系统的发行版本。配合使用 cat
命令可以显示输出版本信息。例如:
文件 | 说明 |
---|---|
cat /proc/version | 查看系统内核当前版本 |
cat /proc/partitions | 查看系统当前分区 |
cat /proc/interrupts | 显示中断信息 |
cat /proc/filesystems | 查用文件系统信息 |
dmesg
命令可以检测和控制内核的缓存,通常用来显示输出系统最后依次启动时的内核内部缓存信息。dmesg
命令的参数列表如下所示:
选项 | 说明 |
---|---|
-c | 显示信息后清空缓冲区中的信息 |
-n level | 设置将日志信息进行输出的级别,如设置为“n !”将只显示输出panic级别的信息 |
-s bufsize | 设置查询所需的缓冲区大小,默认是16392字节 |
例如:
echo
命令可以将参数输出到标准输出设备上,多个参数之间默认用空格分隔,在输出完成后自动添加换行符。echo命令通常用于显示输出我呢本行,该命令的参数选项说明如下:
选项 | 说明 |
---|---|
-n | 不输出最后的换行符“\n” |
-e | 对转义字符进行解析 |
-E | 不解析转义字符 |
–help | 显示输出帮助信息 |
–version | 显示输出版本信息 |
string | 指定显示的字符串 |
不同的Shell所支持的echo命令稍有不同
isosize
命令用于显示输出iso9660
文件系统的大小。该文件可以是普通的文件,也可以是一个块设备,如/dev/hdd
或者/dev/sr0
。该命令的参数选项为:
选项 | 说明 |
---|---|
-x | 以用户易读的方式进行显示 |
-d num | 与 -x 不同时使用,显示的结果是实际大小(字节表示)除以指定的num,所以如果num代表“块”大小,则输出的结果将是块数 |
iso9660_image_file | 指定iso9660文件系统 |
pwd命令用于显示用户当前所在目录的绝对路径。pwd命令的语法格式如下所示
pwd [--help] [--verison]
procinfo
命令用来显示系统的状态信息,其信息来源自/proc
目录。procinfo
命令可以显示在下表所示信息。
显示信息内容 | 说明 |
---|---|
Memory(内存) | 显示内存信息,与free 命令显示内容相似 |
Bootup (启动) | 系统的启动时间 |
Load average (平均负载) | 显示正在运行作业的平均数,正在运行的进程数和所有进程的数目 |
User(用户) | 运行作业所消耗的用户时间 |
Nice(优化) | 运行优化作业所消耗的用户时间 |
System(系统) | 运行作业所消耗的系统时间 |
示例
stat
命令用于显示文件或文件系统的详细信息,该命令语法参数列表如下表所示。
选项 | 说明 |
---|---|
-f | 不显示文件本身的信息,显示文件所在文件系统的信息 |
-L | 显示符号链接 |
-t | 简洁模式,只显示摘要信息 |
–help | 帮助信息 |
–version | 版本信息 |
filename | 待查询的文件名称 |
示例
uname
用于显示操作系统信息,其参数说明如下
选项 | 说明 |
---|---|
-a | 显示全部信息 |
-s | 显示内核名称 |
-n | 显示网络主机名称 |
-r | 显示内核版本 |
-m | 显示主机的硬件名称 |
-p | 显示处理器类型 |
-i | 显示主机的硬件平台 |
-o | 显示所使用的操作系统名称 |
示例
vmstat
命令用来显示虚拟内存的统计信息,该命令的语法格式如下所示:
vmstat [-V] [-n] [-a] [delay] [count]
示例
uptime
命令用于显示系统的运行信息,包括当前系统时间,系统已经运行的时间,用户登录数以及在过去1、5、15分钟内的系统的平均负载。
示例
locale
命令用于显示当前系统的语言设置,该命令参数说明如下所示:
选项 | 说明 |
---|---|
-a | 输出所有可用的语言名称 |
-m | 输出所有可用的字符集 |
-c | 按指定的类别输出 |
-k | 按指定的关键字输出 |
-v | 输出更多信息 |
-V | 输出命令的版本号 |
tload
命令用于以图形方式显示系统的负载信息
选项 | 说明 |
---|---|
-d | 刷新的间隔时间,以秒为单位 |
-s | 指定垂直方向的刻度,刻度越小,垂直方向的高度越大 |
Tty | 指定显示终端 |
-V | 显示版本信息 |
示例
lsmod
命令用于显示所有已加载的模块信息,其显示的信息与文件/proc/modules
的内容相同。lsmod
命令的语法格式如下所示:
lsmod [-V] [-h]
top
命令可以动态显示当前系统中消耗资源最多的进程。top
命令与ps
命令的基本作用相同,都是用来显示当前的进程及其状态。但top
命令能够实现动态显示,可以不断刷新当前状态,即top
命令提供了对系统处理器的实时监测。
time
命令可以计算执行一个进程所需要的时间,包括实际CPU时间、用户时间、系统时间。
pstree
命令将所有进程以树状图的方式进行显示。树状图默认会以init进程为根,如果指定了pid选项,则只显示指定进程为根的树状图。pstree
的参数列表如下所示:
选项 | 说明 |
---|---|
-a | 显示进程完整的指令及其参数 |
-p | 显示进程的进程号 |
-c | 不进行精简,即对不同等的子树进行压缩 |
-h | 高亮显示当前正在执行的进程及其父进程 |
-u | 显示用户名称 |
-l | 不对过长的记录进行剪切 |
-n | 以PID进行排序 |
–user | 显示指定用户的子树 |
–version | 显示版本信息 |
示例
ps
命令用于监测进程的工作情况。进程正在运行的程序,一直处于动态变化过程中,而ps
命令所显示的工作状态时瞬时的。如果试图连续查看某一进程的工作情况,必须连续使用该命令或者换用能够动态显示进程状态的top
命令。ps
的参数说明列表如下:
选项 | 说明 |
---|---|
-a | 显示所有的进程,包括其他用户线程 |
-A | 显示所有进程 |
a | 所有终端进程,但不包括session leaders |
c | 显示命令名称 |
-N | 反向选择 |
-e | 显示所有进程,等于-A |
e | 显示环境变量 |
-s | 指定会话相关进程 |
-o,o | 按用户自行定义的内容进行显示 |
-u | 选择显示有效的UID或用户名 |
x | 显示没有控制终端的进程 |
-m | 显示线程 |
-H | 显示树状结构 |
r | 仅显示正在运行的进程 |
T | 显示当前终端的所有进程 |
-U | 指定用户的进程 |
-C | 指定命令相关的进程 |
–help | 帮助信息 |
–lines | 显示行数 |
–width | 每行显示的字符数 |
–version | 版本信息 |
示例
pmap
命令用来显示指定程序的内存信息。该指令的语法格式如下:
pmap [pid] [/proc/pid]
例如,首先使用ps
命令查询出PID,然后通过pmap
查询进程的详细内存信息。
jobs
命令显示当前正在后台执行的作业。在获得作业的相关信息之后,可以对作业进行进一步操作,如使用fg
命令将作业调到前台执行,或者使用kill
命令杀死指定的作业。jobs
命令的参数列表如下:
选项 | 说明 |
---|---|
-p | 仅列出作业ID |
-n | 仅列出已经更改状态的作业ID |
-l | 列出后台作业的所有信息 |
-s | 仅列出已经停止的作业 |
-r | 仅列出正在运行的作业 |
mev
命令时gpm
包的一部分,可以将鼠标控制口的事件打印到标准控制台上。该命令的参数列表如下:
选项 | 说明 |
---|---|
-C number | 选择虚拟控制台 |
-d number | 选择默认掩码,所有不属于世卿颜的事件都不会被打印 |
-e | 选择事件掩码 |
-E | emacs 模式,在emacs 模式下,鼠标事件不再以数字格式表示,而是以lisp 被表示 |
-l | 交互模式,接受从标准终端输入的命令,并依次改变连接参数 |
-f | 识别屏幕内的拖拽事件 |
-m number | 最小修正掩码,低于这个修正码的事件将不被上报 |
-M number | 最大修正掩码,高于这个修正掩码的事件将不被上报 |
-p | 在拖拽期间描绘出指针的轨迹 |
-u | 用户模式,该项为默认项 |
fuser
命令可以利用指定的文件或者套接口对进程进行识别,该命令的参数列表如下:
选项 | 说明 |
---|---|
-l | 显示信号列表 |
-4 | ipv4 |
-6 | ipv6 |
-a | 显示与指定文件或目录相关的进程,包括未正在使用的文件 |
-k | 杀死访问文件的进程 |
-i | 交互模式,在杀死进程之前进行查询 |
-s | 静默模式,不显示处理信息 |
-u | 显示用户ID |
-v | 运行时,显示详细的处理信息 |
-V | 显示版本信息 |
- | 清零 |
-m | 挂载文件系统 |
-n space | 搜索指定的名字空间 |
-signal | 发送信号 |
示例
fgconsoel
命令用来显示活动的虚拟终端(vt)的数目。例如:
# fgconsole // 显示vt数目
8
history
命令保留了最近执行的命令记录,默认可以保留500个.历史清单从0 开始编写,直到保留最大值。history
命令的参数列表如下:
选项 | 说明 |
---|---|
n | 显示历史记录中最近的 n 个记录 |
-a | 将当前命令添加到历史记录中 |
r | 读取历史记录,但不会添加到历史记录中 |
w | 覆盖原有的history 文件 |
-c | 清除所有的历史记录 |
-d offset | 删除历史记录中第offset 个命令 |
-n filename | 读取指定文件 |
示例
gdialog
命令用来从Shell脚本创建对话框。gdialog
目前支持的对话框包括:yes/no对话框,menu
对话框、input
对话框、message
对话框、text
对话框、info
对话框、checklist
对话框、radiolist
对话框以及gauge
对话框。gdialog
命令的参数列表具体如下:
选项 | 说明 |
---|---|
–title | 设置对话框的标题 |
–backtitle backtitle | 设置背景标题 |
–create-rc file | 将对话框的基本配置信息输出到指定文件 |
Box options | 对话框选项说明 |
感觉花时间看+跟着敲一遍还是很有必要的。就是比较花时间,虽然这个是上,不过应该不会有下了