Linux程序员福利 - 追女友神奇(Linux终端运行炫酷程序)
概述
详细
一、功能简介
作为IT人员,给同事的感觉呆板,不会会浪漫,不懂情趣。其实不然,我们可以用我们的技能创造出IT人员独有的浪漫。girlLove脚本就可以实现IT人员的浪漫。girlLove本质上是一个简易的问答系统,通过设置不同的问题和答案来实现“浪漫”效果。读者通过改写该脚本,可以很轻松的实现一个基于Linux终端的调查系统或考试系统等。
二、实现方法
girlLlove脚本可以展示如下几个部分:文字特效(poetry),问题(question),问题选项(bakans),答案(answer)和提示(tips)。这些内容都保存在shell数组(girlLove.txt文件)中,并且是一一对应的关系,在主程序girlLove.sh中通过while循环一个一个的展示出来。以上各部分的具体内容都可以在girlLove.txt文件中设定,设定的选项数量和用户的屏幕相关,如果读者显示屏幕过小,则选项数量多了有可能产生位置偏移等影响。
1. 终端上的字是输出在指定位置的,通过以下代码记录终端的X/Y轴信息
1 2 3 4 5 6 7 | # pos_stdy:输出位置为 2/3 x 终端Y轴长度;pos_stdx:输出位置为 1/2 x 终端X轴长度 pos_stdy= "$(($(stty size|cut -d' ' -f1) / 3 * 2))" pos_stdx= "$(($(stty size|cut -d' ' -f2) / 2))" # total_stdx:终端X轴长度,total_stdy:终端Y轴长度 total_stdy= "$(($(stty size|cut -d' ' -f1)))" total_stdx= "$(($(stty size|cut -d' ' -f2)))" |
2. print_xy函数用来根据自己设定的算法控制字符输出位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # 该函数用来控制字符串的打印位置 # 参数1:要打印的字符串;参数2:根据参数2来选择不同的位置计算公式,不同类型的字符串,位置计算公式不同; # 参数3:用来控制字符在Y轴的打印位置;参数4:用来控制字符在X轴的打印位置; function print_xy() { if [ $ # -eq 0 ]; then return 1 fi len=` expr ${ #1} / 2` if [ $ # -lt 2 ]; then pos= "\e[${pos_stdy};$((${pos_stdx} - ${len}))H" elif [ $2 = "-" ]; then pos= "\e[$((${pos_stdy} - $3));$((${pos_stdx} - ${len}))H" elif [ $2 = "+" ]; then pos= "\e[$((${pos_stdy} + $3));$((${pos_stdx} - ${len}))H" elif [ $2 = "lu" ]; then pos= "\e[$((${pos_stdy} - $3));$((${pos_stdx} - $4))H" elif [ $2 = "ld" ]; then pos= "\e[$((${pos_stdy} + $3));$((${pos_stdx} - $4))H" fi echo - ne "${pos}$1" } |
3. 循环输出问题
1 2 3 4 | while [ ${ seq } -lt ${ #poetry[@]} ] do ... done |
4. 更多详情请参考程序内更详细的注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 循环18个问题,为求效果,问题数要比$poetry变量行数多1 while [ ${ seq } -lt ${ #poetry[@]} ] do sleep 0 isanswer=0 # 打印问题 print_xy "问: ${question[$seq]}" ld 2 $offset # 打印问题选项 print_xy "${bakans[$seq]}" + 3 # 打印回答栏 print_xy "答: " ld 4 $offset # 读取终端输入到变量ans read ans .... |
5. 完整的程序如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | #!/bin/sh : << EOF 使用方法: ./girlLove.sh 女朋友名字 EOF # 设置女朋友的名字,用来在终端展示 name= "$1" # 读入girlLove.txt文件中所设置的变量 . ./girlLove.txt # 脚本结束语 declaration= "$name 让我守护你一辈子!" # pos_stdy:输出位置为 2/3 x 终端Y轴长度;pos_stdx:输出位置为 1/2 x 终端X轴长度 pos_stdy= "$(($(stty size|cut -d' ' -f1) / 3 * 2))" pos_stdx= "$(($(stty size|cut -d' ' -f2) / 2))" # total_stdx:终端X轴长度,total_stdy:终端Y轴长度 total_stdy= "$(($(stty size|cut -d' ' -f1)))" total_stdx= "$(($(stty size|cut -d' ' -f2)))" # 开始答题时,给出的提示信息(屏幕最底部的提示信息) info= "$name 这就是送你的礼物了 选择1-4并按下回车开始答题吧" # 进度条前面显示的提示信息 head= "$name 当前的答题进度: " # 在终端输出declaration变量中设置的信息,通过while循环和for循环实现动画效果 function waiting() { i=1 # 通过while循环实现 ////// 转圈的动画效果 while [ $i -gt 0 ] do for j in '-' '\\' '|' '/' do # 打印前面6个/符号 + declaration变量中的内容 echo -ne "\033[1m\033[$(($(stty size|cut -d' ' -f1) / 3 * 2));$(($(stty size|cut -d' ' -f2) / 2 - ${#declaration} - 6))H$j$j$j$j$j$j\033[4m\033[32m${declaration}" # 打印后面六个/符号 echo -ne "\033[24m\033[?25l$j$j$j$j$j$j" usleep 100000 done ((i++)) done } # 该函数用来控制字符串的打印位置 # 参数1:要打印的字符串;参数2:根据参数2来选择不同的位置计算公式,不同类型的字符串,位置计算公式不同; # 参数3:用来控制字符在Y轴的打印位置;参数4:用来控制字符在X轴的打印位置; function print_xy() { if [ $# -eq 0 ]; then return 1 fi len=`expr ${#1} / 2` if [ $# -lt 2 ]; then pos= "\e[${pos_stdy};$((${pos_stdx} - ${len}))H" elif [ $2 = "-" ]; then pos= "\e[$((${pos_stdy} - $3));$((${pos_stdx} - ${len}))H" elif [ $2 = "+" ]; then pos= "\e[$((${pos_stdy} + $3));$((${pos_stdx} - ${len}))H" elif [ $2 = "lu" ]; then pos= "\e[$((${pos_stdy} - $3));$((${pos_stdx} - $4))H" elif [ $2 = "ld" ]; then pos= "\e[$((${pos_stdy} + $3));$((${pos_stdx} - $4))H" fi echo -ne "${pos}$1" } # 调用clear清屏 clear # 在1/2 X轴,2/3 Y轴的位置处打印如下字符串(格式化界面) print_xy "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*" # 在终端底部中间位置处打印$info信息 printf "\r\e[${total_stdy};$(((${total_stdx} - ${#info}*2)/2))H${info}" offset=14 seq=0 # 循环18个问题,为求效果,问题数要比$poetry变量行数多1 while [ ${seq} -lt ${#poetry[@]} ] do sleep 0 isanswer=0 # 打印问题 print_xy "问: ${question[$seq]}" ld 2 $offset # 打印问题选项 print_xy "${bakans[$seq]}" + 3 # 打印回答栏 print_xy "答: " ld 4 $offset # 读取终端输入到变量ans read ans # 光标上移3行,并清除从光标到行尾的内容(清除问题行字符) echo -e "\033[3A\r\033[K" # 清除问题选项行字符 echo -e "\033[K" # 清除回答栏字符 echo -e "\033[K" # 如果输入的值和预设的答案不同,则继续循环该问题 if [ "$ans" != "${answer[$seq]}" ]; then # 打印 -----,格式化界面。----- 下面会显示该问题的tip print_xy "---------------------------------------" + 5 # 显示该问题的tip print_xy "${tips[$seq]}" + 7 # 等待1s sleep 1 # 将光标移到行首,并清除光标到行尾的字符 echo -e "\r\033[K" # 光标上移3行,并清除光标到行尾的字符 echo -e "\033[3A\r\033[K" continue fi # 问题序号 + 1 seq=`expr ${seq} + 1` # 获取poetry的倒数第seq + 1行 curseq=`expr ${#poetry[@]} - ${seq}` ...... # 设置红色背景 printf "\e[41m" # 清屏 clear # 输出declaration变量的信息 waiting |
6. 相关的问题和答案文件设计如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | poetry=( "㊣━━^-^o中华人民共和国o^-^━━㊣ " \ "┃ 谨祝: ┃ " \ "┃ $name 小盆友 天天开心! ┃ " \ "┃ XXX 颁 ┃" \ "㊣━━^-^o中华人民共和国o^-^━━㊣" \ " " \ "嘟嘟oοО○●哇靠!!!快让开】 " \ " ╭══╮老婆!开车罗\`坐好啊 " \ " ╭╯五档║老公!开慢点\`我兴奋 " \ " ╰⊙═⊙╯。oо○ 压死了不赔!" ) question=( "坐在你旁边的是你什么人?" \ "你老公老家是哪个镇的?" \ "老公会做下列哪种饭?" \ "丽丽最爱看电视剧还是电影?" \ "question 5" \ "question 6" \ "question 7" \ "question 8" \ "question 9" \ "question 10" \ "question 11" ) bakans=( "1 男朋友;2 对象;3 老公 4 以上都不是" \ "1 香花;2 毛堂;3 九重;4 以上都不是" \ "1 粥;2 泡面;3 米饭 4 以上都是" \ "1 电视剧;2 电影" \ "1 option1 2 option2 3 option3 4 option4" \ "1 option1 2 option2 3 option3 4 option4" \ "1 option1 2 option2 3 option3 4 option4" \ "1 option1 2 option2 3 option3 4 option4" \ ... |
三、安装方法
1、准备工作
-
1台Linux服务器
2、安装步骤
1. 下载附件:
girlLove.zip
2. 解压girlLove.zip:
1 | # unzip girlLove.zip |
3. 进入girlLove目录执行./girlLove.sh命令
1 2 | # cd girlLove # ./girlLove.sh |
答案:3,3,4,1,1,1,1,1,1,1
3、使用方法
1. 修改girlLove.txt里面的:question(问题), bakans(选项), answer(答案), tips(提示)
2. 执行girlLove.sh命令
1 | . /girlLove .sh |
3. DIY自己的问题和答案
只需要修改girlLove.txt文件即可,需要修改:question(问题), bakans(选项), answer(答案), tips(提示)。注意修改的时候数目要一致。poetry变量行数需要等于问题个数+1,如果不满足需要自行DIY poetry变量行数。
四、运行效果
五、压缩包文件截图
整个程序只有三个文件,如下图所示:
六、其他补充
无
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?