保定理工学院
集中实践课程
题 目
Linux实用技术学 院
信息科学与工程学院专 业
20级计算机科学与技术班 级
2005班学 号
40513200514姓 名
胡佳炫指导教师
安娟华2023 年 10 月 15 日
一、实训任务
(一)VMware虚拟机配置、Linux环境安装;
(二)Linux基本语法及常用命令的使用;
(三)shell 脚本基本语法及应用;
(四)shell脚本编写及调试。
二、实训目的
(一)了解当下IT行业及其所涉及到的应用技术;
(二)了解当下流行的操作系统及应用领域;
(三)了解当下linux的应用场景及所需技术;
(四)掌握linux虚拟机基本使用和环境安装;
(五)常用命令的使用;
(六)掌握 shell 脚本基本语法及脚本编辑。
三、实训要求
(一)硬件要求
CPU:需要Pentium以上处理器。
内存:最少需要512MB的内存,如果需要安装图形界面,则至少需要1 GB的内存(推 荐使用4GB)。
硬盘:硬盘必须保证有大于10GB的空间。
(二)软件要求
VMwareworkstation 12以上版本、CentOS Linux 7以上版本。
四、实训目标
(一)实现CentOS Linux环境的搭建;
(二)完成单分支结构、双分支结构、多分支结构脚本的编辑及测试;
(三)完成For循环脚本编辑及测试;
(四)编辑并实现俄罗斯方块小游戏或其他小游戏。
五、实训过程
一、IT行业及其所涉及到的应用技术
(一)IT行业
信息技术(Information Technology,缩写IT),是主要用于管理和处理信息所采用的各 种技术的总称。它主要是应用计算机科学和通信技术来设计、开发、安装和实施信息系统及 应用软件。它也常被称为信息和通信技术(Information and Communications Technology, ICT)。 主要包括传感技术、计算机与智能技术、通信技术和控制技术。
(二)云计算、物联网、大数据、人工智能定义
1.云计算(cloud computing)是分布式计算的一种,指的是通过网络“云”将巨大的数
据计算处理程序分解成无数个小程序,然后,通过多部服务器组成的系统进行处理和分析这 些小程序得到结果并返回给用户。云计算早期,简单地说,就是简单的分布式计算,解决任 务分发,并进行计算结果的合并。因而,云计算又称为网格计算。通过这项技术,可以在很 短的时间内(几秒钟)完成对数以万计的数据的处理,从而达到强大的网络服务。
现阶段所说的云服务已经不单单是一种分布式计算,而是分布式计算、效用计算、负载 均衡、并行计算、网络存储、热备份冗杂和虚拟化等计算机技术混合演进并跃升的结果。
云计算指通过计算机网络(多指因特网)形成的计算能力极强的系统,可存储、集合相关 资源并可按需配置,向用户提供个性化服务。
2.物联网(英文:Internet of Things,缩写:IoT)起源于传媒领域,是信息科技产业的 第三次革命。物联网是指通过信息传感设备,按约定的协议,将任何物体与网络相连接,物 体通过信息传播媒介进行信息交换和通信,以实现智能化识别、定位、跟踪、监管等功能。
在物联网应用中有三项关键,分别是感知层、网络传输层和应用层
3.大数据(big data),或称巨量资料,指的是所涉及的资料量规模巨大到无法透过主流软 件工具,在合理时间内达到撷取、管理、处理、并整理成为帮助企业经营决策更积极目的的 资讯。
在维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》中大数据指不用随 机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。大数据的5V特点(IBM 提出):Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity
(真实性)。
“大数据”一词列出了商务印书馆推出的《汉语新词语词典(2000—2020)》中国这20 年生命活力指数最高的十大“时代新词”。
4. 人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸 和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科 技革命和产业变革的重要驱动力量。
人工智能是智能学科重要的组成部分,它企图了解智能的实质,并生产出一种新的能以 人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、
自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断 扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可 以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可 能超过人的智能。
人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和 哲学等。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉 等等。总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才 能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。2017 年12月,人工智能入选“2017年度中国媒体十大流行语”。2021年9月25日,为促进人工 智能健康发展,《新一代人工智能伦理规范》发布。
(三)云计算、物联网、大数据、人工智能关系
1.物联网、大数据、云计算和人工智能之间存在着比较紧密的联系,从技术体系结构来
看,云计算和大数据是比较接近的,都是以分布式存储和分布式计算为核心,但是云计算主 要提供服务,而大数据主要完成数据的价值化。
2.物联网、大数据、人工智能、云计算,作为当今信息化的四大版块,它们之间有着本 质的联系,具有融合的特质和趋势。从一个广义的人类智慧拟化的实体的视角看,它们是一 个整体:物联网是这个实体的眼睛、耳朵、鼻子和触觉;而大数据是这些触觉到的信息的汇 集与存储;人工智能未来将是掌控这个实体的大脑;云计算可以看做是大脑指挥下的对于大 数据的处理并进行应用。
3.大数据:人工智能的基石
“大数据”就是一种规模大到在获取、管理、分析方面大大超出传统数据库软件工具能 力范围的数据集合。它的运用场景相当广泛:随着大数据应用范围的不断扩大,大数据所形 成的价值正在快速提升。这是一个当之无愧的朝阳行业。主要包括互联网、软件及信息技术 服务业、计算机、高端制造等行业。其产业链十分完善。
4.云计算:人工智能的助推器
根据美国国家标准与技术研究院(NIST)定义:云计算是一种按使用量付费的模式,
这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括 网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理 工作,或与服务供应商进行很少的交互。
通俗来讲,云计算是把所有计算资源集结起来堪看成是一个整体(一朵云)。每个操作 请求都可以按照一定的规则分割成小片段,分发给不同的机器同事运算,每个机器其实只要 做很小的计算就可以,最后将这些计算结果整合,输出给用户。
云计算系统由四个基本部分组成:
目前,云计算包括互联网、传媒、软件及信息技术服务业、计算机、高端制造等行业。
5.物联网:让人工智能更准确
通俗来讲,物联网就是物物相连的互联网。
一直以来,网络连接的对象主要还是人,努力把人与人之间连接起来。现在人都连上了,
是不是可以把世间万物也都连接起来?这就是物联网,通过利用嵌入式技术和无线传感技术 直接或间接将世间万物联系在一起,使它们在网络之中具有和人类一样的地位。
事实上,我们日常生活中有很多地方都应用到了物联网:通过物联网,我们可以对机器、
设备、人员进行集中管理、控制,以及搜索人和物体的位置、状态和信息等,同时通过收集 细微末节的数据,聚集成大数据。
物联网主要由软件及信息技术服务业、计算机、高端制造等产业构成。其产业链包含芯 片提供商、传感器供应商、无线模组(含天线)厂商、网络运营商、平台服务商、系统及软 件开发商、智能硬件厂商、系统集成及应用服务提供商八大环节。
其实,人工智能也好、大数据也好、物联网及云计算也好,彼此依附相互助力,合力搭 档在一起,组合拳出击才更有力量:给未来多一些可能,给未知多一些可能性,给不可能多 一些可能!
二、当下流行的操作系统及应用领域
操作系统(Operating System,简称OS)是一管理电脑硬件与软件资源的程序,同时也
是计算机系统的内核与基石。是控制其他程序运行,管理系统资源并为用户提供操作界面的 系统软件的集合。操作系统的型态非常多样,按应用领域划分主要有三种:桌面操作系统、
服务器操作系统和嵌入式操作系统。
(一)操作系统简介
1.Windows操作系统。
Microsoft Windows中文有译作微软视窗或微软窗口,是微软公司推出的一系列操作系
统。它问世于1985年,起初仅是MS-DOS之下的桌面环境,而后其后续版本逐渐发展成为 个人计算机和服务器用户设计的操作系统, 并最终获得了世界个人计算机操作系统软件的 垄断地位。
2.Unix操作系统。
Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以 作为单机操作系统使用。Unix 作为一种开发平台和台式操作系统获得了广泛使用,主要用 于工程应用和科学计算等领域。
3.Linux操作系统
Linux,全称 GNU/Linux, 是一种免费使用和自由传播的类UNIX 操作系统,其也核由
林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主更受到Minix和Unix思 想的启发,是一个基于 POSIX 的多用户、多任务、支持多线程和多CPU的操作系统。
4.Mac Os 操作系统。
MacOS是一套由草果开发的运行于Macinosh 系列电脑上的操作系统。MacOS 是首个
在商用领域成功的图形用户界面操作系统。MacOS 是基于 XNU 混合内核的图形化操作系 统,一般情况下在普通PC上无法安装的操作系统。
(二)linux的应用场景及所需技术 当前主流的Liux操作系统:
1.RedHat
是相当成功的一个Linux发行版本,也是目前使用最多的Linux发行版本。很多的linux 的发行版本都是从Red Hat Linux中发展出来的。
2.Fedora
是一个开放的、创新的、前瞻性的操作系统和平台,基于Linux。它的操作比较简单(相 对于其他 linux操作系统而言),桌面版的操作形式类似于windows很容易上手。
3.CentOS
CentOS是Community Enterpise Operating System的缩写,也叫做社区企业操作系统。是
企业Liux发行版领头羊Red Hat Enterprse Limux (以下称之为RHEL)的再编译版本。
Linux的应用前景:嵌入式,智能手机系统,银行 ATM,服务器领域,图形图像领域,
数学计算。
三、Linux基本语法及常用命令使用
(一)linux入门
Linux一般有3个主要部分:内核(kemel)、命令解释层(Shell或其他操作环境)、实用工
具。内核是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序。Shell
是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令,
并且是把它送入内核去执行。Shell 是一个命令解释器,它解释由用户输入的命令,并且把 它们送到内核。
(二) Linux 基础俞令
1. Is命令
就是list的缩写,通过Is命令不仅可以查看linux文件夹包含的文件,而且可以查看文 件权限(包括目录、文件夹、文件权限)查看目录信息等等。
常用参数搭配:
Is -a列出目录所有文件,包含以.开始的隐藏文件。
ls -A列出除…及…的其它文件
2.cd 命令(changeDirectory)命令 cd [目录名]
cd/进入要目录 cd~进入"home"目录 3.pwd 命令
pwd 命令用于查看当前工作目录路径 4.cp 命令
将源文件复制至目标文件,或将多个源文件复制至目标目录
注意:命令行复制,如果目标文件已经存在会提示是否覆盖,而在shll脚本中,如果不 加-i参数,则不会提示,而是直接覆盖!
-i 提示
-r 复制目录及目录内所有项目 -a 复制的文件与原文件时间一样 5.less 命令
less与more类似,但使用less可以随意浏览文件,而 more 仅能向前移动,却不能向 后移动,而且less在查看之前不会加载整个文件。
6.find 命令
用于在文件树中查找文件,并作出相应的处理。
命令格式:find pathname -options [print -exec -ok…]
-name按照文件名查找文件-perm按文件权限查找文件-user按文件属主查找文件-group
按照文件所属的组来查找文件。
-type查找某一类型的文件
7.chmod命令
用于改变linux系统文件或目录的访问权限。该命令有两种用法。一种是包含字母和操
作符表达式的文字设定法;另一种是包含数字的数字设定法。
四、linux虚拟机基本使用和环境安装
(一)虚拟机概述
VMWare虚拟机软件是一个“虚拟PC”软件,它使你可以在一台机器上同时运行二个
或更多Windows、DOS、Linux系统。
(二)虚拟机安装
1.常用的虚拟机软件:windows系统常用VMware workstation、Virtual box等软件,macOS
系统建议使用VMware fsion软件。
进入VMware官网(地址:https/www.vmware com/cn.html),点击上方导航栏中的资源,
查看所有商品,找到 Workstaion Pro下载并安装。
2获取镜像
可从以下网址获取相应版本的镜像文件中 https://wiki.centos.org/Download
http://mirrors.aliyun.com http://mirrors.sohu.com http://mirors.163.com 3虚拟拟机配置
CPU:默认选择1颗,可根据计算机硬盘配置选择
内存:IG以上,这里选择1.5G,可通过右侧蓝色箭头上下拖动来调整大小 硬盘:一块硬盘,20G
网卡:桥接或仅主机模式
光盘:在开始创建虚拟机时,选择安装喜户机操作系统界面选最后一项稍后安装操作系 统,这里才能使用对应版本的ISO映像文件。
4. Centos系统安装过程
(1)加载光盘启动后,默认选择的是第二项,这里我们需要按↑键,将选项调到第一项 Instll CentOS,再按enter键。
(2)检测光盘和硬件
选中第一项,直接按回车键,安装程序就会自动去检测硬件,并且会在屏幕上提示相关 的信息,如光盘、硬盘、CPU、串行设备等。这里选择SKIP。
(3)选择安装语言并进行键盘设置
根据自己的需求选择语言种类,这里选择“简体中文”,单击“Next”按钮后。
(4)选择系统使用的存储设备
一般情况下,默认选择“基本存储设备”,再单击“下一步”按钮。
(5)设置计算机名 (6)配置网络
单击界面左下角的“配置网络”按钮,进入配置服务器网络界面,选中“ Systemetb0”, 然后单击“编辑”按钮,可以给etho配置静态卫地址。
(7)选择系统时区
(8)设置root账户密码
(9)为硬盘分区
(10)开始安装软件,注意选择桌面选项,否则安装后没有图形界面。安装完成。
五、shell 脚本基本语法及应用
(一)单分支条件语句格式:
if [条件判断式]
then 程序 fi
只需要一个判断条件,符合则执行,不符合则直接退出。
(二)双分支条件语句格式:
if [条件判断式]
then 程序 1 else 程序 2 Fi
(三)多分支条件语句格式:
if [条件判断式 1]
then 程序 1
elif[条件判断式 2]
then 程序 2 ...
else 程序...
fi
(四)case 判断:
case $变量名 in
“值 1”)
变量的值等于值 1,则执行程序 1
;;
“值 2”)
变量的值等于 2,则执行程序 2
;;
省略多个分支„„„„
*)
变量的值都不匹配上面的值,则执行此程序
;; esac
(五)for 循环:
语法一:
for 变量 in 值 1 值 2 值 3 „„
do 程序 Done 语法二:
for ((初始值;循环控制条件;变量变化)) do
程序 done
(六)脚本实例
#!/bin/bash
APP_NAME="${0##*[\\/]}"
APP_VERSION="1.0"
#颜色定义
iSumColor=7 #颜色总数 cRed=1 #红色
cGreen=2 #绿色 cYellow=3 #黄色 cBlue=4 #蓝色 cFuchsia=5 #紫红色 cCyan=6 #青色(蓝绿色) cWhite=7 #白色
#位置与大小
marginLeft=3 #边框左边距 marginTop=2 #边框上边距
((mapLeft=marginLeft+2)) #棋盘左边距 ((mapTop=$marginTop+1)) #棋盘上边距 mapWidth=10 #棋盘宽度
mapHeight=15 #棋盘高度
#颜色设置 cBorder=$cGreen cScore=$cFuchsia cScoreValue=$cCyan
#控制信号
#游戏使用两个进程,一个用于接收输入,一个用于游戏流程和显示界面;
#当前者接收到上下左右等按键时,通过向后者发送signal的方式通知后者。
sigRotate=25 #向上键
sigLeft=26 sigRight=27 sigDown=28
sigAllDown=29 #空格键 sigExit=30
#方块定义,7大类19种样式
#前8位为方块坐标,后2位为方块刚出现的时候的位置 box0_0=(0 0 0 1 1 0 1 1 0 4)
box1_0=(0 1 1 1 2 1 3 1 0 3) box1_1=(1 0 1 1 1 2 1 3 -1 3) box2_0=(0 0 1 0 1 1 2 1 0 4) box2_1=(0 1 0 2 1 0 1 1 0 3) box3_0=(0 1 1 0 1 1 2 0 0 4) box3_1=(0 0 0 1 1 1 1 2 0 4) box4_0=(0 2 1 0 1 1 1 2 0 3) box4_1=(0 1 1 1 2 1 2 2 0 3) box4_2=(1 0 1 1 1 2 2 0 -1 3) box4_3=(0 0 0 1 1 1 2 1 0 4) box5_0=(0 0 1 0 1 1 1 2 0 3) box5_1=(0 1 0 2 1 1 2 1 0 3) box5_2=(1 0 1 1 1 2 2 2 -1 3) box5_3=(0 1 1 1 2 0 2 1 0 4) box6_0=(0 1 1 0 1 1 1 2 0 3) box6_1=(0 1 1 1 1 2 2 1 0 3) box6_2=(1 0 1 1 1 2 2 1 -1 3) box6_3=(0 1 1 0 1 1 2 1 0 4) iSumType=7 #方块类型总数
boxStyle=(1 2 2 2 4 4 4) #各种方块旋转后可能的样式数目 iScoreEachLevel=50 #提升一个级别需要的分数
#运行时数据
sig=0 #接收到的signal iScore=0 #总分
iLevel=0 #速度级 boxNext=() #下一个方块
iboxNextColor=0 #下一个方块的颜色 iboxNextType=0 #下一个方块的种类 iboxNextStyle=0 #下一个方块的样式 boxCur=() #当前方块的位置定义
iBoxCurColor=0 #当前方块的颜色 iBoxCurType=0 #当前方块的种类 iBoxCurStyle=0 #当前方块的样式 boxCurX=-1 #当前方块的x坐标位置 boxCurY=-1 #当前方块的y坐标位置 map=() #棋盘图表
#初始化所有背景方块为-1, 表示没有方块
for ((i = 0; i < mapHeight * mapWidth; i++)) do
map[$i]=-1 done
#接收输入的进程的主函数 function RunAsKeyReceiver() {
local pidDisplayer key aKey sig cESC sTTY pidDisplayer=$1
aKey=(0 0 0)
cESC=`echo -ne "\033"`
cSpace=`echo -ne "\040"`
#保存终端属性。在read -s读取终端键时,终端的属性会被暂时改变。
#如果在read -s时程序被不幸杀掉,可能会导致终端混乱,
#需要在程序退出时恢复终端属性。
sTTY=`stty -g`
#捕捉退出信号
trap "MyExit;" INT QUIT trap "MyExitNoSub;" $sigExit #隐藏光标
echo -ne "\033[?25l"
while : do
#读取输入。注-s不回显,-n读到一个字符立即返回
read -s -n 1 key aKey[0]=${aKey[1]}
aKey[1]=${aKey[2]}
aKey[2]=$key sig=0
#判断输入了何种键
if [[ $key == $cESC && ${aKey[1]} == $cESC ]]
then #ESC键 MyExit
elif [[ ${aKey[0]} == $cESC && ${aKey[1]} == "[" ]]
then
if [[ $key == "A" ]]; then sig=$sigRotate #<向上键>
elif [[ $key == "B" ]]; then sig=$sigDown #<向下键>
elif [[ $key == "D" ]]; then sig=$sigLeft #<向左键>
elif [[ $key == "C" ]]; then sig=$sigRight #<向右键>
fi
elif [[ $key == "W" || $key == "w" ]]; then sig=$sigRotate #W, w elif [[ $key == "S" || $key == "s" ]]; then sig=$sigDown #S, s elif [[ $key == "A" || $key == "a" ]]; then sig=$sigLeft #A, a elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight #D, d elif [[ "[$key]" == "[]" ]]; then sig=$sigAllDown #空格键 elif [[ $key == "Q" || $key == "q" ]] #Q, q
then MyExit fi
if [[ $sig != 0 ]]
then
#向另一进程发送消息 kill -$sig $pidDisplayer fi
done }
#退出前的恢复 MyExitNoSub() {
local y
#恢复终端属性 stty $sTTY
((y = marginTop + mapHeight + 4)) #显示光标
echo -e "\033[?25h\033[${y};0H"
exit }
MyExit()
{
#通知显示进程需要退出 kill -$sigExit $pidDisplayer MyExitNoSub
}
#处理显示和游戏流程的主函数 RunAsDisplayer()
{
local sigThis InitDraw
#挂载各种信号的处理函数 trap "sig=$sigRotate;" $sigRotate trap "sig=$sigLeft;" $sigLeft trap "sig=$sigRight;" $sigRight trap "sig=$sigDown;" $sigDown trap "sig=$sigAllDown;" $sigAllDown trap "ShowExit;" $sigExit
while : do
#根据当前的速度级iLevel不同,设定相应的循环的次数
for ((i = 0; i < 21 - iLevel; i++)) do
sleep 0.02 sigThis=$sig sig=0
#根据sig变量判断是否接受到相应的信号
if ((sigThis == sigRotate)); then BoxRotate; #旋转 elif ((sigThis == sigLeft)); then BoxLeft; #左移一列 elif ((sigThis == sigRight)); then BoxRight; #右移一列 elif ((sigThis == sigDown)); then BoxDown; #下落一行
elif ((sigThis == sigAllDown)); then BoxAllDown; #下落到底 fi
done
#kill -$sigDown $$
BoxDown #下落一行 done
}
#绘制当前方块,传第一个参数,0表示擦除当前方块,1表示绘制当前方块
DrawCurBox() {
local i x y bErase sBox bErase=$1
if (( bErase == 0 )) then
sBox="\040\040" #用两个空格擦除 else
sBox="[]"
echo -ne "\033[1m\033[3${iBoxCurColor}m\033[4${iBoxCurColor}m"
fi
for ((i = 0; i < 8; i += 2)) do
((y = mapTop + 1 + ${boxCur[$i]} + boxCurY))
((x = mapLeft + 1 + 2 * (boxCurX + ${boxCur[$i + 1]}))) echo -ne "\033[${y};${x}H${sBox}"
done
echo -ne "\033[0m"
}
#移动方块
#BoxMove(y, x), 测试是否可以把移动中的方块移到(y, x)的位置, 返回0则可以, 1不可
以
BoxMove() {
local i x y xPos yPos yPos=$1
xPos=$2
for ((i = 0; i < 8; i += 2)) do
#方块相对于棋盘坐标 ((y = yPos + ${boxCur[$i]})) ((x = xPos + ${boxCur[$i + 1]}))
if (( y < 0 || y >= mapHeight || x < 0 || x >= mapWidth)) then
#撞到墙壁了 return 1 fi
if (( ${map[y * mapWidth + x]} != -1 ))
then
#撞到其他已经存在的方块了 return 1
fi done return 0;
}
#将方块贴到棋盘上 Box2Map()
{
local i j x y line
#将当前移动中的方块贴到棋盘对应的区域 for ((i = 0; i < 8; i += 2))
do
#计算方块相对于棋盘的坐标 ((y = ${boxCur[$i]} + boxCurY)) ((x = ${boxCur[$i + 1]} + boxCurX))
map[y*mapWidth+x]=$iBoxCurColor #将方块颜色赋给地图 done
line=0
for ((i = 0; i < mapHeight; i++)) do
for ((j = 0; j < mapWidth; j++)) do
#如果棋盘上有空隙,跳出循环
[[ ${map[i*mapWidth+j]} -eq -1 ]] && break done
[ $j -lt $mapWidth ] && continue #说明当前行可消去,可消去行数加一 (( line++ ))
#第i行可被消除,将0行至第i-1行全部下移一行,从第i-1行开始移动
for ((j = i*mapWidth-1; j >= 0; j--)) do
((x = j + mapWidth)) map[$x]=${map[$j]}
done
#因为下移一行,第0行置空
for ((i = 0; i < mapWidth; i++))
do
map[$i]=-1 done
done
[ $line -eq 0 ] && return
#根据消去的行数line计算分数和速度级
((x = marginLeft + mapWidth * 2 + 7)) ((y = marginTop + 11))
((iScore += line * 2 - 1)) #显示新的分数
echo -ne "\033[1m\033[3${cScoreValue}m\033[${y};${x}H${iScore} "
if ((iScore % iScoreEachLevel < line * 2 - 1)) then
if ((iLevel < 20)) then
((iLevel++))
((y = marginTop + 14)) #显示新的速度级
echo -ne "\033[3${cScoreValue}m\033[${y};${x}H${iLevel} "
fi fi
echo -ne "\033[0m"
#重新显示背景方块
for ((i = 0; i < mapHeight; i++)) do
#棋盘相对于屏幕的坐标 ((y = i + mapTop + 1)) ((x = mapLeft + 1))
echo -ne "\033[${y};${x}H"
for ((j = 0; j < mapWidth; j++)) do
((tmp = i * mapWidth + j)) if ((${map[$tmp]} == -1)) then
echo -ne " "
else
echo -ne "\033[1m\033[3${map[$tmp]}m\033[4${map[$tmp]}m[]\033[0m"
fi
done done }
#左移一格 BoxLeft() {
local x
((x = boxCurX - 1)) if BoxMove $boxCurY $x then
DrawCurBox 0 ((boxCurX = x)) DrawCurBox 1 fi
}
#右移一格 BoxRight() {
local x
((x = boxCurX + 1)) if BoxMove $boxCurY $x then
DrawCurBox 0 ((boxCurX = x)) DrawCurBox 1 fi
}
#向下移一格 BoxDown() {
local y
((y = boxCurY + 1)) #新的y坐标
if BoxMove $y $boxCurX #测试是否可以下落一行 then
DrawCurBox 0 #将旧的方块抹去 ((boxCurY = y))
DrawCurBox 1 #显示新的下落后方块 else
#走到这儿, 如果不能下落了
Box2Map #将当前移动中的方块贴到背景方块中 CreateBox #产生新的方块
fi }
#下落到底 BoxAllDown() {
local y iDown
#计算能够下落的行数 iDown=0
(( y = boxCurY + 1 ))
while BoxMove $y $boxCurX do
(( y++ )) (( iDown++ )) done
DrawCurBox 0 #将旧的方块抹去 ((boxCurY += iDown))
DrawCurBox 1 #显示新的下落后的方块
Box2Map #将当前移动中的方块贴到背景方块中 CreateBox #产生新的方块
}
#翻转 BoxRotate() {
[ ${boxStyle[$iBoxCurType]} -eq 1 ] && return
((rotateStyle = (iBoxCurStyle + 1) % ${boxStyle[$iBoxCurType]}))
#将当前方块保存到boxTmp
boxTmp=( `eval 'echo ${boxCur[@]}'` )
boxCur=( `eval 'echo ${box'$iBoxCurType'_'$rotateStyle'[@]}'` ) if BoxMove $boxCurY $boxCurX #测试旋转后是否有空间放的下 then
#抹去旧的方块
boxCur=( `eval 'echo ${boxTmp[@]}'` ) DrawCurBox 0
boxCur=( `eval 'echo ${box'$iBoxCurType'_'$rotateStyle'[@]}'` ) DrawCurBox 1
iBoxCurStyle=$rotateStyle else
#不能旋转,还是继续使用老的样式 boxCur=( `eval 'echo ${boxTmp[@]}'` ) fi
}
#准备下一个方块 PrepareNextBox() {
local i x y
#清除右边预显示的方块
if (( ${#boxNext[@]} != 0 )); then for ((i = 0; i < 8; i += 2)) do
((y = marginTop + 1 + ${boxNext[$i]}))
((x = marginLeft + 2 * mapWidth + 7 + 2 * ${boxNext[$i + 1]})) echo -ne "\033[${y};${x}H\040\040"
done fi
#随机生成预显式方块
(( iBoxNextType = RANDOM % iSumType ))
(( iBoxNextStyle = RANDOM % ${boxStyle[$iBoxNextType]} )) (( iBoxNextColor = RANDOM % $iSumColor + 1 ))
boxNext=( `eval 'echo ${box'$iBoxNextType'_'$iBoxNextStyle'[@]}'` ) #显示右边预显示的方块
echo -ne "\033[1m\033[3${iBoxNextColor}m\033[4${iBoxNextColor}m"
for ((i = 0; i < 8; i += 2)) do
((y = marginTop + 1 + ${boxNext[$i]}))
((x = marginLeft + 2 * mapWidth + 7 + 2 * ${boxNext[$i + 1]})) echo -ne "\033[${y};${x}H[]"
done
echo -ne "\033[0m"
}
#显示新方块 CreateBox() {
if (( ${#boxCur[@]} == 0 )); then
#当前方块不存在
(( iBoxCurType = RANDOM % iSumType ))
(( iBoxCurStyle = RANDOM % ${boxStyle[$iBoxCurType]} )) (( iBoxCurColor = RANDOM % $iSumColor + 1 ))
else
#当前方块已存在, 将下一个方块赋给当前方块
iBoxCurType=$iBoxNextType;
iBoxCurStyle=$iBoxNextStyle;
iBoxCurColor=$iBoxNextColor fi
#当前方块数组
boxCur=( `eval 'echo ${box'$iBoxCurType'_'$iBoxCurStyle'[@]}'` ) #初始化方块起始坐标
boxCurY=boxCur[8];
boxCurX=boxCur[9];
DrawCurBox 1 #绘制当前方块 if ! BoxMove $boxCurY $boxCurX then
kill -$sigExit $PPID ShowExit
fi
PrepareNextBox }
#绘制边框 DrawBorder() {
clear
local i y x1 x2 #显示边框
echo -ne "\033[1m\033[3${cBorder}m\033[4${cBorder}m"
((x1 = marginLeft + 1)) #左边框x坐标 ((x2 = x1 + 2 + mapWidth * 2)) #右边框x坐标 for ((i = 0; i < mapHeight; i++))
do
((y = i + marginTop + 2))
echo -ne "\033[${y};${x1}H||" #绘制左边框 echo -ne "\033[${y};${x2}H||" #绘制右边框 done
((x1 = marginTop + mapHeight + 2)) for ((i = 0; i < mapWidth + 2; i++)) do
((y = i * 2 + marginLeft + 1))
echo -ne "\033[${mapTop};${y}H==" #绘制上边框 echo -ne "\033[${x1};${y}H==" #绘制下边框 done
echo -ne "\033[0m"
#显示"Score"和"Level"字样 echo -ne "\033[1m"
((y = marginLeft + mapWidth * 2 + 7)) ((x1 = marginTop + 10))
echo -ne "\033[3${cScore}m\033[${x1};${y}HScore"
((x1 = marginTop + 11))
echo -ne "\033[3${cScoreValue}m\033[${x1};${y}H${iScore}"
((x1 = marginTop + 13))
echo -ne "\033[3${cScore}m\033[${x1};${y}HLevel"
((x1 = marginTop + 14))
echo -ne "\033[3${cScoreValue}m\033[${x1};${y}H${iLevel}"
echo -ne "\033[0m"
}
InitDraw() {
clear #清屏
DrawBorder #绘制边框 CreateBox #创建方块 }
#退出时显示GameOVer!
ShowExit() {
local y
((y = mapHeight + mapTop + 3))
echo -e "\033[${y};1HGameOver!\033[0m"
exit }
#游戏主程序在这儿开始.
if [[ "$1" == "--version" ]]; then
echo "$APP_NAME $APP_VERSION"
elif [[ "$1" == "--show" ]]; then
#当发现具有参数--show时,运行显示函数
RunAsDisplayer else
bash $0 --show& #以参数--show将本程序再运行一遍 RunAsKeyReceiver $! #以上一行产生的进程的进程号作为参数 fi
六、实训测试
1. 测试实践环境:CentOS 7
2. 测试实践环境:Xshell 7
3. 单分支结构:判断目录是否存在,不存在则创建目录 代码如下: [root@bdlgxgxy ~]# vim mkbdlg.sh
输入以下内容:
#!/bin/bash
DIR="/home/bdlg"
if [ ! -e $DIR ] then
mkdir -p $DIR fi
测试分析:
[root@bdlgxgxy ~]# ls -d /home/bdlg /home/bdlg
4. 双分支结构:测试主机是否在线 代码如下:
[root@bdlgxgxy ~]# vim chkhost.sh 输入以下内容:
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &>/dev/null if [ $? -eq 0 ]
then
echo "Host $1 is on-line"
else
echo "Host $1 is off-line"
fi
测试分析:
[root@bdlgxgxy ~]# bash chkhost.sh 192.168.229.100 注意以自己的主机IP为参数进 行测试
Host 192.168.229.100 is on-line
[root@bdlgxgxy ~]# bash chkhost.sh 192.168.229.111
Host 192.168.229.111 is off-line
5. 多分支结构:成绩等级划分 代码如下:
[root@bdlgxgxy ~]# vim chkscore.sh 输入以下内容:
#!/bin/bash
read -p "Enter your score(0-100):" GRADE
if [ $GRADE -ge 90 ] && [ $GRADE -le 100 ];then echo "$GRADE is优秀"
elif [ $GRADE -ge 80 ] && [ $GRADE -le 89 ];then echo "$GRADE is 良好"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 79 ];then echo "$GRADE is 中等"
elif [ $GRADE -ge 60 ] && [ $GRADE -le 69 ];then echo "$GRADE is 及格"
elif [ $GRADE -ge 0 ] && [ $GRADE -le 59 ];then echo "$GRADE is 不及格"
else
echo "$GRADE is error"
fi
6. case判断:判断输入的字符类型
代码如下:
[root@bdlg ~]# vim Checkkeys.sh 输入以下内容:
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是字母。"
;;
[0-9])
echo "您输入的是数字。"
;;
*)
echo "您输入的是空格、功能键或其他控制字符。"
esac
测试分析如下:
[root@bdlg ~]# bash Checkkeys.sh 请输入一个字符,并按Enter键确认:8 您输入的是数字。
[root@bdlg ~]# bash Checkkeys.sh 请输入一个字符,并按Enter键确认:p 您输入的是字母。
[root@bdlg ~]# bash Checkkeys.sh 请输入一个字符,并按Enter键确认:
您输入的是空格、功能键或其他控制字符。
7. for循环: 求1+2+3+……n的和
代码如下:
[root@bdlgxgxy ~]# vim sum.sh 输入以下内容:
#!/bin/bash i=1 sum=0
read -p "please input a num :" num for ((i=1;i<=$num;i++))
do
let sum=$sum+$i done
echo $sum
8. 综合实践:俄罗斯方块小游戏
七、实训心得
Linux作为一种开源的操作系统,具有良好的稳定性、安全性和灵活性,因此在计算机
领域有着广泛的应用和学习价值。在我学习Linux的过程中,我深深体会到了它带给我的种 种好处和挑战。下面分享我对Linux学习的心得体会。
Linux俄罗斯方块游戏的技术要点有:需要定义俄罗斯方块的大小、形状、颜色;可以
使用数据结构来组织俄罗斯方块的移动规则;可以使用循环函数来控制俄罗斯方块的掉落、
旋转、改变位置等操作;游戏可以定义不同的得分系统,使游戏更加好玩有趣。
在Linux实训中,我学会了基本的Linux操作命令,能够更快地完成一些常见操作,掌
握Linux系统的基本概念和常用命令。对Linux文件系统的层级结构、文件和目录的权限和
属性有了更深入的理解,掌握了挂载和卸载文件系统、格式化和分区硬盘等操作。学会了使
用Shell脚本,能够高效地完成一些重复性的任务,提高工作效率。学习Linux是一个长期
的过程,需要坚持使用它,特别是在学习初期,通过实践来实现。
总的来说,Linux实训让我对Linux有了一定的了解,掌握了Linux系统的基本操作和 技能,但学习Linux还需要持续学习和实践,后面要更加坚持不断学习!
保 定 理 工 学 院 集 中 实 践 成 绩 评 定 表
学生姓名 胡佳炫 学 号 40513200514 班 级 计算机2005班 指导教师 安娟华 职 称 研究生(未评级) 单 位 信息科学与工程学院
集中实践项目: Linux 实用技术
集 中 实 践 内 容 提 要
一、IT行业及其所涉及到的应用技术 二、当下流行的操作系统及应用领域 三、Linux基本语法及常用命令的使用 四、linux虚拟机基本使用和环境安装 五、shell 脚本基本语法及应用 六、shell脚本编写及调试
评 语
1、优秀
该生在实训过程中,能够按照实训大纲要求,按期高质量完成实训任务,完 整的实现了所有实训项目。在实训过程中,严格遵守实训纪律,刻苦认真。实训 报告内容详细,逻辑清楚,格式完全符合要求。实训过程中表现突出。实训过程 认真、能够独立解决实训过程中出现的问题。 ( )
2、良好
该生在实训过程中,能够按照实训大纲要求,按期较高质量完成实训任务,
完整的实现了所有实训项目。在实训过程中,严格遵守实训纪律。实训报告内容 详细,格式完全符合要求。实训过程中表现良好。实训过程认真、能够解决实训 过程中出现的问题。 ( )
3、中等
该生在实训过程中,能够按照实训大纲要求,按期完成实训任务。在实训过 程中,遵守实训纪律。实训报告内容比较详细,格式符合要求。实训过程中表现 中等。 ( )
4、及格
该生在实训过程中,能够按照实训大纲要求,按期完成实训任务。在实训过 程中,遵守实训纪律。实训报告内容一般,格式符合要求。实训过程中表现较好。
( ) 5、不及格
该生在实训过程中,不能按照实训大纲要求完成实训任务。在实训过程中,
不遵守实训纪律,出勤率低。实训报告不合格。实训过程中表现不及格。 ( )