分布式版本控制系统
一、
Git
概述
Git
是一种分布式版本控制系统,用于跟踪和管理代码的变更。它是由 Linus Torvalds 创建的,最初被设计用于
Linux
内核的开发。
Git
允许开发 人员跟踪和管理代码的版本,并且可以在不同的开发人员之间进行协作。 Github 用的就是
Git
系统来管理它们的网站,
Github
是一个社区,
Git
是一个服务系统,Github
只支持
Git
分布式系统,所以故名成为
Github
。
Git
的主要功能包括:
1.
版本控制:
Git
可以跟踪代码的变更,并且可以回滚到任何一个版本。
2.
分支管理:
Git
支持多个分支,可以让不同的开发人员在不同的分支上 进行开发,然后再合并到主分支上。
3.
分布式:
Git
是分布式的,意味着每个开发者都可以在自己的本地分支 上进行操作,不需要依赖于中央服务器。
4.
团队协作:
Git
支持多人协作,可以让不同的开发人员在同一个项目上 进行协作。
5.
使用
Git
进行版本控制可以提高开发效率,减少代码冲突,并且可以更 好地管理代码变更。
二、
Git
的功能特性
Git
是关注于文件数据整体的变化,直接会将文件提交时的数据保存成快 照,而非仅记录差异内容,并且使用SHA-1
加密算法保证数据的完整性。主 要功能如下:
1.
克隆数据库版本
:
从服务器上克隆版本数据库
(
包括代码和版本信息
)
到本 机上;
2.
提交代码
:
在本机上自己创建的分支上提交代码
;
3.
合并分支
:
在本机上合并分支
;
4.
拉取合并分支
:
新建一个分支,把服务器上最新版的代码
Fetch
下来, 然后跟自己的主分支合并;
5.
代码冲突解决
:
一般开发者之间解决冲突的方法,开发者之间可以使用 pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
三、
Github
社区
GitHub
是一个面向开源及私有软件项目的托管平台,因为只支持
Git
作为 唯一的版本库格式进行托管,故名 GitHub
。
GitHub
可以提供给用户空间 创建 Git
仓储,保存用户的一些数据文档或者代码等
GitHub
作为开源代码库以及版本控制系统,目前拥有
140
多万开发者用 户。随着越多的应用程序转移到了云上,GitHub
已经成为了管理软件开发 以及发现已有代码的首选方法。
GitHub
可以托管各种
Git
库,并提供一个
Web
界面,但与其它像 SourceForge 或
Google Code
这样的服务不同,
GitHub
的独特卖点在于 从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:
首先点 击项目站点的“fork”
的按钮,然后将代码检出并将修改加入到刚才分出的代 码库中,最后通过内建的“pull request”
机制向项目负责人申请代码合并。
四、
Gitlab
GitLab
是一个基于
Git
的项目管理软件用于仓库管理系统的开源项目。使 用 Git
作为代码管理工具,并在此基础上搭建起来
Web
服务。 GitLab 主要针对软件开发过程中产生的代码和文档进行管理,支持
group 和 project
两个维度进行代码和文档的管理。其中,
group
是群组,可以有 多个 project
;
project
是工程项目,一个
project
中可能包含多个 branch,意为每个项目中有多个分支,分支间相互独立,不同分支可以进 行归并。GitLab
一站式
DevOps
平台,加速和优化软件开发全生命周期。
五、集中式与分布式的区别
1
、集中式概述
集中式版本控制系统(例如
SVN
)将代码库存储在一台中央服务器上,团队 成员通过客户端从中央服务器获取代码并将更改提交到服务器。这意味着代 码库是集中的,所有开发者都在同一个代码库上工作,并且必须与服务器进 行通信才能查看历史记录和获取代码。因此,如果服务器发生故障或网络中 断,会导致数据丢失,并且开发者将无法使用代码库。
2
、分布式概述
分布式版本控制系统(例如
Git
)则将完整的代码库复制到每个开发者的本 地计算机上,每个开发者都有自己的完整副本,可以在没有网络连接的情况 下继续工作。开发者可以在本地进行代码的修改和提交,然后将更改推送到 其他开发者的本地副本中。因此,代码库是分散的,每个开发者都有自己的 代码库和历史记录,可以独立工作并在不同的分支上开发代码。 像集中式都有一个主版本号,所有的版本迭代都以这个版本号为主,而分布 式因为每个客户端都是服务器,git
没有固定的版本号,但是有一个由哈希 算法算出的 id
,用来回滚用的,同时也有一个
master
仓库,这个仓库是一 切分支仓库的主仓库,我们可以推送提交到 master
并合并到主仓库上,主 仓库的版本号会迭代一次,我们客户端上的 git
版本号无论迭代多少次,都 跟 master
无关,只有合并时
master
才会迭代一次。
3
、整体区别
版本控制系统的集中式和分布式主要在以下三个方面存在区别:
1.
代码库的角色与功能:在集中式版本控制系统中,只有中央服务器上的 代码库扮演中央仓库的角色,可以提供历史版本对比和代码回退等操 作。而在分布式版本控制系统中,每个代码库都可以扮演中央仓库的角 色,都提供中央仓库的功能。
2.
协同开发与代码同步:在集中式版本控制系统中,如果中央仓库发生故 障,那么协同开发就无法进行,各个用户也无法更新最新代码。而在分 布式版本控制系统中,即使本地断网,也可以提交(待联网后 push),可以对比历史版本差异(本地有历史库)。
3.
节点的角色与功能:分布式版本控制的每个节点都是完整仓库(都可以 扮演中央仓库),而集中式版本控制的每个节点只是保存了仓库的某个 版本(无法扮演中央仓库)。 综上所述,版本控制系统的集中式和分布式各有其特点。选择何种方式主要 取决于团队的特定需求和工作流程。六、集中式和分布式的优缺点
1
、分布式
(
1
)优点
1.
灵活性:由于每个节点都有完整的代码库,因此可以更轻松地进行并行 工作,不同的开发人员可以在不同的分支上独立工作,提高工作效率。
2.
可扩展性:由于每个节点都有完整的代码库,因此可以更容易地扩展系 统以适应更大的开发团队或项目需求。
3.
独立性:每个节点都可以独立工作,不需要依赖于中央服务器或其他节 点,提高了系统的可用性和稳定性。
(
2
)缺点
1.
安全性:由于每个节点都有完整的代码库,如果某个节点被攻击或出现 故障,可能会造成源代码泄露,影响到整个系统的安全性。
2.
数据一致性:由于每个节点都有自己的代码库和历史记录,因此在合并 不同节点的更改时可能会出现数据一致性问题。
3.
管理难度:由于分布式系统的复杂性,管理起来相对困难,需要更多的 技术知识和经验。
2
、集中式
(
1
)优点
1.
简单易用:集中式版本控制系统通常具有简单明了的设计,易于理解和 实施。由于所有的决策和处理都由中心节点完成,客户端设备只需执行 简单的操作即可得到所需的服务。
2.
数据安全性:由于所有数据都存储在中央服务器上,因此可以更好地保 护数据的完整性和安全性。
3.
管理方便:集中式版本控制系统通常具有集中的管理和控制能力,可以 更/
容易地进行系统维护和管理。
(
2
)缺点
1.
单点故障:由于整个系统依赖于中心节点,一旦中心节点出现故障或不 可用,整个系统将无法正常运行。这导致系统的可靠性受到了限制,并 增加了系统的风险。
2.
性能瓶颈:在集中式版本控制系统中,所有的数据处理和决策都需要通 过中心节点进行。当系统负载增大时,中心节点可能成为性能瓶颈,限 制了整个系统的处理能力。
3.
可扩展性有限:由于所有的处理都由中心节点完成,集中式版本控制系 统的可扩展性受到限制。当系统需要扩展以满足更大规模的需求时,需 要升级和改变中心节点,导致系统的扩展性有限。
七、
Git
的安装及配置
1
、
Git
安装
[root@YH1 ~]
# yum -y install git
[root@YH1 ~]
# git #
直接输入
git
可通过提示查看到
git
的选项和 参数
2
、配置
git
环境
参数:
config
:配置
git
环境
global
:长命令表示配置整个
git
环境
[root@YH1 ~]
# git config --global user.name "admin" # 配置用户名
[root@YH1 ~]
# git config --global user.email "yh123456@qq.com" # 配置邮箱
八、
Git
的基本流程
1.
在工作目录
(
工作区
)
中修改某些文件
2.
对已修改文件作快照,并保存到暂存区域
git add .
3.
将保存在暂存区的文件快照提交到版本库
git commit -m ""
4.
查看提交历史
git log
1
、创建本地空仓库
init
:初始化当前目录为仓库,初始化后会自动将当前仓库设置为
master 创建本地仓库的条件是需要一个空目录,然后在空目录中初始化你的项目
(
1
)创建一个名为
test
的空项目
[root@YH1 ~]
# mkdir /test #
创建一个空目录
[root@YH1 ~]
# cd /test/
[root@YH1 test]
# git init #
将当前空目录做为
master
仓库
[root@YH1 test]
# ls -a #
查看
git
隐藏的相关的配置文件
. .. .git
[root@YH1 test]
# cd .git/
[root@YH1 .git]
# ls
2
、新建文件添加到本地仓库
add
:将文件添加到缓存区
commit
:提交到本地仓库
(
1
)新建文件并添加到缓存
[root@YH1 test]
# touch test.c
[root@YH1 test]
# ls -a
. .. .git test.c
[root@YH1 test]
# git add test.c
(
2
)提交文件到仓库
使用
-m
命令来简写描述我们的信息,如果不使用
-m
,会调用终端的注释编 辑器来输入描述信息,而不建议使用注释编辑器,因为注释编辑器比较难 用,不舒服。
[root@YH1 test]
# git commit -m "add new file "test.c""
git commit
会为我们生成
40
位的哈希值,用于作为
id
,并把刚刚用
git add 添加到提交缓存区里的文件提交到本地仓库中,便于我们回滚,至此,这个 文件就已经添加到本地仓库中了,同时本地仓库也迭代了一个版本。
3
、查看历史提交信息
[root@YH1 test]
# git log
九、工作目录、暂存区和版本库
1.
工作目录:指当前正在进行修改的文件夹或目录。在这个目录中,开发 者可以添加、修改、删除文件,然后将这些修改提交到Git
中。
2.
暂存区:一个中间区域,它位于工作目录和版本库之间。在这里,开发 者可以将修改后的文件添加到暂存区,以便在提交时将这些修改打包成 一个提交 (
也称为
“
提交
”
或
“
提交记录
”)
。
[root@YH1 test]
# git log
commit 9e89cace2f47e12178fc54f964d01b176b25c968 (HEAD
-
> master)
# 40
位的哈希算法算出的
id
# head->master
表示提交到
master
主仓库,如果是
head->
其他分支,表示提 交到其他分支仓库
Author: admin <yh123456@qq.com>
#
提交者
Date: Wed Nov
15 21
:00:07
2023
+
0800
#
提交时间
add new file test.c
#
提交时写的注释
3.
版本库:存储所有提交历史记录的地方。每个提交都包含一个快照
(
即 项目的状态)
,以及一个指向上一个提交的引用。开发者可以从版本库中 检出历史记录中的任何一个版本,并在工作目录中查看它的状态。 在进行Git
操作时,开发者通常会先将修改添加到暂存区,然后使用
“git commit”命令将这些修改提交到版本库中。提交后,暂存区中的修改会被清 空,工作目录中的文件会与版本库中的文件保持一致。这个过程可以帮助开 发者更好地管理代码的变化,使得代码的版本控制更加清晰和可控。
gitlab及分支管理
一、分支概念
每次提交,
Git
都把它们串成一条时间线,这条时间线就是一个分支。截止 到目前,只有一条时间线,在Git
里,这个分支叫主分支,即
master
分支。 HEAD 严格来说不是指向提交,而是指向
master
,而
master
才是指向提交 的,所以,HEAD
指向的就是当前分支。 开始的时候,master
分支是一条线,
Git
用
master
指向最新的提交,再用 HEAD指向
master
,就能确定当前分支,以及当前分支的提交点。每次提 交,master
分支都会向前移动一步,这样,随着你不断提交,
master
分支 的线也越来越长。
二、创建分支过程
1.
首先,确保你当前在主分支(通常是
master
或
main
分支)上工作。你
可以使用以下命令切换到主分支:
[root@YH1 ~]
# cd /test #
先切换到之前创建
master
主分支
[root@YH1 ~]
# git checkout master #
确保当前操作位置是在主分支上
2.
接下来,使用以下命令创建一个新的分支:
[root@YH1 ~]
# git branch feature-branch
这将创建一个名为
"feature-branch"
的新分支。
3.
现在,你需要切换到新创建的分支上。使用以下命令切换分支:
[root@YH1 ~]
# git checkout feature-branch
[root@YH1 test]
# git branch #
查看当前分支
* feature-branch
#
当前所在哪个分支,哪个分支前面有
*
号
master
也可以使用如下命令直接创建并切换到
"feature-branch"
分支,
-b
选项相当 于执行两条命令,git checkout
和
git branch
。
[root@YH1 ~]
# git checkout -b feature-branch
[root@YH1 test]
# git branch #
跟上面的操作效果一样
* feature-branch
master
这两个操作都将切换到新创建的
"feature-branch"
分支。
4.
在新分支上进行编写,提交更改。你可以使用以下命令添加更改并将更 改提交到本地仓库:
[root@YH1 test]
# vim test.c #
添加新内容
hello
test
[root@YH1 ~]
# git add . #
提交到缓存区,这里也可以写 master分支的目录名,比如
test
[root@YH1 ~]
# git commit -m "
提交消息
" #
提交消息写清注释 信息即可
5.
当代码任务完成后,需要将更改合并回主分支。首先,切换回主分支:
[root@YH1 ~]
# git checkout master
[root@YH1 test]
# git branch
feature-branch
* master
[root@YH1 test]
# cat test.c
#
刚才写入的内容没有了,是因为之前是在其他分支上操作的,并非在
master 上
#
所以切换回
master
后,显示的内容只会是
master
分支上的内容
6.
然后,使用以下命令将你的分支合并到主分支:
[root@YH1 ~]
# git merge feature-branch
[root@YH1 test]
# cat test.c #
合并完成,其他分支的内容被合并 到了master
上
这将把你的
"feature-branch"
分支的更改合并到主分支上。如果存在冲突, 需要手动解决冲突。G
会在冲突的文件中标记出冲突的部分,你需要打开 这些文件并手动编辑以解决冲突。解决冲突后,你需要再次提交更改。
7.
最后,如果你想删除不再需要的分支,可以使用以下命令删除分支:
[root@YH1 ~]
# git branch -d feature-branch
这将删除名为
"feature-branch"
的分支。如果你想强制删除分支(即使该分 支尚未合并),可以使用以下命令:
[root@YH1 ~]
# git branch -D feature-branch
三、解决分支冲突
[root@YH1 test]
# git checkout -b y123 #
创建并切换到新 分支
切换到一个新分支
'y123'
[root@YH1 test]
# vim test.c #
写入点内容
hello
test
yyyy
[root@YH1 test]
# git add test.c #
将新分支写入的内容提交到 缓存
[root@YH1 test]
# git commit -m "yy" #
提交新分支并注释 为“yy”
[y123 32e5a5a] yy
1
file changed,
1
insertion(
+
)
[root@YH1 test]
# git checkout master #
切换到主分支
切换到分支
'master'
[root@YH1 test]
# cat test.c #
此时还未合并,所以只显示当前 master分支的内容
hello
test
[root@YH1 test]
# vim test.c #
向
master
分支内写入些内容
hello
test
hhhh
[root@YH1 test]
# git add test.c #
提交
master
分支
[root@YH1 test]
# git commit -m "hh" #
正式提交,注释信息 为“hh”
[master 4a51362] hh
1
file changed,
1
insertion(
+
)
[root@YH1 test]
# git merge y123 #
合并新分支
自动合并
test.c
冲突(内容):合并冲突于
test.c
#
提示冲突了
自动合并失败,修正冲突然后提交修正的结果。
[root@YH1 test]
# git status # git
状态信息也提示两个分支冲突 了
位于分支
master
您有尚未合并的路径。
(解决冲突并运行
"git commit"
)
(使用
"git merge --abort"
终止合并)
未合并的路径:
(使用
"git add <
文件
>..."
标记解决方案)
双方修改:
test.c
修改尚未加入提交(使用
"git add"
和
/
或
"git commit -a"
)
[root@YH1 test]
# cat test.c # git
使用记号帮我们标记除 了冲突位置和新分支的内容
hello
test
<<<<<<< HEAD
hhhh
=======
yyyy
>>>>>>> y123
1.git
仓库的建立
1.
找到一个空目录
mkdir /test
2.
进入到这个目录
cd /test
3.
执行
git
指令
git init
4.
发现一个隐藏目录
.git
5.test
目录就是工作区域,
.git
就是仓库
[root@YH1 test]
# vim test.c #
手动修改冲突文件
hello
test
hhhh
yyyy
[root@YH1 test]
# git add test.c #
提交修改后的分支
[root@YH1 test]
# git commit -m "zuizhong" #
正式提交, 注释信息为“zuizhong”
[master f13e70e] zuizhong
[root@YH1 test]
# git log --graph --pretty=oneline -- abbrev-commit # 查看日志分析分支合并情况
* f13e70e (HEAD
-
> master) zuizhong
#
当前分支所处位 置为zuizhong
|\
| * 32e5a5a (y123) yy
# y123
分支冲突时所处的分支位置为
yy
* | 4a51362 hh
# master
分支冲突时所处的分支位置为
hh
|/
* 173a360 test
* 9e89cac add new file test.c
[root@YH1 test]
# git branch -d y123 #
删除
y123
分支
已删除分支
y123
(曾为
32e5a5a
)。
[root@YH1 test]
# cat test.c #
查看
master
分支上的最终版
本
hello
test
hhhh
yyyy
1.git
仓库的建立
1.
找到一个空目录
mkdir /test
2.
进入到这个目录
cd /test
3.
执行
git
指令
git init
4.
发现一个隐藏目录
.git
5.test
目录就是工作区域,
.git
就是仓库
[root@YH1 test]
# vim test.c #
手动修改冲突文件
hello
test
hhhh
yyyy
[root@YH1 test]
# git add test.c #
提交修改后的分支
[root@YH1 test]
# git commit -m "zuizhong" #
正式提交,
注释信息为
“zuizhong”
[master f13e70e] zuizhong
[root@YH1 test]
# git log --graph --pretty=oneline --
abbrev-commit #
查看日志分析分支合并情况
* f13e70e (HEAD
-
> master) zuizhong
#
当前分支所处位
置为
zuizhong
|\
| * 32e5a5a (y123) yy
# y123
分支冲突时所处的分支位置为
yy
* | 4a51362 hh
# master
分支冲突时所处的分支位置为
hh
|/
* 173a360 test
* 9e89cac add new file test.c
[root@YH1 test]
# git branch -d y123 #
删除
y123
分支
已删除分支
y123
(曾为
32e5a5a
)。
[root@YH1 test]
# cat test.c #
查看
master
分支上的最终版
本
hello
test
hhhh
yyyy
2.
常用的指令
1.
在
test
目录中修改文件
2.git add .|
文件名 将修改的文件提交的暂存区域
3.git commit -m "
说明
" 将暂存区的数据保存到仓库
4.git log
查看提交日志
3.
分支
1.
让一个项目有多重可能性
2.
分支的创建,删除合并
1.
查看分支
git branch
有几行,就有几个分支,
*
标注当前所在 的分支
2.
切换分支的指令
git checkout
分支名
3.
新增分支
git branch
新分支名
在跳转分支的时候创建
git checkout -b
新分支名
4.
删除分支,要求是分支已经合并
1. git branch -d
分支名
2. git branch -D
分支名
4.
分支冲突
将两个分支合并
git checkout abranch
git merge bbranch
在
a
分支合并
b
分支,a分支和
b
分支都对同一个文件进行了修改,并且
commit
, 合并的时候,就是保分支冲突,需要手动选择再提交就可以了
四、
Git
拉取
再启动一台主机,
YH2
[root@YH2 ~]
# ssh-keygen
[root@YH2 ~]
# ssh-copy-id root@192.168.33.11
[root@YH2 ~]
# yum -y install git
[root@YH2 ~]
# mkdir /yh2 #
新建
git
仓库
[root@YH2 ~]
# cd /yh2/
[root@YH2 yh2]
# git init #
仓库初始化,当前目录作为 master
[root@YH2 yh2]
# git clone 192.168.33.11:/test/.git # 将YH1
的
test
分支克隆到本机
[root@YH2 yh2]
# ls
test
[root@YH2 yh2]
# ls test/
test.c
0000
在码云上创建项目并且
pull
和
push
五、部署
Gitlab
服务器
1
、搭建环境
2
、安装
gitlab
[root@YH1 ~]
# yum -y install git #
安装
git
[root@YH1 ~]
# yum -y install curl openssh-server postfix cronie policycoreutils-python # 安装依赖环境
[root@YH1 ~]
# wget --content-disposition
[root@YH1 ~]
# rpm -ivh gitlab-ce-12.10.14- ce.0.el8.x86_64.rpm
[root@YH1 ~]
# rpm -q gitlab-ce
[root@YH2 ~]
# yum -y install git # YH2
安装
git
3
、加载配置并启动
gitlab
[root@YH1 ~]
# gitlab-ctl reconfigure
4
、浏览器访问
gitlab
当前网站:
http://192.168.33.11
首次登录只设置密码即可,用户名为
root
5
、翻译页面并登录用户
推荐使用
Edge
自带浏览器,可以直接翻译网页
右键点击页面空白处,弹出菜单,点击
“
翻译为中文
”
使用
root
用户登录,密码为首次访问页面时设置的密码
6
、创建项目
点击创建项目
7
、新建主分支
跳转到新页面后,点图中所示的灰色加号,再点新建文件
写清文件名,写好内容,点下面的提交更改
8
、新建其他分支
点击左侧列表的分支,即可看到刚才新建的分支文件,再点击新分支,来创 建其他分支
输入新分支名称(因为翻译缘故,这里叫做分行名称),再点击创建分支
待页面跳转后,再次点击左侧分支项,点合并请求
输入标题
跳转后的页面,点创建文件
写点内容,再点下方的提交更改
点击 解决
WIP
状态
点 合并
9
、客户端克隆分支
使用
YH2
克隆
YH1
建立好的分支
[root@YH2 ~]
# git clone http://192.168.33.11/root/test.git
[root@YH2 ~]
# cd test/
[root@YH2 test]
# ls
123456 666
README.md
[root@YH2 test]
# cat 666
yunjisuan
[root@YH2 test]
# cat 123456
I am yourfather
shell脚本实战
一、系统性能监控脚本
#!/bin/bash
#
系统性能监控脚本
#
时间
Time
=
$(date +"%Y-%m-%d %H:%M:%S")
# ip
ip
=
$(ifconfig ens32 | grep -w inet | awk '{print
$2
}')
#
内存剩余空间
a
=
$(cat /proc/meminfo | grep -i avai | awk '{print
$2
}')
free_mem
=
$((
$a
/ 1024))
#
磁盘剩余空间
b
=
$(df | grep "/
$" | awk '{print
$4
}')
free_disk=$((
$b
/ 1024 / 1024))
#
已登录用户
users
=
$(who | wc -l)
#
当前进程数
procs
=
$(ps aux | wc -l)
warn
=
/root/warning
mkdir
-p
$warn
if
[
$free_mem
-lt
1024
];then
echo
-e
"
$Time
,内存剩余不足
1G
!
\n
当前内存剩余:
$free_mem
\n
主机
IP
:
$ip
"
>>
$warn
/mem_warning
else
echo
"
$Time
,内存剩余容量正常
"
>>
$warn
/mem_warning
fi
if
[
$free_disk
-lt
10
];then
echo
-e
"
$Time
,磁盘剩余不足
10G
!
\n
当前磁盘剩余:
$free_disk
\n
主机
IP
:
$ip
"
>>
$warn
/disk_warning
else
echo
"
$Time
,磁盘剩余容量正常
"
>>
$warn
/disk_warning
fi
if
[
$users
-gt
3
];then
echo
-e
"
$Time
,当前用户登录过多!
\n
当前用户数:
$users
\n
主机
IP
:
$ip
"
>>
$warn
/user_warning
else
echo
"
$Time
,登录用户正常
"
>>
$warn
/user_warning
fi
if
[
$procs
-gt
500
];then
echo
-e
"
$Time
,进程数量过多!
\n
当前进程数:
$procs
\n
主机
IP
:
$ip
"
>>
$warn
/procs_warning
else
echo
"
$Time
,进程数正常
"
>>
$warn
/procs_warning
fi
#!/bin/bash
g
=
'\e[1;32m'
e
=
'\e[0m'
prin(){
echo
-e
"
$1
"
}
cpu_red(){
#
内核数
[
即线程
]
cpu_processor
=
`grep processor /proc/cpuinfo | wc - l`
#CPU
数量
[
即多路
]
cpu_number
=
`cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l`
#CPU
物理内核
cpu_core
=
`cat /proc/cpuinfo | grep "cpu cores" | sed -n '1p' | awk '{print
$4
}'`
#CPU
型号
cpu_info
=
`cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c`
}
mem_red(){
#
总内存
[
单位
MB]
total
=
`free -m | grep -v "Swap" | awk '{print
$2
}' | sed -n "2p"`
used
=
`free -m | grep -v "Swap" | sed -n '2p' | awk '{print
$3
}'`
free
=
`free -m | grep -v "Swap" | sed -n '2p'| awk '{print
$4
}'`
shared
=
`free -m | grep -v "Swap" | sed -n '2p' | awk '{print
$5
}'`
cache
=
`free -m | grep -v "Swap" | sed -n '2p' | awk '{print
$6
}'`
}
print_cpu(){
cpu_red
echo
-e
"CPU
物理数
:
${g}${cpu_number}${e}
\nCPU
内核 数:
${g}${cpu_core}${e}
\nCPU
型号
:
${g}${cpu_info}${e}
"
if
[[
${cpu_core}
==
${cpu_processor}
]];then
echo
-e
"
超线程
:
${g}
支持
${e}
"
else
echo
-e
"
超线程
:
${g}
不支持
${e}
"
fi
}
print_mem(){
mem_red
d
=
"
当前主机内存信息 总内存
:
${g}${total}
MB
${e}
当前已 用:
${g}${used}
MB
${e}
当前可用
:
${g}${free}
MB
${e}
共享占 用:
${g}${shared}
MB
${e}
缓存占用
:
${g}${cache}
MB
${e}
"
for
i
in
$d
;do
prin
"
$i
"
done
}
print_cpu
print_mem
二、菜单脚本
#!/bin/bash
clear
echo
-e
"\033[33m—————————————————————————————————\033[0m"
echo
-e
"|\e[2;12H\033[43;30m
这里是菜单
\033[0m\t\t|"
echo
-e
"\033[33m—————————————————————————————————\033[0m"
echo
-e
"|\e[36m1.
查看网卡信息
\e[0m\t\t\t|"
echo
-e
"|\e[34m2.
查看内存信息
\e[0m\t\t\t|"
echo
-e
"|\e[35m3.
查看磁盘信息
\e[0m\t\t\t|"
echo
-e
"|\e[32m4.
查看
CPU
信息
\e[0m\t\t\t|"
echo
-e
"|\e[33m5.
查看账户信息
\e[0m\t\t\t|"
echo
-e
"\033[33m—————————————————————————————————\033[0m"
echo
read
-p
"
请输入选项
[1-5]
:
"
key
case
$key
in
1
)
ens
=
`ifconfig|head -1|awk -F':' '{print
$1
}'`
ip
=
`ifconfig|head -2|tail -1|awk '{print
$2
}'`
run
=
`ifconfig ens32|head -1|awk -F',' '{print
$3
}'`
echo
-e
"
网卡名称:
$ens
\nIP
地址:
$ip
\n
启动状 态:
$run
"
;;
2
)
a
=
$(free |grep Mem |tr -s " " | cut -d" " -f7)
mem
=
$(echo "scale=2;
$a
/ 1024"|bc -l)
echo
"
当前内存剩余容量:
${mem}
M"
;;
3
)
b
=
$(df | grep /
$
| tr -s " " | cut -d " " -f4)
disk
=
$(echo "scale=2;
$b
/ 1024"|bc -l)
echo
"
当前磁盘剩余容量:
${disk}
M"
;;
4
)
cpu
=
$(uptime | tr -s " " | cut -d" " -f12)
echo
"
本机
CPU
的
15
分钟的平均负载为:
$cpu
"
;;
5
)
login_num
=
$(who | wc -l)
total_num
=
$(cat /etc/passwd | wc -l)
echo
"
当前系统登录账户:
$USER
"
echo
"
当前登陆系统的账户数量为:
$login_number
"
echo
"
当前系统中总
⽤
户数量为:
$total_number
"
;;
*)
echo
"
您输入的序号有误,请重新输入!
"
exit
1
;;
esac
三、
nginx
启动脚本
#!/bin/bash
nginx
=
"/usr/local/nginx"
pid
=
"/usr/local/nginx/logs/nginx.pid"
case
$1
in
start
)
if
[
-f
$pid
];then
echo
-e
"\033[91mNginx
运行 中...\033[0m"
exit
1
else
$nginx
&&
echo
-e
"\033[32mNginx
已 启动 ~\033[0m"
fi
;;
stop
)
if
[ !
-f
$pid
];then
echo
-e
"\033[91mNginx
未运行! \033[0m"
exit
2
else
$nginx
-s
stop
&&
echo
-e
"\033[32mNginx已停止!
\033[0m"
fi
;;
restart
)
if
[ !
-f
$pid
];then
echo
-e
"\033[91mNginx
未运行! \033[0m"
echo
-e
"\033[91m
请先启动
Nginx
!
\033[0m"
exit
3
else
$nginx
-s
stop
&&
$nginx
&&
echo
- e
"\033[32mNginx
已重启!
\033[0m"
fi
;;
status)
if
[
-f
$pid
];then
echo
-e
"\033[32mNginx
运行 中...\033[0m"
else
echo
-e
"\033[91mNginx
未运行! \033[0m"
fi
;;
reload)
if
[ !
-f
$pid
];then
echo
-e
"\033[91mNginx
未运行! \033[0m"
exit
4
else
$nginx
-s
reload &&
echo
-e
"\033[32mNginx配置文件已重新载入
...\033[0m"
fi
;;
*)
echo
"
输入错误!格式:
$0
[start|stop|restart|status|reload]"
;;
esac
四、简易猜拳脚本
#!/bin/bash
computer
=
$[RANDOM
%3
+
1
]
g
=
'\e[1;32m'
e
=
'\e[0m'
clear
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
#\t
石头剪刀布游戏
\t\t#
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
#
${e}
请输入对应序号出拳
\t
${g}
#
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
#
${e}
\t\033[33m1.
剪刀
\033[0m\t\t\t
${g}
#
${e}
"
echo
-e
"
${g}
#
${e}
\t\033[35m2.
石头
\033[0m\t\t\t
${g}
#
${e}
"
echo
-e
"
${g}
#
${e}
\t\033[31m3.
布
\033[0m\t\t\t
${g}
#
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
read
-p
"
请输入序号
[1-3]
:
"
person
case
$person
in
1
)
if
[[
$computer
==
1
]];then
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
您出:剪刀 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机:石头 \t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机赢! \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
elif
[[
$computer
==
2
]];then
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
您出:剪刀 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机:剪刀 \t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
平局 ~\t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
elif
[[
$computer
==
3
]];then
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
您出:剪刀 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机:布 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
恭喜,您获胜! \t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
fi
;;
2
)
if
[[
$computer
==
1
]];then
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
您出:石头 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机:石头 \t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
平局 ~\t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
elif
[[
$computer
==
2
]];then
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
您出:石头 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机:剪刀 \t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
恭喜,您获胜! \t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
elif
[[
$computer
==
3
]];then
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
您出:石头 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机:布 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机赢! \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
fi
;;
3
)
if
[[
$computer
==
1
]];then
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
您出:布 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机:石头 \t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
恭喜,您获胜! \t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
elif
[[
$computer
==
2
]];then
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
您出:布 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机:剪刀 \t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机胜! \t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
elif
[[
$computer
==
3
]];then
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
您出:布 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
计算机:布 \t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
echo
-e
"
${g}
|\t
平局 ~\t\t|
${e}
"
echo
-e
"
${g}
—————————————————————————————————
${e}
"
fi
;;
*)
echo
"
请正确输入出拳序号!
"
exit
1
;;
esac
五、随机双色球脚本
#!/bin/bash
RED_COL
=
'\033[91m'
BLUE_COL
=
'\033[34m'
NONE_COL
=
'\033[0m'
red_ball
=
""
while
:
do
clear
echo
"---
机选双色球
---"
tmp
=
$[RANDOM
%33
+
1
]
if
echo
"
$red_ball
"
|
grep
-q -w
$tmp
;
then
continue
fi
red_ball
+=
"
$tmp
"
echo
-en
"
$RED_COL$red_ball$NONE_COL
"
word
=
$(echo "
$red_ball
" | wc -w)
if
[
$word
-eq
6
];
then
blue_ball
=
$[RANDOM
%16
+
1
]
echo
-e
"
$BLUE_COL $blue_ball$NONE_COL
"
break
fi
sleep
0
.5
done
BLUE_COL
=
'\033[34m'
NONE_COL
=
'\033[0m'
#
使用关联数组来存储选中的红球号码,方便后续检查是否重复选中
declare
-A
red_balls
#
生成
1
到
33
的随机数,检查是否已经选中,如果没有,则添加到
red_balls
数
组并输出
function
select_red_ball {
local
num
=
$(( RANDOM % 33 + 1 ))
if
[[
-z
${red_balls[$num]}
]];
then
red_balls[
$num
]
=
"true"
echo
-e
"
$RED_COL $num$NONE_COL
"
else
#
如果已经选中,则重新选择
select_red_ball
fi
sleep
0
.5
}
#
生成
1
到
16
的随机数,作为蓝球号码并输出
function
select_blue_ball {
local
num
=
$(( RANDOM % 16 + 1 ))
echo
-e
"
$BLUE_COL $num$NONE_COL
"
}
clear
echo
"
红球号码:
"
#
主循环,持续选择红球,直到选够
6
个为止
while
[[
${#red_balls[@]}
-lt
6
]];
do
select_red_ball
done
echo
"
蓝球号码:
"
sleep
0
.5
#
选择蓝球号码并输出
select_blue_ball