Linux实验报告

发布时间 2024-01-03 11:12:04作者: 奶茶加盐

大二上学期的linux的实验报告

一、CentOS Linux的安装

准备CentOS镜像文件,以及虚拟机软件VMware Workkstation。

1、打开VMware新建虚拟机。

image-20231230213242621

选择稍后安装操作系统

image-20231230213431691

选择与镜像文件对应的操作系统级版本

image-20231230213554693

设置虚拟机名称以及虚拟机安装路径

image-20231230213757076

设置虚拟机最大磁盘容量,这里的容量并不会一次性占用,而是随着使用逐渐增加,以后也可以随时进行更改。建议选择将虚拟磁盘存储为单个文件。

image-20231230213837470

选择自定义硬件

image-20231230214048115

根据需要配置内存和处理器的配置,DVD设备中选择使用ISO镜像文件,并点击浏览,选择准备好的镜像。

网络模式选择NAT模式。其他不需要的设备(比如打印机和声卡)可以移除。

image-20231230214409838

最后,点击关闭,再点击完成,虚拟机就创建好了。接下来就是进行CentOS系统的安装。

image-20231230214654219

2、安装Linux操作系统

找到刚才新建的虚拟机,并打开

image-20231230214827617

出现如下界面时,点击鼠标进入虚拟机,并通过键盘上下键选择第一个选项,回车。(同时按Ctrl和Alt可以将鼠标释放出来)

image-20231230215041860

耐心等待一段时间,设备初始化完成后,出现如下界面。选择语言(这里选择英文)

image-20231230215523605

点击并选择安装选项

image-20231230215643251

由于使用的是mini进项,只能选择最小化安装,如果是DVD进行,可以选择一下基础的工具包。选择完成后点击左上角的Done。

image-20231230215807364

点击,进行磁盘分区

image-20231230215837753

保持默认,直接点击左上角的Done

image-20231230215938828

网络先不配置,点击Begin Installation开始安装

image-20231230220050849

设置root用户及密码

image-20231230220134108

输入两次密码,点击左上角的done完成设置。如果密码强度过低,需要连续点击两次。

image-20231230220257113

root密码设置好后,等待安装完成即可。当然,也可以设置普通用户的账号和密码。

安装完成后点击右下角的Reboot重启

image-20231230220605817

重启之后,出现这个界面就说明安装成功了。

image-20231230221111657

输入账号和密码进行登录。(输入密码时是看不到输入的内容的)

image-20231230221204974

二、VMware的三个网络

仅主机模式:只能虚拟机与虚拟机之间、虚拟机与物理机之间进行通信

桥接模式:虚拟机和物理机一样也拥有自己的IP,虚拟机IP与物理机IP处于同一网段。(如果虚拟机过多,或子网可用IP过少,可能会造成IP冲突,不建议使用)

NAT模式:利用虚拟的NAT设备以及虚拟DHCP服务器来使虚拟机连接外网,虚拟机可以自由配置IP地址,且不会造成IP冲突。(推荐使用)

下面演示配置虚拟机网络的过程。(NAT模式)

1、首先是虚拟网络编辑

右键VMware快捷方式,以管理员身份运行,

image-20230811203244706

在VMware上依次点击,编辑>虚拟网络编辑器

image-20230811202917066

在弹出的界面按照下图进行如下配置:

image-20231231191543033

设置网关为:192.168.1.254,然后点击确定,回到上图后再次点击确定

最后配置如下:子网:192.168.1.0 掩码:255.255.255.0 网关:192.168.1.254

2、在虚拟机中设置网络(命令行界面)

使用以下命令打开ens33配置文件

vim /etc/sysconfig/network-scripts/ifcfg-ens33		# 用vim编辑器打开		命令1
vi /etc/sysconfig/network-scripts/ifcfg-ens33		# 如果没有vim编辑器的话,就用这条命令	命令2

如果出现下面这种情况,提示没有找到vim,就用命令2

image-20230921102724190

打开ens33配置文件后,可以看到类似下面这样的界面

image-20230921102929045

如果你已经配置过ens33的网络,那么打开配置文件时可能会出现下面这种情况,这是有其他程序正在占用这这个配置文件,一般情况下直接回车即可,如果不行的话就只能根据它给的提示进行操作了。

image-20230921171339465

按i进入编辑模式(左下角有INSERT的字样就说明当前处于编辑模式)

在编辑模式下,按键盘的上下左右键可以操控光标移动,退格键删除光标前的字符,回车键换行。

image-20230921103222529

打开配置文件后,我们需要修改两个属性:

ONBOOT=yes 			# (开机时启动网卡)
BOOTPROTO=static 	# (设置为静态IP)

还需要添加几个属性:

IPADDR=IP地址
NETMASK=子网掩码
GATEWAY=网关
DNS1=DNS服务器的IP地址		# DNS后面的1是数字1

这里的IP地址、网关、子网掩码、服务器的IP地址需要根据你自己在第一步中虚拟网络编辑器中的配置来设置

下面是我的配置:

IPADDR=192.168.1.70
NETMASK=255.255.255.0
GATEWAY=192.168.1.254
DNS1=119.29.29.29

image-20230921164824384

注意:

​ (1)这里的网关、子网掩码要和第1、步虚拟网络编辑器中的网关、子网掩码保持一致;

​ (2)IP地址要属于前面虚拟网络编辑器的子网网段中,比如,我的子网网段是192.168.1.0,子网掩码为255.255.255.0,(很明显这是个C类子网),那么我的IP地址的前24位(也就是192.168.1)要和子网的保持一致,那么我的IP地址只能设置为192.168.1.1到192.168.1.254之间的数,但由于192.168.1.1一般是VMnet网络适配器的IP,所以不能用,而我的网关是192.168.1.254,所以这个IP也不能用(当然如果你的网关是其他的地址,那也不能将I虚拟机P地址设置为网关的地址),所以我的虚拟机IP地址只能在192.168.1.2到192.168.1.253之间选择。

​ (3)这里的DNS可以设置为你的网关,也可以设置为真实的DNS服务器,比如119.29.29.29就是腾讯的DNS服务器

配置文件修改完成后,按键盘上的Esc键,然后你会发现左下角的INSERT不见了,这时候就可以输入:wq然后回车,将编辑的内容写入,并退出了。

image-20230921163727533

编辑之后输入下面这条命令重启网络服务

systemctl restart network		# 重启网络服务

image-20230921164025111

可以使用ping命令查看一下虚拟机是否能够连通外网,当然,前提是你的物理机能够上网。

ping baidu.com			# ping百度的官网

image-20230921164413649

按Ctrl+C可以结束命令。如果,能够访问外网的话,就说明网络配置成功了。

三、使用put、get命令实现文件上传,下载

用xftp直接图形化界面。

四、用户的添加

useradd添加用户,passwd设置用户密码

image-20231230231209075

五、权限管理

image-20231230232143182

六、打包tar、解包

打包

image-20231231100832157

解包

image-20231231100959527

七、MBR分区

1、在VMware软件中为虚拟机添加硬盘

如下图,点击下一步后,除硬盘大小之外,所有选项都保持默认即可。添加完成后,需重启虚拟机,新添加的硬盘才会生效。

image-20231101082802260

2、在虚拟机中使用lsblk命令查看磁盘分区情况,

可以看到,新加的硬盘为sdb,大小20G。

image-20231101083554550

3、使用fdisk命令给新加的硬盘分区

fdisk /dev/sdb		# 进入交互界面

(1)添加主分区

输入n添加分区,选项p为添加主分区,e为添加扩展分区。

image-20231101084610964

输入p添加主分区,分区号设置为1,起始扇区直接回车,使用默认的2048,Last扇区可以使用+size{K,M,G}的方式,设置分区的大小,这里将分区1大小设置为10G。

image-20231101085544592

(2)添加扩展分区

再次输入n添加分区,e添加扩展分区,分区号位2,起始扇区默认,Last扇区+8G。

此时添加了8G的扩展分区。

image-20231101090231641

输入p可以打印分区表

可以看到刚才创建的主分区sdb1和扩展分区sdb2

image-20231101092840661

(3)添加逻辑分区

输入n后,输入l添加逻辑分区,逻辑分区的编号从5开始。

添加一个2G的逻辑分区

image-20231101093850615

再添加一个1G的逻辑分区

image-20231101094159177

输入p打印分区表

image-20231101095930177

(4)保存退出并查看分区情况

输入w保存并退出,只退出不保存可以输入q,不保存的话刚才的配置不会生效。

image-20231101095953073

使用fidesk -l /dev/sdb查看磁盘/dev/sdb的分区:

image-20231101170001039

八、GPT分区

使用lsblk命令查看所有磁盘及其分区情况

image-20231210141202279

第一种,使用非交互时parted分区命令

1、创建GPT分区表

使用下面的命令修改磁盘分区表格式

parted /dev/sdb mklabel gpt
# sdb是要分区的磁盘
# mklabel是分区命令
# gpt是分区表格式

image-20231210142409658

2、查看分区表信息

这个命令在后面会多次用到

parted /dev/sdb print
# print也可以简写为p

image-20231210142732278

3、创建分区

创建一个名称为name_1,大小为3G的分区

parted /dev/sdb mkpart name_1 0G 3G
# mkpart是创建分区的命令
# name_1是分区名字
# 0G和3G分别是起始位置和结束位置,可根据需要自行选择。

image-20231210143736835

再创建两个分区

image-20231210144039831

4、修改分区名称

parted /dev/sdb name 1 part1
# name为修改分区名称的命令
# 1为需要修改的分区的编号
# part1是修改后的名字

image-20231210144342254

再把第三个分区的名称改为part3

image-20231210144445860

4、配置分区的标记

parted /dev/sdb set 1 lvm
# set为配置分区标记的命令
# 2为需要配置的分区的编号
# lvm为分区标记

image-20231210144852987

取消分区标记

取消标记的命令与配置的命令一样,只不过取消时,需要输入的是off。

image-20231210145336715

5、删除分区

parted /dev/sdb rm 1
# rm是删除分区的命令
# 1是要删除的分区的编号

image-20231210145624188

6、更改默认显示单位

这个更改只是一时的,就是说使用parted /dev/sdb unit GB print命令查看时是以GB为单位来显示,但当直接使用parted /dev/sdb print命令查看时还是按照原来的默认显示。

parted /dev/sdb unit GB print
# unit是更改显示单位的命令
# GB是更改后以GB为单位显示(可以是GB、MB、KB等,不区分大小写)

image-20231210145939504

image-20231210150030331

image-20231210150126283

7、怎么计算磁盘剩余容量

使用下面的命令查看磁盘分区情况

parted /dev/sdb print

image-20231210150859000

以上图为例,分区2和3占用了大概7.7G左右的空间,磁盘总容量为10.7G,所以磁盘剩余容量为10.7-7.7=3G。

但是,实际能够利用的空间可能没有3GB。在我这个例子中,3000MB到10.7GB的位置是被分区2和3所占有的,剩余的空间是在1048kB到2999MB之间,这段空间是连续的,所以我能够全部利用。

但如果分区2和3之间不是连续的,比如它们之间相隔着1GB的空间没有被分区,在分区2之前也有1GB的空间没有被分区,分区3之后也有1GB的空间没有被分区。空闲容量同样是3GB,但是这3GB我只能将它们分成3个分区使用,每一个分区只能使用1GB。因为一个分区中的空间必须是连续的(除非使用LVM)。

第二种,使用交互模式来进行分区管理

在命令行中输入下面的命令进入到交互模式

parted /dev/sdb 
# sdb是需要配置的磁盘

在交互模式中,可以输入help来查看帮助信息,或输入help 指令来查看某条指令的帮助信息。可以使用tab键来补全命令,也可以连按两次tab命令来显示可用指令。

image-20231210152940151

1、新建分区

mklabel gpt
# 创建GPT分区表

image-20231210153358483

输入print或p查看分区包信息

image-20231210153620611

输入mkpart回车,然后按照提示依次输入分区名称、文件系统类型、去世位置,结束位置。

image-20231210154252575

也可以一次性设置好

mkpart part2 ext2 2G 5G
# 分区名称为part2
# 文件系统为ext2
# 起始位置和结束位置分别为2G、5G,所以分区容量为3G

输入p查看一下分区情况

image-20231210154729594

分区1的起始位置为1049kB,1MB==1024KB,。。。(不知道为啥,不纠结,过!)

分区的起始位置和结束位置也可以通过百分比的方式来指定。比如:

mkpart part3 ext2 5G 100%
# 将5G之后的空间全部分给分区3

image-20231210155407308

2、设置默认单位

输入unit,回车,根据提示输入要更改的单位。

unit %
# 也可以写在一行

image-20231210155855502

交互模式下更改单位就不是临时的啦,后面在使用print查看时也会按照现在更改的单位来显示。

3、更改分区名称

输入name回车,然后根据提示输入分区编号,新名称。

name 1 part111
# 也可以写在一行

image-20231210160129603

4、配置分区标记

输入set,然后根据提示依次输入分区编号、标记类型、on或off(打开或关闭)。同样的在输入标记类型时也可以连按两次tab键来查看支持的类型。

set 1 diag on
# 也可以写在一行中

image-20231210160544175

取消标记的操作域配置时类似,在新状态的提示中输入off表示取消标记。

image-20231210161002721

5、删除分区

输入rm回车,然后根据提示输入要删除的分区编号。

rm 1
# 也可以写在一行,直接执行

image-20231210161243177

九、RAID磁盘阵列(待补充)

先使用分区命令 fdisk在系统中创建两个空闲分区/dev/sda5 和/dev/sda6,之后使用这两个分区创建一个名 为/dev/md0 的 RAIDO 级别磁盘阵列,具体命令如下:

mdadm -C /dev/md0 -l 0 -n 2 /dev/sda4 /dev/sda5

# -C工作模式,创建一个新阵列
# /dev/md0	RAID磁盘阵列的名称(路径)
# -l 0	指定RAID级别为0
# -n 2	指定设备数量为2个
# /dev/sda4 /dev/sda5	用于创建RAID的设备

查看RAID磁盘相关信息:

mdadm --detail /dev/md0

image-20231231224044913

十、vi编辑器的使用

1、vi 和 vim 常用的三种模式

  1. 正常模式

    ​ 以 vim 打开一个档案就直接进入一般模式了(这是默认的模式) 。在这个模式中, 你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用『复制、粘贴』来处理你的文件数据。

  2. 插入模式
    按下 i, I, o, O, a, A, r, R 等任何一个字母之后才会进入编辑模式, 一般来说按 i 即可.

  3. 命令行模式
    按 Esc 再输入:在这个模式当中, 可以提供你相关指令,完成读取、存盘、替换、离开 vim 、显示行号等的动作则是在此模式中达成的!

2、各种模式的相互切换

image-20230823132038263

(1)命令模式与插入模式间的切换。

一般情况下,用户可以使用按键 i,直接进入编辑模式,此时内容与光标的位置和命令模 式相同。另外还有其余多种按键,可以不同的形式切换到编辑模式。下面通过表2-47 对其余按键逐一进行讲解。

image-20231122084211354

使用Esc 键可从插入模式返回命令模式

(2)命令模式与底行模式间的切换。

命令模式下使用输入“:”或"/"按键,可进入底行模式。若想从底行模式返回到命令模式,可以使用Esc 键。若底行不为空,可以连按两次 Esc 键,清空底行,并返回命令模式

3、vi 和 vim 快捷键

1、拷贝当前行 yy , 拷贝当前行向下的 5 行 5yy ,并粘贴(输入 p)。

image-20231231105928509

2、删除当前行 dd , 删除当前行向下的 5 行 5dd

image-20231231110111901

3、在文件中查找某个单词 [命令行下输入 /关键字 , 回车查找 , 再输入 n 就是查找下一个 ,N为查找下一个]

image-20231231110404620

4、设置文件的行号,取消文件的行号.[命令模式下 : set nu:set nonu]

image-20231231110712249

5、定位首行和尾行,在一般模式下, 使用快捷键到该文档的最末行 G 和最首行 gg

6、撤销动作,在一般模式下, 撤销动作为 u

7、定位某行,在一般模式下, 输入 20,再输入 G,则光标移动到20行首

十一、Shell概念、shell变量及符号

二、Shell中的变量

Shell中常用的 变量有4种:本地变量、环境变量、位置变量和特殊变量。

1、本地变量

本地变量相当于C 语言中的局部变量,它只在本 Shell中有效,如果 Shell退出,本地变量将被销毁。

本地变量的定义格式如下所示:

NAME=value

NAME 是变量名,value是赋给变量的值。如果 value 没有指定,变量将被赋值为空字符串。在使用变量时,要在变量前面加“$”符号。例如,定义一个变量 NAME, 其值为 Tom, 在输出时,要以$NAME 的形式输出。

image-20231228153524885

Shell支持连续输出多个变量的值,例如,再定义一个变量 AGE, 其值为19,然后同时输出变量NAME与AGE。

image-20231228153723917

在定义本地变量时,还可以使用read命令从标准输入中读取变量值,其中 read 的-p 选项可以设置输入提示信息。

image-20231228153935227

删除所定义的变量,可以使用unset命令。

image-20231228154134963

调用 unset 命令删除 AGE 变量后,再输出该变量时值不再显示,仅输出一个空白行,表明这个变量已被删除(输出一个不存在的变量时也是输出一个空白行)。

总结:

# 定义,使用赋值号
NAME=value		# 变量名好像不一定需要是大写

# 使用,在变量名前加$
echo $NAME

# 删除unset
unset NAME

2、环境变量

环境变量是 Shell中非常重要的一个变量,用于初始化 Shell的启动环境。

(1)环境变量的定义与清除

环境变量在 Shell编程和 Linux 系统管理方面都起着非常重要的作用,它一般用来存储路径列表这些路径可用于搜索可执行文件、库文件等。环境变量定义格式如下所示:

export ENVIRON-VAEIABLE=value

环境变量必须要使用export关键字导出,export关键字的作用是声明此变量为环境变量。例如,定义 APPSPATH 变量并赋值为/usr/local,然后利用 export 将 APPSPATH 声明为环境变量。

image-20231228155042271

在命令行中使用 export定义的环境变量只在当前 Shell与子 Shell中有效,Shell 重启后这些环境变量将丢失,如果需要永久更改,需要修改环境变量的配置文件(后面会讲)。

使用env 命令可以查看所有的环境变量,包括用户自定义的环境变量。

image-20231228155205335

删除环境变量和删除本地变量的方式相同,也是调用unset命令。

image-20231228155327973

总结:

环境变量的定义、使用和删除与本地变量类似,只是环境变量在定义时需要使用export关键字进行声明。

使用env可以查看所有的环境变量。

(2)几个重要的环境变量

bash 中预设了很多环境变量,其中有几个比较重要的环境变量,Linux 系统及诸多应用 程序的正常运行都依赖它们。

PATH

PATH 是 Linux 中一个极为重要的环境变量,它用于帮助Shell找到用户所输入的命令用户输入的每个命令都是一个可执行程序,计算机执行这个程序以实现这个命令的功能。可执行程序存在于不同目录下,PATH 变量就记录了这一系列的目录列表。

输出 PATH 变量的值,结果如下所示:

image-20231228155747348

由输出结果可知,PATH 中包含了多个目录,它们之间用冒号分隔,这些目录中保存着命令的可执行程序,例如,输入 ls命令,PATH 就会去这些目录中查找 ls命令的可执行程 序,首先在/usr/local/bin目录查找,找到就执行该命令;没找到就继续查找下一个目录,直 到找到为止。如果PATH 值存储的目录列表中的所有目录都不包含相应文件,则 Shell会 提示"未找到命令……"。

PATH 变量的值可以被修改,但在修改时要注意不可以直接赋新值否则 PATH 现有 的值将会被覆盖。如果要在 PATH 中添加新目录,可以使用下面的命令格式:

PATH=$PATH:/newdrectory

# 例如将目录/opt目录加到环境变量中
PATH=$PATH:/opt

以上格式中$PATH 表示原来的 PATH 变量,new directory 表示要添加的新路径,中 间用冒号隔开,旧的 PATH 变量加上新增路径之后再赋值给PATH 变量。

PWD 和 OLDPWD

PWD 记录当前的目录路径,当利用cd命令切换到其他目录时,系统自动更新PWD的值OLDPWD 保存旧的工作目录。输出这两个变量的值,结果如下所示:

image-20231228160822605

从/root目录切换到根目录后,当前目录为/,之前所在的目录是/root。

HOME

HOME 记录当前用户的家目录,例如,在本机中有两个用户 root、abc,分别用这两 个用户输出$HOME 变量的值,具体如下所示:

image-20231228161259283

SHELL

SHELL 变量的值是/bin/bash,表示当前的 Shell是 bash。 如果有必要使用其他Shell, 则需要重置 SHELL 变量的值。

USER 和 UID

USER 和 UID 是用于保存用户信息的环境变量,USER 保存已登录用户的名字,UID 则保存已登录用户的ID。 使用echo 命令打印这两个环境变量,具体如下所示:

image-20231228162315949

PS1 和PS2

PS1 和 PS2 称为提示符变量,用于设置提示符格式。例如,“[itheima@localhost ~]$” 就是 Shell提示符,[]里包含了当前用户名、主机名和当前目录等信息,这些信息并不是固 定不变的,可以通过PS1 和 PS2 的设置而改变。

PS1 用于设置一级 Shell提示符,也称为主提示符。使用 echo命令查看 PS1 的值。

image-20231228162553927

由以上输出结果可知,变量PS1 包含4项内容,这4项内容的含义分别如下:

  • \u 表示即当前用户名;
  • \h 表示主机名;
  • \W 表示当前目录名;
  • \$是命令提示符,普通用户是$符号,如果是 root用户,命令提示符是#符号。

PS2 用于设置二级 Shell提示符,使用echo 命令查看PS2 的值,其结果如下所示:

image-20231228162850581

PS2 的值为>符号,当输入命令不完整时,将出现二级提示符。

image-20231228163036885

(3)环境变量的配置文件

Linux 中环境变量包括系统级用户级系统级的环境变量对每个用户都有效,而用户级的环境变量只对当前用户有效环境变量的配置文件也分为系统级和用户级,系统级的文件有很多,例如/etc/profile、/etc/profile.d、/etc/bashrc、/etc/environment 等,在这些文件中定义的环境变量对所有用户都是永久有效的。用户级的环境变量配置文件主要是 .bash profile和 .bashrc两个文件,它们位于用户的家目录下。例如,以abc用户登录, 它们位于/home/abc/目录下,使用cat命令查看两个文件中的内容,具体如下所示:

注意:如果是从其他用户使用su命令切换到abc用户的,那么无法查看这个文件。需要直接使用abc用户登录,才能查看abc家目录下的这个文件。

image-20231228164338862

image-20231228164728436

.bash profile文件主要定义当前 Shell 环境变量, .bashrc 文件主要用于定义子 Shell 环境变量。如果当前 Shell创建了一个子 Shell,则 .bashrc 文件使得子 Shell的环境变量与 当前 Shell 的环境变相分离。

用户在上述文件中均可以定义永久有效的环境变量,但要区分开环境变量是对所有用户有效还是对当前用户有效。

3、位置变量

位置变量主要用于接收传入 Shell脚本的参数,因此位置变量也被称为位置参数。位置变量的名称由“$”与整数组成,命名规则如下所示:

$n

$n 用于接收传递给 Shell脚本的第 n 个参数,如变量$1接收传入脚本的第一个参 数。当位置变量名中的整数大于9时,需使用{}将其括起来,如脚本中的第11个位置参数 应表示为${11}。位置变量是Shell 中唯一全部使用数字命名的变量。需要注意的是,n 是 从1开始的,$0表示脚本自身的名称。

接下来通过一个 Shell脚本来演示位置变量的用法,使用vi编辑器创建并编写test.sh脚本,内容如下:

#!/bin/bash

echo "The script's name is : $0"		# 脚本名
echo "Parameter #1: $1"					# 第1个位置参数
echo "Parameter #2: $2"
echo "Parameter #3: $3"
echo "Parameter #4: $4"
echo "Parameter #5: $5"
echo "Parameter #6: $6"
echo "Parameter #7: $7"
echo "Parameter #8: $8"
echo "Parameter #9: $9"
echo "Parameter #10: ${10}"
echo "Parameter #11: ${11}"

注:“#”后的字符表示注释,除第一行外的注释都可以不写。

执行test.sh脚本并传入参数,输出结果如下:

bash test.sh a b c d e f g h i j k
# 脚本按照位置接受参数,与编程语言中的函数类似。

image-20231228194230823

在接受参数时,位置变量只根据位置来接受相应参数,比如修改 test.sh 脚本如下。

#!/bin/bash

echo "The script's name is : $0"
echo "Parameter #8: $8"
echo "Parameter #9: $9"
echo "Parameter #10: ${10}"

再次执行脚本,参数与上一次相同,结果如下:

image-20231228194110919

在传入的参数中,第8个位置是h,$8 读取到了相应位置的参数。如果传入的参数不足8个,那么$8值为空。参数传多了也不会报错。

4、特殊变量

除了上述几个变量之外,Shell还定义了一些特殊变量,主要用来查看脚本的运行信息。 Shell中的常用的特殊变量如下所示。

  • $#:传递到脚本的参数数量。
  • $*$@:传递到脚本的所有参数。
  • $?:命令退出状态,0表示正常退出,非0表示异常退出。
  • $$:表示进程的PID。

接下来修改 test.sh脚本来演示特殊变量的用法,在脚本中添加一些内容。

#!/bin/bash

echo "The script's name is : $0"
echo "Parameter #8: $8"
echo "Parameter #9: $9"
echo "Parameter #10: ${10}"

# 新增代码
echo "Parameter count: $#"		# 传递给脚本的参数的数量
echo "All parameter: $*"		# 传递给脚本的所有参数
echo "All parameter: $@"		# 传递给脚本的所有参数
echo "PID: $$"					# 本程序的进程ID

运行结果如下:

bash test.sh a b c d e f g h i j k

image-20231228194919526

三、Shell中的符号

1、引号

在 Shell中,引号主要用来转换元字符的含义。所谓元字符,是指那些在正则表达式(正则表达式在后面会讲)中具有特殊处理能力的字符,如$、\、>等字符。

Shell 中的引号有3种:单引号(')、双引号("")与反引号()。接下来分别介绍这几种引号。

(1)单引号

单引号可以将它中间的字符还原为字面意义,实现屏蔽 Shell元字符的功能。引号里的字符串就是一个单纯的字符串,没有任何含义。例如,定义变量 NUM=100, 在输出变量时需要添加$符号,如果这个变量加上单引号输出,则直接将$符号与变量整体作为一个字 符串输出,命令如下所示:

image-20231228195940121

注意:不可以在两个单引号中间单独插入一个单引号,单引号必须要成对出现。

(2)双引号

双引号也具有屏蔽作用,但它不会屏蔽$符号、\符号``符号(反引号)。将刚才定义的变量NUM 加双引号输出,具体如下所示:

image-20231228200154413

注意:双引号也可以屏蔽单引号的作用,在一对双引号中,单引号不必成对出现。

(3)反引号

反引号可以进行命令替换反引号与双引号可以结合使用。例如,输出系统的时间,具体操作如下:

image-20231228200438811

以上所示的命令中用到了命令 date,该命令的功能是打印系统当前的时间。

可以把反引号嵌入到双引号中,但是当把反引号嵌入到单引号中时,单引号会屏蔽掉反引号的功能。例如,把date嵌入单引号中,将不会打印出当前的时间。

image-20231228200549619

2、通配符

Shell的通配符一般用于数据处理或文件名匹配,常用的通配符如表所示。

符号 说 明 符号 说 明
* 与零个或多个字符匹配 [] 与 中的任一字符匹配
? 与任何单个字符匹配 [!] 与[]之外的任一字符匹配

(1)通配符“*”

如果用户想要列出/etc目录下以sys开头的所有文件,可以使用如下命令:

ls -d /etc/sys*

image-20231228200933104

在以上命令中,sys* 表示匹配以字符串 sys开头的所有文件-d选项表示仅对目标目录本身进行处理,不递归处理目录中的文件

如果想输出以.conf结尾的所有文件,则可以使用如下命令:

ls  /etc/*.conf

image-20231228201120961

(2)通配符“?”

通配符"?"每次只能匹配一个字符,通常与其他通配符结合使用。如果想查找/etc目录 下文件名是由两个字符组成的文件,可以使用如下命令:

ls -d /etc/??

image-20231228201348619

(3)通配符“[]”

通配符“[]”表示与[]中的任一字符匹配,它通常是一个范围。例如,在/etc 目录,列出 以 f~h范围的字母开头,并以.conf结尾的文件,可以使用如下命令:

ls /etc/[f-h]*.conf

image-20231228201544976

(4)通配符“!”

通配符“[!]”表示除了[]里的字符,与其他任一字符匹配。例如,如果查找以 y 开头且不以.conf 结尾的文件,可以使用如下命令:

ls -d /etc/y*[!.conf]

image-20231228201821007

3、连接符

Shell中提供了一组用于连接命令的符号,包括;``&&以及||,使用这些符号,可以对多条 Shell指令进行连接使这些指令顺序或根据命令执行结果有选择地执行。下面将对这些符号的功能分别进行介绍。

(1)连接符“;”

使用“;”连接符间隔的命令,会按照先后次序依次执行。假如现在有一系列确定的操作需要执行,且这一系列操作的执行需要耗费一定时间,如安装 gdb 包时,在下载好安装包后,还需要逐个执行以下命令

img

且在大多数命令开始执行后,都需要一定的时间,等待命令执行完毕。若此时使用";"连接符连接这些命令,具体如下所示:

img

系统会自动执行这一系列命令。

又或者执行完ls -a命令后再执行ls -al命令:

image-20231228202630463

(2)连接符“&&”

使用“&& ”连接符连接的命令,其前后命令的执行遵循逻辑与关系只有该连接符之前的命令执行成功后,它后面的命令才被执行

(3)连接符“||”

使用“||”连接符连接的命令,其前后命令的执行遵循逻辑或关系,只有该连接符之前的命令执行失败时,他后面的命令才被执行。

十二、Shell特殊符号及正则表达式

限定符

x* # x出现0次或多次
x+ # x出现1次或多次
x? # x出现0次或1次
x{5} # x出现5次 如:\d{8}表示数字出现8次
x{2,5} # x出现2-5次
x{2,} # x出现2次及以上

或运算符

(x|y) # 匹配x或y
(xy)|(gy) # 匹配xy或gy

字符类

[abc] # 匹配a或b或c
[a-c] # 匹配a或b或c;匹配a到c的任意字符
[a-zA-Z0-9] # 匹配小写字母或者大写字母或者数字
[^0-9] # 匹配非数字字符
[]中的^表示非

元字符

\d # 匹配数字字符
\D # 匹配非数字字符
\w # 匹配单词字符(字母、数字、下划线)
\W # 匹配非单词字符
\s # 匹配空白字符(包括空格、换行符、制表符)
\S # 匹配非空白字符
. # 匹配任意一个字符(换行符除外)
\b # 标注字符的边界 \B也一样 这里的字符指的是字母、数字、下划线和汉字
vvv vv vv# jdf@ @ @ ___ - - _231233 00.
^ # 匹配行首
$ # 匹配行尾
如^abc表示行首为abc的,\d{8}$表示行尾为8个数字的
当需要匹配.^*+?之类的字符时,可用\来转义

贪婪匹配、懒惰匹配

.+ # 贪婪匹配任意字符(换行符除外)
.+? # 懒惰匹配任意字符(换行符除外)
如:<.+>和<.+?>
<啦啦啦啦啦<,,fjkdslafjsajklf; <pjfdkdj;>

十三、 sed和awk文本处理工具

1、sed

(1)追加文本

在poem 文件中的“For rain"后追加新的文本"add a new line!!!”

image-20231228220015538

由输出结果可以看出,追加成功。同样,也可以用脚本来实现文本的追加,编写脚本add.sh,内容如下所示:

/For rain/a\
we add a new line!!!
/==/a\
add anothernew line!!!

脚本add.sh 中使用编辑命令 a\实现追加。如果追加的文本有多行,可以使用反斜杠 “\”完成换行。脚本编写完成后,在命令行使用 sed命令调用脚本,方可完成追加。

sed -f add.sh poem

image-20231230104911650

(3)删除文本

使用编辑命令d实现。

sed '/For rain/d' poem

image-20231231120621139

2、awk

例1:用关系表达式作为 awk 命令的匹配模式,筛选出第一科成绩大于80分的同学

awk '$2>80 {print}' scores

image-20231231120834238

例2:使用正则表达式匹配首字符为 x 的行

awk '/^x/ {print}' scores

image-20231231121154211

例2.1:匹配以zhang开头或li开头的文本行

awk '/^(zhang|li)/ {print}' scores

image-20231231121210031

例3:在文件 scores 中查找开头为 li 且第二列的值大于80 的文本行

awk '/^li/ && $2>80 {print}' scores

image-20231231121250821

例4:使用区间模式匹配一段连续的文本行

awk '/^zhang/,$2==77 {print}' scores

image-20231231121305889

十四、Shell编程

编写计算1到100的和的脚本程序

1、使用for循环

#!/bin/bash

sum=0           # 初始化sum
for i in {1..100}		# i从1遍历到100
do
        let sum=sum+i
done

echo $sum		# 输出sum

2、使用while循环

#!/bin/bash

sum=0
i=1
while (($i<=100))		# i>100时结束循环
do
        let sum=sum+i
        let i++
done

echo $sum

3、使用until循环

#!/bin/bash

sum=0
i=1
until (($i>100))		# i>100时结束循环
do
        let sum=sum+i
        let i++
done

echo $sum

image-20231231122835446

计算任意数的累加和(从键盘获取)

#!/bin/bash

echo "请输入一个整数:"
read n
sum=0

while (($n>=1))         # n<1时结束循环
do
        let sum=sum+n
        let n--         # n自减
done

echo $sum

image-20231231123905397

十五、DHCP

1、在vmware中,编辑->虚拟网络编辑器

选择仅主机模式下,取消勾选DHCP。点击确定。

image-20231231130218086

2、准备两台虚拟机,

一台是Linux作为DHCP服务器,另一台windows或Linux作为客户机去验证DHCP服务器能否正常工作。(这里选择windows作为客户机)

将windows的网络适配器也设置为仅主机模式。

image-20231228101500800

3、将Linux的DVD镜像连接到虚拟机

将作为DHCP服务器的Linux虚拟机网络适配器设置为仅主机模式,并将Linux的DVD镜像连接到虚拟机。

image-20231228101918124

4、在物理机中打开网络适配器

image-20231228103143459

这里的IP地址是作为仅主机模式的虚拟机的网关来使用的(经过实验,其实并不一定是虚拟机的网关。这个IP的作用是,当虚拟机和物理机之间互相通信时,就是通过这个虚拟网卡的这个IP来进行通信的)。

配置完成后点击确定。最好再禁用再启用一下。

5、配置DHCP服务器为静态IP

虚拟机IP地址要在“虚拟网络编辑器”那里的子网的范围中。

查看虚拟机网络编辑器中的仅主机模式的子网

image-20231228102308440

这的子网为192.168.195.0,掩码是255.255.255.0,所以仅主机模式下的虚拟机可以使用的IP地址是192.168.195.1到192.168.195.254。

图形化:

image-20231228103545651

字符界面:

# 修改配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens33

image-20231231125914841

6、挂载DVD光盘,安装DHCP

在DHCP服务器中,

使用cat查看/etc/yum.repos.d/CentOS-Media.repo文件的内容,

[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
        file:///media/cdrom/
        file:///media/cdrecorder/

选择baseurl后面的三个路径中的一个,将DVD镜像文件挂载到目录上。(这里选择cdrom目录

使用ls命令查看cdrom目录是否存在。ls /media/

image-20231231130620965

不存在,则使用mkdir命令创建目录。mkdir /media/cdrom

image-20231231130719522

使用mount命令将镜像文件挂载。mount /dev/cdrom /media/cdrom/

image-20231231130822615

使用安装命令yum --disablerepo=* --enablerepo=c7-media [command]进行安装dhcp。

yum --disablerepo=\* --enablerepo=c7-media install dhcp

两台虚拟机都安装不了。。。一个是找不到软件包,一个是安装过程中出现问题,用的镜像都是同一个,而且都成功挂载了。

使用在线方式安装,重新该一下网络配置。。。。

image-20231231142118846

7、修改dhcp配置文件

使用cat查看/etc/dhcp/dhcpd.conf配置文件,内容如下:

#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#

根据配置文件内容的提示,查看示例文件。cat /usr/share/doc/dhcp*/dhcpd.conf.example

随便找一段以subnet开头的内容,复制

subnet 10.254.239.32 netmask 255.255.255.224 {
  range dynamic-bootp 10.254.239.40 10.254.239.60;
  option broadcast-address 10.254.239.31;
  option routers rtr-239-32-1.example.org;
}

打开/etc/dhcp/dhcpd.conf配置文件,将复制的内容粘贴到里面,并进行一些修改。

image-20231231185646813

修改完成后重启dhcp服务

systemctl restart dhcpd

8、使用客户机检验dhcp服务器能否正常工作

在windows虚拟机中,打开网络适配器,进行如下配置。

image-20231231184511271

配置完成后,点击确定。然后右键禁用Ethernet0,再右键启用。

虚拟机中打开cmd命令行,使用ipconfig命令查看ip地址,是否自动获取了。

image-20231231184712401

自动获取了IP地址,192.168.195.110,实验成功!