Shell 课程的课设分享

发布时间 2023-11-12 16:28:45作者: aprict

程序功能

用于实现一个综合应用程序,包括打印常用Shell命令手册、石头剪刀布游戏和加减乘除计算器。

程序结构

 运行截图

 

 

 

 

 

 

 

 

 代码实现

  1 #!/bin/bash
  2 #一个综合应用脚本程序
  3 
  4 # 安装必备工具
  5 function init {
  6     case $1 in
  7         1 )
  8             sudo apt-get install bc dialog;;
  9         2 )
 10             sudo dnf install bc dialog;;
 11         # 其他Linux发行版的包管理工具可以自行添加
 12         * )
 13             echo "程序退出成功"
 14             exit 0;;
 15     esac
 16 }
 17 
 18 # 检测是否有安装bc与dialog包,若无将通无法运行该脚本,将进行安装
 19 which bc dialog
 20 if [[ $?  -ne 0 ]]; then
 21     echo "即将安装dialog"
 22     echo "1. Debian "
 23     echo "2. Red Hat "
 24     echo "3. 退出安装 "
 25     read -p "请选择您的系统发行版本:" sys
 26     init $sys
 27 fi
 28 
 29 # 使用mktemp生成临时文件进行程序的临时数据记录
 30 # 负责记录综合应用菜单(主菜单)的选择
 31 mian_select=`mktemp main_select.XXXXXX`
 32 # 负责记录shell命令类别的选择
 33 commands_select=`mktemp commands_select.XXXXXX`
 34 # 负责记录剪刀石头布的玩家出拳
 35 stonegame_select=`mktemp stonegame_select.XXXXXX`
 36 # 负责记录计算器的选择
 37 calculator_select=`mktemp calculator_select.XXXXXX`
 38 
 39 # 负责记录计算数字
 40 number=`mktemp number.XXXXXX`
 41 
 42 # 打印常用的shell命令的代码块-开始
 43 function commands_menu {
 44     # 该函数负责打印类别的选择,一共8大类
 45     # 通过dialog的menu选择需要打印的shell命令
 46     dialog --title "常用shell命令"\
 47          --menu "请您选择需要查看的手册" 11 44 10\
 48               1 "文件、目录操作命令"\
 49               2 "查看文件内容命令"\
 50               3 "基本系统命令"\
 51               4 "监视系统状态命令"\
 52               5 "磁盘操作命令"\
 53               6 "用户和组相关命令"\
 54               7 "压缩命令"\
 55               8 "网络相关命令" 2> $commands_select # 重定向覆盖
 56 }
 57 
 58 function commands_endtxt {
 59     # 该函数负责退出打印手册的信息
 60     # 使用dialog的msgbox实现
 61     dialog --title "常用shell命令"\
 62          --msgbox " \n\n\n手册查询结束,感谢您的使用!"\
 63               11 44
 64 }
 65 
 66 function commands_out {
 67     # 该函数负责打印shell手册
 68     # 使用dialog的textbox输出选择的shell命令手册
 69     # 每一类都放在shell1~8.txt文件中
 70     n=`cat $commands_select` # 读取在commands_menu选择的值
 71     dialog --title "常用shell命令"\
 72         --textbox shell$n.txt 20 50
 73         # 输出储存在shelln.txt文件中的shell,n为类别号
 74 }
 75 
 76 function shell_commands {
 77     # 该函数为打印常见shell命令的功能入口
 78     while [[ 1 ]]; do
 79         commands_menu
 80         # 若在commands_menu中选择取消,
 81         # 则会返回1值,此时退出打印功能,并提醒用户
 82         if [[ $? -eq 1 ]]; then
 83             commands_endtxt
 84             break
 85         fi
 86         commands_out
 87     done
 88 }
 89 # 打印常用的shell命令的代码块-结束
 90 
 91 # 石头剪刀布的代码块-开始
 92 function stonegame_menu {
 93     # 该函数负责游戏主菜单
 94     # 使用dialog的menu进行出拳选择
 95     dialog --title "石头剪刀布"\
 96          --menu "请您出拳:" 11 44 10\
 97              1 "石头"\
 98              2 "剪刀"\
 99              3 "" 2> $stonegame_select #选择结果重定向
100 }
101 
102 function stonegame_endtxt {
103     # 该函数负责游戏结束信息提醒
104     # 使用dialog的msgbox进行信息输出
105     dialog --title "石头剪刀布"\
106          --msgbox " \n\n\n游戏结束,感谢您的使用!"\
107          11 44
108 }
109 
110 function stonegame_play {
111     # 该函数负责游戏的输赢逻辑判断
112     # 接受3个参数,$1为玩家出拳信息,$2为电脑
113     # $3为游戏得分
114     card_lib=("石头" "剪刀" "")
115     # 重定向覆盖游戏信息
116     echo "您出${card_lib[$1-1]}" > gametxt
117     # 重定向追加
118     echo "电脑出${card_lib[$2-1]}" >> gametxt
119     # 逻辑判断
120     # 石头为1, 遇到剪刀2才能赢,$3为 1 - 2 = -1
121     # 遇到布3输,$3为 1 - 3 = -2,
122     # 同理推出输赢表 $1 $2 $3 游戏结果
123     # 1 1 0 平局        2 1 1 电脑赢        3 1 2 玩家赢
124     # 1 2 -1 玩家赢  2 2 0 平局        3 2 1 电脑赢
125     # 1 3 -2 电脑赢  2 3 -1 玩家赢    3 3 0 平局
126     case $3 in
127         -1 | 2 )
128             echo "您赢了" >> gametxt;;
129         1 | -2 )
130             echo "电脑赢了" >> gametxt;;
131         0 )
132             echo "平局" >> gametxt;;
133     esac
134 }
135 
136 function stonegame_out {
137     # 该函数负责输出游戏结果
138     dialog --title "石头剪刀布"\
139          --textbox gametxt 11 44
140 }
141 
142 function shell_stonegame {
143     # 该函数为石头剪刀布游戏入口
144     # 调用函数完成功能
145     while [[ 1 ]]; do
146         clear
147         stonegame_menu
148         # 如果在stonegame_menu函数中选择取消,
149         # 则dialog会返回1,视为退出游戏
150         if [[ $? -eq 1 ]]; then
151             stonegame_endtxt
152             break
153         fi
154         # 读取stonegame_menu函数选择数值,生成玩家的出拳
155         player=`cat $stonegame_select`
156         # 产生1~3的随机数,模拟电脑出拳
157         computer=$[RANDOM%3+1]
158         # score判断计分
159         score=$[$player-$computer]
160         stonegame_play $player $computer $score
161         stonegame_out
162     done
163 }
164 # 石头剪刀布的代码块-结束
165 
166 # 加减计算器的代码块-开始
167 # 加减计算器的菜单
168 function calculator_menu {
169     dialog --title "加减乘除计算器"\
170          --menu "请您填充好数据与运算符,再进行计算" 11 44 10\
171          1 "操作数1"\
172          2 "运算符"\
173          3 "操作数2"\
174          4 "计算结果" 2> $calculator_select
175 }
176 
177 # 结束信息提醒
178 function calculator_endtxt {
179     dialog --title "加减乘除计算器"\
180          --msgbox " \n\n\n计算器已成功关闭" 11 44
181 }
182 
183 # 数字初始化
184 function scanner_number {
185     dialog --title "加减乘除计算器"\
186          --inputbox "请输入一个数"\
187          11 44 2> $number # 
188     num=`cat $number`
189     if [[ $num =~ ^([0-9]*|d*.d{1}?d*)$ ]]; then
190         case $1 in
191         1 )
192             echo "$num" > calculator_number1;;
193         2 )
194             echo "$num" > calculator_number2;;
195         esac
196     else
197         dialog --title "加减乘除计算器"\
198             --msgbox " \n\n\n您输出的不是数字" 11 44
199     fi
200 }
201 
202 # 选择运算符
203 function scanner_operator {
204     dialog --title "加减乘除计算器"\
205          --menu "请选择运算符" 11 44 10\
206          1 "加号 +"\
207          2 "减号 -"\
208          3 "乘号 ×"\
209          4 "除号 /" 2> calculator_operator
210 }
211 
212 # 计算器运行
213 function run {
214     clib=('+' '-' 'x' '/')
215     number1=`cat calculator_number1`
216     number2=`cat calculator_number2`
217     operator=`cat calculator_operator`
218     echo "$number1 ${clib[operator-1]} $number2 的结果为:" > numtxt
219     case $operator in
220         1 )
221             echo "scale=2;$number1+$number2" | bc >> numtxt;;
222         2 )
223             echo "scale=2;$number1-$number2" | bc >> numtxt;;
224         3 )
225             echo "scale=2;$number1*$number2" | bc >> numtxt;;
226         4 )
227             echo "scale=2;$number1/$number2" | bc >> numtxt;;
228     esac
229     dialog --title "加减乘除计算器"\
230           --textbox numtxt 11 44
231 }
232 
233 # 数据初始化
234 function calculator_init {
235     selection=`cat $calculator_select`
236     case $selection in
237         1 )
238             scanner_number 1;;
239         2 )
240             scanner_operator;;
241         3 )
242             scanner_number 2;;
243         4 )
244             run;;
245     esac
246 }
247 
248 function shell_calculator {
249     #该函数为计算器入口
250     echo "0" > calculator_number1
251     echo "0" > calculator_number2
252     echo "1" > calculator_operator
253     while [[ 1 ]]; do
254         clear
255         calculator_menu
256         if [[ $? -eq 1 ]]; then
257         calculator_endtxt
258         break
259         fi
260         calculator_init
261     done
262 }
263 # 加减乘除计算器的代码块-结束
264 
265 # 主程序菜单
266 function mian_menu {
267     dialog --title "综合应用脚本程序"\
268      --menu "请选择功能:" 10 44 10\
269          1 "打印shell命令"\
270          2 "石头剪刀布游戏"\
271          3 "加减乘除计算器" 2> $mian_select
272 }
273 
274 # 主要的运行
275 mainRunopen=1
276 while [[ $mainRunopen -eq 1 ]]; do
277     clear
278     mian_menu
279     MS=`cat $mian_select`
280     case $MS in
281     1)
282         shell_commands;;
283     2)
284         shell_stonegame;;
285     3)
286         shell_calculator;;
287     *)
288         dialog --msgbox " \n\n\n退出成功,感谢您的使用!"\
289              11 44
290         mainRunopen=0
291         break;;
292     esac
293 done
294 
295 # rm -f $ 2> /dev/null
296 rm -f $mian_select 2> /dev/null
297 rm -f $commands_select 2> /dev/null
298 rm -f $stonegame_select 2> /dev/null
299 rm -f $calculator_select 2> /dev/null
300 rm -f gametxt 2> /dev/null
301 rm -f $number 2> /dev/null
302 rm -f calculator_number1 2> /dev/null
303 rm -f calculator_number2 2> /dev/null
304 rm -f calculator_operator 2> /dev/null
305 rm -f numtxt 2> /dev/null
306 # 确保退出时执行所有清理操作
307 exit 0