分布式版本控制系统、gitlab及分支管理、shell脚本实战

分布式版本控制系统
一、 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

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值