Liunx Shell编程与编辑器使用详解-上

Liunx Shell编程与编辑器使用详解-上

文章目录

一、Shell 编程基础

基本概念

常用的Shell类型

Shell具有不同的风格,就像UNIX操作系统有不同的风格一样。每种不同风格都具有各自的命令喝功能,最常用的Shell包括Bourne Shell,、Bourne Again Shell、C Shell 、Korn Shell和Perl Shell等。

后面编程部分所设计的脚本语言,以Bourne Again Shell为例(Bash)。

Shell通配符的常用

Shell中支持使用通配符,常用的通配符如下所示。

  • ? : 表示任意的单个字符
  • ***** : 表示任意长度的任意字符串
  • [] : 表示匹配放在**[]**中的任意一个字符
  • {} : 将大括号中的字符串(表示多个字符)以及前导字符串和后继字符串作为匹配条件

我们可以看一下案例来了解其具体用法

image-20221029150303187

其实这里可能会比较混淆 [] 和 **{}**的用法。可以通过下面这个例子看出前面标出强调的一个和多个的区别

image-20221029150819490

IO 重定向

常用的输入输出重定向命令格式说明

命令行说明
命令 1 > 文件 1将命令1的输出结果重定向到文件1
命令 1 &> 文件1将命令1的输出结果和标准错误输出一起重定向到文件1
命令1 >> 文件 1将命令1的输出结果追加到文件1中
命令 1 2> 文件1将命令1的标准错误输出的结果重定向到文件1中
命令1 < 文件1将文件1 作为命令1的标准输入
命令1 << 字符串1允许连续输入数据,直到接收到字符1

为了理解上述表格中的命令,我们以 >> 作为案例

image-20221029160749265

最后我们查看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
管道(Pipe)

在Liunx系统中,管道的主要功能时将其他程序的输出结果直接导出到另一个程序来当成输入数据,管道的操作符是 |。管道语法格式为:

命令1 | 命令2 | ……

注意: 管道操作符的左边一定是一条送往标准输出设备的命令,管道操作符的右边一定是一条从标准输入设备读入的命令。

实例

image-20221029163837309

通过这个案例综合使用卡面提到的IO重定向以及liunx通配符的使用方法。

命令的执行顺序

命令的执行顺序可分为顺序执行和有条件执行。顺序执行是指多个命令依次执行,前后的命令并无因果关系。而有条件执行是指命令的前后之间存在条件关系,只有满足一定条件才能执行或不被执行。

顺序执行

顺序执行多个命令是指在命令行一条一条地输入命令,命令之间用(;)分隔,且分号前后的命令无因果关系。例如:

image-20221029164953912

这个例子中可以看到其中的三条命令依次被执行,并被输出。

这个其实就跟C语言里一行写多条命令差不多。

有条件执行

有条件执行分为 && 和 || ,区别如下:

  • &&:连接两个命令,前一命令执行成功后才能执行后一个命令,相当于逻辑与。
  • ||:连接两个命令,前一个命令执行不成功菜执行后一个命令,相当于逻辑或。

有条件执行可以在很多高级语言中可以看到。感觉最常见的是在js中,通过有条件执行来避免执行指令失败时奔溃。

实例

image-20221029165542592

运行脚本

这里我们简单实现一个sh可执行文件,见下例子:

image-20221029171050435

简单说明:

这里我们首先通过cat命令创建一个a.sh文件,并且通过vi查看文件中的内容。

然后我们尝试执行该sh文件 ,发现由于文件权限问题无法执行成功。

我们使用chmod u+x ./a.sh将文件的权限设成可读、可执行

若希望把文件名作为命令执行时,都必须具有执行权限。如果该文件时一个Shell脚本,用户尝试执行这个文件时,还需具备读权限。而在执行一个二进制可执行文件时,不需要读权限。

二、系统管理与设置

2.1 常用的信息显示命令

cal 命令:日期显示

cal 命令用于显示日历,配合选项“-y”可以显示全年的年历。cal命令的语法格式如下所示:

cal [-1] [-3] [-s] [-m] [-j] [-y] [month] [year]

各个选项的说明表

选项说明
-1显示单月份信息,默认设置
-3显示前一月、当前以及下一月月历信息
-s显示输出时将星期日作为每周的第一天,默认设置
-m显示输出将星期一作为每周的第一天
-j显示距1月1日的天数,即从1月1日开始计算
-y显示整年日历
month月份
year年份

例如下图

image-20221031110824570

cat /proc/meminfo 内存使用情况查询

image-20221031110938359

注意:/proc目录下的文件并不是真正意义上的文件,关闭系统后,该目录中的文件不再存在。该目录通常用来帮助查看内核运行信息。

free命令: 内存详细信息查询

free命令用于显示系统使用和空闲的内存情况,设计的内存包括物理内存、交换分区内存(swap)和内核缓冲区内存以及高速缓存。free命令的参数列表如下:

选项说明
-b显示内存单位为字节
-k显示内存的单位为KB
-m显示内存的单位为MB
-g显示内存的单位为GB
-o按旧格式进行显示,即不显示"-/ + buffers/cache"行
-t显示RAM以及swap的总和
-s delay每隔指定时间刷新一次命令,单位为秒
-c count设定刷新的次数
-V显示输出版本信息并退出该命令

例如

image-20221031111913780

cat /proc/cpuinfo : 处理器CPU信息显示

文件/proc/cpuinfo中保存了处理器的相关信息,通过cat命令查看/proc/cpuinfo,可以查询CPU的相关信息。例如下图,由于信息过长这里只显示最后的10行

image-20221031112259529

cat /proc/modules : 查询当前系统被加载模块

文件/proc/modules中保存了当前系统中被加载模块的相关信息。配合cat命令可以查看当前系统加载模块的情况。

系统信息显示命令

proc 文件系统 : 访问系统内核信息

proc不是一个真实的文件系统,不占用外存空间,只是以文件的方式为访问Liunx内核数据提供接口。用户和应用程序可以通过查看/proc目录中的相关文件得到系统的运行信息,并可以改变内核的某些参数。由于系统的信息总是动态变化的,所以用于或应用程序读取/proc目录下的文件时获得的数据也是瞬时的。许多应用程序通过proc来访问Liunx内核信息。查看 /proc目录如下。

image-20221031113543884

其中,每个以数字命令的目录对应系统中运行的一个进程,该数字即为进程的PID号。数字目录中存放了该进程的运行信息,可以通过相应的命令进行查询。例如查询系统中运行的vi程序的相关信息。

image-20221031114147014

注意:

/proc目录中,可以通过查看 cpuinfo文件获得处理器的详细信息;通过 interrupts文件可以查看当前系统使用的中断号;通过 uptime 文件可以查看系统运行的时间;通过 filesystems文件,可以查看当前文件系统支持的文件系统类型

modinfo: 内核模块信息

modinfo命令用来显示内核模块信息。 modinfo命令会检测到与内核相关的模块文件,并显示检测的结果。其中,下表为参数选项说明:

选项说明
-a显示模块作者
-d显示模块描述信息
-l显示模块许可
-n显示模块文件名称
-p显示模块支持的参数信息
-V显示版本信息
-h显示帮助信息

使用这个命令时我们可以搭配前面的cat /proc/modules先找到想要查看的模块信息,例如:

image-20221031115852506

windows子系统下的Ubantu好像没有/proc/modules

cat /etc/issue: 系统的当前发行版本

文件/etc/issue中保存了当前系统的发行版本。配合使用 cat命令可以显示输出版本信息。例如:

image-20221031120145452

/proc 目录下的相关文件
文件说明
cat /proc/version查看系统内核当前版本
cat /proc/partitions查看系统当前分区
cat /proc/interrupts显示中断信息
cat /proc/filesystems查用文件系统信息
dmesg: 启动信息查询

dmesg命令可以检测和控制内核的缓存,通常用来显示输出系统最后依次启动时的内核内部缓存信息。dmesg命令的参数列表如下所示:

选项说明
-c显示信息后清空缓冲区中的信息
-n level设置将日志信息进行输出的级别,如设置为“n !”将只显示输出panic级别的信息
-s bufsize设置查询所需的缓冲区大小,默认是16392字节

例如:

image-20221031121542272

文件系统信息显示常用命令

echo : 文本行输出显示

echo命令可以将参数输出到标准输出设备上,多个参数之间默认用空格分隔,在输出完成后自动添加换行符。echo命令通常用于显示输出我呢本行,该命令的参数选项说明如下:

选项说明
-n不输出最后的换行符“\n”
-e对转义字符进行解析
-E不解析转义字符
–help显示输出帮助信息
–version显示输出版本信息
string指定显示的字符串

不同的Shell所支持的echo命令稍有不同

isosize:iso9660文件系统大小显示

isosize 命令用于显示输出iso9660文件系统的大小。该文件可以是普通的文件,也可以是一个块设备,如/dev/hdd或者/dev/sr0。该命令的参数选项为:

选项说明
-x以用户易读的方式进行显示
-d num-x不同时使用,显示的结果是实际大小(字节表示)除以指定的num,所以如果num代表“块”大小,则输出的结果将是块数
iso9660_image_file指定iso9660文件系统
pwd : 当前工作目录

pwd命令用于显示用户当前所在目录的绝对路径。pwd命令的语法格式如下所示

pwd [--help] [--verison]
procinfo :系统状态信息的显示

procinfo命令用来显示系统的状态信息,其信息来源自/proc目录。procinfo命令可以显示在下表所示信息。

显示信息内容说明
Memory(内存)显示内存信息,与free命令显示内容相似
Bootup (启动)系统的启动时间
Load average (平均负载)显示正在运行作业的平均数,正在运行的进程数和所有进程的数目
User(用户)运行作业所消耗的用户时间
Nice(优化)运行优化作业所消耗的用户时间
System(系统)运行作业所消耗的系统时间

示例

image-20221031184149863

stat :文件/文件系统的详细信息的显示

stat命令用于显示文件或文件系统的详细信息,该命令语法参数列表如下表所示。

选项说明
-f不显示文件本身的信息,显示文件所在文件系统的信息
-L显示符号链接
-t简洁模式,只显示摘要信息
–help帮助信息
–version版本信息
filename待查询的文件名称

示例

image-20221031184653709

Liunx操作系统信息查询

uname : 操作系统信息的显示

uname用于显示操作系统信息,其参数说明如下

选项说明
-a显示全部信息
-s显示内核名称
-n显示网络主机名称
-r显示内核版本
-m显示主机的硬件名称
-p显示处理器类型
-i显示主机的硬件平台
-o显示所使用的操作系统名称

示例

image-20221031185205729

vmstat :虚拟内存的统计信息的显示

vmstat命令用来显示虚拟内存的统计信息,该命令的语法格式如下所示:

vmstat [-V] [-n] [-a] [delay] [count]

示例

image-20221031185453293

uptime:系统的运行信息的显示

uptime命令用于显示系统的运行信息,包括当前系统时间,系统已经运行的时间,用户登录数以及在过去1、5、15分钟内的系统的平均负载。

示例

image-20221031185750358

locale: 当前系统的语言设置

locale命令用于显示当前系统的语言设置,该命令参数说明如下所示:

选项说明
-a输出所有可用的语言名称
-m输出所有可用的字符集
-c按指定的类别输出
-k按指定的关键字输出
-v输出更多信息
-V输出命令的版本号
tload: 系统负载显示

tload命令用于以图形方式显示系统的负载信息

选项说明
-d刷新的间隔时间,以秒为单位
-s指定垂直方向的刻度,刻度越小,垂直方向的高度越大
Tty指定显示终端
-V显示版本信息

示例

image-20221031200231460

lsmod:所有已加载模块的显示

lsmod命令用于显示所有已加载的模块信息,其显示的信息与文件/proc/modules的内容相同。lsmod命令的语法格式如下所示:

lsmod [-V] [-h]

进程资源

top:进程信息显示

top命令可以动态显示当前系统中消耗资源最多的进程。top命令与ps命令的基本作用相同,都是用来显示当前的进程及其状态。但top命令能够实现动态显示,可以不断刷新当前状态,即top命令提供了对系统处理器的实时监测。

image-20221031202104612

time : 进程执行时间显示

time命令可以计算执行一个进程所需要的时间,包括实际CPU时间、用户时间、系统时间。

image-20221031202444727

pstree:以树状图显示程序

pstree命令将所有进程以树状图的方式进行显示。树状图默认会以init进程为根,如果指定了pid选项,则只显示指定进程为根的树状图。pstree的参数列表如下所示:

选项说明
-a显示进程完整的指令及其参数
-p显示进程的进程号
-c不进行精简,即对不同等的子树进行压缩
-h高亮显示当前正在执行的进程及其父进程
-u显示用户名称
-l不对过长的记录进行剪切
-n以PID进行排序
–user显示指定用户的子树
–version显示版本信息

示例

image-20221031215456630

ps :监测进程

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版本信息

示例

image-20221031220923063

pmap:显示程序的占用资源信息

pmap命令用来显示指定程序的内存信息。该指令的语法格式如下:

pmap [pid] [/proc/pid]

例如,首先使用ps命令查询出PID,然后通过pmap查询进程的详细内存信息。

image-20221031221232810

jobs:后台作业

jobs命令显示当前正在后台执行的作业。在获得作业的相关信息之后,可以对作业进行进一步操作,如使用fg命令将作业调到前台执行,或者使用kill命令杀死指定的作业。jobs命令的参数列表如下:

选项说明
-p仅列出作业ID
-n仅列出已经更改状态的作业ID
-l列出后台作业的所有信息
-s仅列出已经停止的作业
-r仅列出正在运行的作业
mev: 监视鼠标情况

mev命令时gpm包的一部分,可以将鼠标控制口的事件打印到标准控制台上。该命令的参数列表如下:

选项说明
-C number选择虚拟控制台
-d number选择默认掩码,所有不属于世卿颜的事件都不会被打印
-e选择事件掩码
-Eemacs模式,在emacs模式下,鼠标事件不再以数字格式表示,而是以lisp被表示
-l交互模式,接受从标准终端输入的命令,并依次改变连接参数
-f识别屏幕内的拖拽事件
-m number最小修正掩码,低于这个修正码的事件将不被上报
-M number最大修正掩码,高于这个修正掩码的事件将不被上报
-p在拖拽期间描绘出指针的轨迹
-u用户模式,该项为默认项
fuser:用套接口或者文件识别进程

fuser命令可以利用指定的文件或者套接口对进程进行识别,该命令的参数列表如下:

选项说明
-l显示信号列表
-4ipv4
-6ipv6
-a显示与指定文件或目录相关的进程,包括未正在使用的文件
-k杀死访问文件的进程
-i交互模式,在杀死进程之前进行查询
-s静默模式,不显示处理信息
-u显示用户ID
-v运行时,显示详细的处理信息
-V显示版本信息
-清零
-m挂载文件系统
-n space搜索指定的名字空间
-signal发送信号
  • c : 当前目录
  • e : 扩展
  • f : 打开的文件
  • r : 根目录
  • m : 共享库

示例

image-20221031230153591

Liunx 终端命令行操作

fgconsole : 显示当前虚拟终端数目

fgconsoel命令用来显示活动的虚拟终端(vt)的数目。例如:

# fgconsole 		// 显示vt数目 
8
history: 显示历史指令

history命令保留了最近执行的命令记录,默认可以保留500个.历史清单从0 开始编写,直到保留最大值。history命令的参数列表如下:

选项说明
n显示历史记录中最近的 n 个记录
-a将当前命令添加到历史记录中
r读取历史记录,但不会添加到历史记录中
w覆盖原有的history文件
-c清除所有的历史记录
-d offset删除历史记录中第offset个命令
-n filename读取指定文件

示例

image-20221031231223523

gdialog:Shell脚本创建对话框

gdialog命令用来从Shell脚本创建对话框。gdialog目前支持的对话框包括:yes/no对话框,menu对话框、input对话框、message对话框、text对话框、info对话框、checklist对话框、radiolist对话框以及gauge对话框。gdialog命令的参数列表具体如下:

选项说明
–title设置对话框的标题
–backtitle backtitle设置背景标题
–create-rc file将对话框的基本配置信息输出到指定文件
Box options对话框选项说明

参考

  • 《Liunx Shell编程与编辑器使用详解》

小结

感觉花时间看+跟着敲一遍还是很有必要的。就是比较花时间,虽然这个是上,不过应该不会有下了

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shell程序的具体要求如下: (1)本实验的user-sh程序设计不包括对配置文件和命令行参数的支持。User-sh应提供一个命令提示符,如“user-sh>”,表示等待用户的输入,执行命令输出的必要信息,然后再打印下一个命令提示符。当用户没有输入时,user-sh需要一直处于随时等待输入状态,同时在屏幕上显示一些基本提示信息。 (2)实现以下内部命令。 exit 结束所有的子进程并退出。 jobs 打印当前正在后台执行的作业和被挂起的作业信息。输出信息应采用便于用户理解的格式。jobs自身是一条内部命令,所以不需要先是在输出上。 history 列出用户最近输入过的N条命令,不论这个命令是否正确执行过。 fg%<pid> 把<pid>所标识的作业放到前台运行。若这个作业原来已经挂起则让其继续运行。 bg%<pid> 把<pid>所标识的已挂起的进程放在后台运行。 (3)进行前台和后台作业切换 user-sh应当在打印新的命令提示符之前等待前台运行的子程序结束。前台作业和后台作业的区别是:shell在前台作业执行完之前要一直处于等待状态。而在开始执行后台作业时要立刻打印出提示符,让用户继续输入下一条命令。 执行前台作业即在提示符后输入一个可执行文件的路径(绝对路径)即可,执行后台作业则需在可执行文件路径后加上一个“&”符号。 前台作业的执行总是优先于一个后台作业的执行,user-sh不需要在打印下一个提示符前等待后台作业的完成无论是否会有后台作业的执行,只要完成一个前台作业,便立即输出提示符。一个后台作业结束时,user-sh应当在作业执行结束后立刻打印出一条提示信息,后面会在命令语法分析程序中介绍相应的语法来支持后台作业。 user-sh通过处理组合键实现前/后台作业切换: Ctrl+Z 产生SIGTSTP信号,这个信号不是挂起user-sh,而是让user-sh挂起在前台运行的作业,如果没有任何前台作业,则该特殊键无效。 Ctrl+C 产生SIGINT信号,这个信号不终止user-sh,而是通过user-sh发出信号杀死前台作业中的进程。如果没有任何前台作业,则该特殊键无效

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值