概述

作为IT人员,给同事的感觉呆板,不会会浪漫,不懂情趣。其实不然,我们可以用我们的技能创造出IT人员独有的浪漫。girlLove脚本就可以实现IT人员的浪漫。girlLove本质上是一个简易的问答系统,通过设置不同的问题和答案来实现“浪漫”效果。读者通过改写该脚本,可以很轻松的实现一个基于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. # pos_stdy:输出位置为 2/3 x 终端Y轴长度;pos_stdx:输出位置为 1/2 x 终端X轴长度
  2. pos_stdy="$(($(stty size|cut -d' ' -f1) / 3 * 2))"
  3. pos_stdx="$(($(stty size|cut -d' ' -f2) / 2))"
  4.  
  5. # total_stdx:终端X轴长度,total_stdy:终端Y轴长度
  6. total_stdy="$(($(stty size|cut -d' ' -f1)))"
  7. total_stdx="$(($(stty size|cut -d' ' -f2)))"

2. print_xy函数用来根据自己设定的算法控制字符输出位置

  1. # 该函数用来控制字符串的打印位置
  2. # 参数1:要打印的字符串;参数2:根据参数2来选择不同的位置计算公式,不同类型的字符串,位置计算公式不同;
  3. # 参数3:用来控制字符在Y轴的打印位置;参数4:用来控制字符在X轴的打印位置;
  4. function print_xy()
  5. {
  6. if [ $# -eq 0 ]; then
  7. return 1
  8. fi
  9.  
  10. len=`expr ${#1} / 2`
  11. if [ $# -lt 2 ]; then
  12. pos="\e[${pos_stdy};$((${pos_stdx} - ${len}))H"
  13.  
  14. elif [ $2 = "-" ]; then
  15. pos="\e[$((${pos_stdy} - $3));$((${pos_stdx} - ${len}))H"
  16.  
  17. elif [ $2 = "+" ]; then
  18. pos="\e[$((${pos_stdy} + $3));$((${pos_stdx} - ${len}))H"
  19.  
  20. elif [ $2 = "lu" ]; then
  21. pos="\e[$((${pos_stdy} - $3));$((${pos_stdx} - $4))H"
  22.  
  23. elif [ $2 = "ld" ]; then
  24. pos="\e[$((${pos_stdy} + $3));$((${pos_stdx} - $4))H"
  25. fi
  26.  
  27. echo -ne "${pos}$1"
  28. }

3. 循环输出问题

  1. while [ ${seq} -lt ${#poetry[@]} ]
  2. do
  3. ...
  4. done

4. 更多详情请参考程序内更详细的注释

  1. # 循环18个问题,为求效果,问题数要比$poetry变量行数多1
  2. while [ ${seq} -lt ${#poetry[@]} ]
  3. do
  4. sleep 0
  5. isanswer=0
  6.  
  7. # 打印问题
  8. print_xy "问: ${question[$seq]}" ld 2 $offset
  9.  
  10. # 打印问题选项
  11. print_xy "${bakans[$seq]}" + 3
  12.  
  13. # 打印回答栏
  14. print_xy "答: " ld 4 $offset
  15.  
  16. # 读取终端输入到变量ans
  17. read ans
  18. ....

5. 完整的程序如下

  1. #!/bin/sh
  2.  
  3. : << EOF
  4. 使用方法:
  5. ./girlLove.sh 女朋友名字
  6. EOF
  7.  
  8. # 设置女朋友的名字,用来在终端展示
  9. name="$1"
  10.  
  11. # 读入girlLove.txt文件中所设置的变量
  12. . ./girlLove.txt
  13.  
  14. # 脚本结束语
  15. declaration="$name 让我守护你一辈子!"
  16.  
  17. # pos_stdy:输出位置为 2/3 x 终端Y轴长度;pos_stdx:输出位置为 1/2 x 终端X轴长度
  18. pos_stdy="$(($(stty size|cut -d' ' -f1) / 3 * 2))"
  19. pos_stdx="$(($(stty size|cut -d' ' -f2) / 2))"
  20.  
  21. # total_stdx:终端X轴长度,total_stdy:终端Y轴长度
  22. total_stdy="$(($(stty size|cut -d' ' -f1)))"
  23. total_stdx="$(($(stty size|cut -d' ' -f2)))"
  24.  
  25. # 开始答题时,给出的提示信息(屏幕最底部的提示信息)
  26. info="$name 这就是送你的礼物了 选择1-4并按下回车开始答题吧"
  27.  
  28. # 进度条前面显示的提示信息
  29. head="$name 当前的答题进度: "
  30.  
  31. # 在终端输出declaration变量中设置的信息,通过while循环和for循环实现动画效果
  32. function waiting()
  33. {
  34. i=1
  35.  
  36. # 通过while循环实现 ////// 转圈的动画效果
  37. while [ $i -gt 0 ]
  38. do
  39. for j in '-' '\\' '|' '/'
  40. do
  41. # 打印前面6个/符号 + declaration变量中的内容
  42. 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}"
  43.  
  44. # 打印后面六个/符号
  45. echo -ne "\033[24m\033[?25l$j$j$j$j$j$j"
  46. usleep 100000
  47. done
  48. ((i++))
  49. done
  50. }
  51.  
  52. # 该函数用来控制字符串的打印位置
  53. # 参数1:要打印的字符串;参数2:根据参数2来选择不同的位置计算公式,不同类型的字符串,位置计算公式不同;
  54. # 参数3:用来控制字符在Y轴的打印位置;参数4:用来控制字符在X轴的打印位置;
  55. function print_xy()
  56. {
  57. if [ $# -eq 0 ]; then
  58. return 1
  59. fi
  60.  
  61. len=`expr ${#1} / 2`
  62. if [ $# -lt 2 ]; then
  63. pos="\e[${pos_stdy};$((${pos_stdx} - ${len}))H"
  64.  
  65. elif [ $2 = "-" ]; then
  66. pos="\e[$((${pos_stdy} - $3));$((${pos_stdx} - ${len}))H"
  67.  
  68. elif [ $2 = "+" ]; then
  69. pos="\e[$((${pos_stdy} + $3));$((${pos_stdx} - ${len}))H"
  70.  
  71. elif [ $2 = "lu" ]; then
  72. pos="\e[$((${pos_stdy} - $3));$((${pos_stdx} - $4))H"
  73.  
  74. elif [ $2 = "ld" ]; then
  75. pos="\e[$((${pos_stdy} + $3));$((${pos_stdx} - $4))H"
  76.  
  77. fi
  78.  
  79. echo -ne "${pos}$1"
  80. }
  81.  
  82. # 调用clear清屏
  83. clear
  84.  
  85. # 在1/2 X轴,2/3 Y轴的位置处打印如下字符串(格式化界面)
  86. print_xy "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*"
  87.  
  88. # 在终端底部中间位置处打印$info信息
  89. printf "\r\e[${total_stdy};$(((${total_stdx} - ${#info}*2)/2))H${info}"
  90.  
  91. offset=14
  92. seq=0
  93.  
  94. # 循环18个问题,为求效果,问题数要比$poetry变量行数多1
  95. while [ ${seq} -lt ${#poetry[@]} ]
  96. do
  97. sleep 0
  98. isanswer=0
  99.  
  100. # 打印问题
  101. print_xy "问: ${question[$seq]}" ld 2 $offset
  102.  
  103. # 打印问题选项
  104. print_xy "${bakans[$seq]}" + 3
  105.  
  106. # 打印回答栏
  107. print_xy "答: " ld 4 $offset
  108.  
  109. # 读取终端输入到变量ans
  110. read ans
  111.  
  112. # 光标上移3行,并清除从光标到行尾的内容(清除问题行字符)
  113. echo -e "\033[3A\r\033[K"
  114.  
  115. # 清除问题选项行字符
  116. echo -e "\033[K"
  117.  
  118. # 清除回答栏字符
  119. echo -e "\033[K"
  120.  
  121. # 如果输入的值和预设的答案不同,则继续循环该问题
  122. if [ "$ans" != "${answer[$seq]}" ]; then
  123.  
  124. # 打印 -----,格式化界面。----- 下面会显示该问题的tip
  125. print_xy "---------------------------------------" + 5
  126.  
  127. # 显示该问题的tip
  128. print_xy "${tips[$seq]}" + 7
  129.  
  130. # 等待1s
  131. sleep 1
  132.  
  133. # 将光标移到行首,并清除光标到行尾的字符
  134. echo -e "\r\033[K"
  135.  
  136. # 光标上移3行,并清除光标到行尾的字符
  137. echo -e "\033[3A\r\033[K"
  138. continue
  139. fi
  140.  
  141. # 问题序号 + 1
  142. seq=`expr ${seq} + 1`
  143.  
  144. # 获取poetry的倒数第seq + 1行
  145. curseq=`expr ${#poetry[@]} - ${seq}`
  146.  
  147. ......
  148.  
  149. # 设置红色背景
  150. printf "\e[41m"
  151.  
  152. # 清屏
  153. clear
  154.  
  155. # 输出declaration变量的信息
  156. waiting

6. 相关的问题和答案文件设计如下:

  1. poetry=(
  2. "㊣━━^-^o中华人民共和国o^-^━━㊣ " \
  3. "┃ 谨祝:   ┃ " \
  4. "┃ $name 小盆友 天天开心! ┃ " \
  5. "┃     XXX 颁 ┃" \
  6. "㊣━━^-^o中华人民共和国o^-^━━㊣" \
  7. " " \
  8. "嘟嘟oοО○●哇靠!!!快让开】 " \
  9. "  ╭══╮老婆!开车罗\`坐好啊 " \
  10. " ╭╯五档║老公!开慢点\`我兴奋  " \
  11. " ╰⊙═⊙╯。oо○ 压死了不赔!" )
  12.  
  13. question=( "坐在你旁边的是你什么人?" \
  14. "你老公老家是哪个镇的?" \
  15. "老公会做下列哪种饭?" \
  16. "丽丽最爱看电视剧还是电影?" \
  17. "question 5" \
  18. "question 6" \
  19. "question 7" \
  20. "question 8" \
  21. "question 9" \
  22. "question 10" \
  23. "question 11")
  24. bakans=( "1 男朋友;2 对象;3 老公 4 以上都不是" \
  25. "1 香花;2 毛堂;3 九重;4 以上都不是" \
  26. "1 粥;2 泡面;3 米饭 4 以上都是" \
  27. "1 电视剧;2 电影" \
  28. "1 option1 2 option2 3 option3 4 option4" \
  29. "1 option1 2 option2 3 option3 4 option4" \
  30. "1 option1 2 option2 3 option3 4 option4" \
  31. "1 option1 2 option2 3 option3 4 option4" \
  32. ...

三、安装方法

1、准备工作

  • 1台Linux服务器

2、安装步骤

1. 下载附件:

girlLove.zip

2. 解压girlLove.zip:

  1. # unzip girlLove.zip

3. 进入girlLove目录执行./girlLove.sh命令

  1. # cd girlLove
  2. # ./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大师发表,拒绝转载,转载需要作者授权

Linux程序员福利 - 追女友神奇(Linux终端运行炫酷程序)的更多相关文章

  1. J2EE程序员应该要掌握的linux知识

    J2EE程序员应该要掌握的linux知识 大型J2EE应用都在建构在linux环境下的.开发环境下我们可以通过samba映射成本地的网络驱动器,直接在windows环境下进行编程调试.但是最后的发布还 ...

  2. 【ASP.NET程序员福利】打造一款人见人爱的ORM(二)

    上一篇我已经给大家介绍AntORM的框架[ASP.NET程序员福利]打造一款人见人爱的ORM(一),今天就来着重介绍一下如何使用这套框架 1>AntORM 所有成员 如果你只想操作一种数据库,可 ...

  3. 做10年Windows程序员与做10年Linux程序员的区别

    如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大.我写这篇文章 ...

  4. 做10年Windows程序员与做10年Linux程序员的区别(附无数评论)(开源软件相当于熟读唐诗三百首,不会作诗也会吟)

    如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大.我写这篇文章 ...

  5. Java程序员必须掌握的常用Linux命令。

    Java程序员也是半个运维了,在日常开发中经常会接触到Linux环境操作.小公司的开发人员甚至是兼了全运维的工作,下面整理了一些常用的Linux操作命令. Linux常用指令 ls 显示文件或目录 - ...

  6. Python程序员为什么一定要掌握Linux?

    不少Python新手经常问到学Python到底需不需要学习Linux? Python不是支持Windows和Linux操作系统吗?能在Windows下开发为什么还要学习Linux? 问这样的问题的朋友 ...

  7. 【ASP.NET程序员福利】打造一款人见人爱的ORM(一)

          “很多人都不太认可以第三方ORM,因为考虑的点不够全面,没有大用户群体的ORM有保证,这点是不可否认确是事实.但是往往用户群体大的ORM又有不足之处,今天我们就来聊聊关于ORM的话题,打造 ...

  8. PHP程序员福利“看免费直播,学MySQL索引优化”

    六星教育了解到,MySQL是目前所知PHP最流行的关系型数据库管理系统之一,它将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.之所以它会成为主流使用数据库,这 ...

  9. 不懂前端的程序员不是好美工——UI框架metronic使用教程——程序员视角

    本着不懂前端的程序员不是好美工的观点,所以作为一个仅懂一点前端的程序员,为了成为一个好美工,所以只能用些取巧的方法伪装一下. metronic一个基于bootstrap的响应式的后台管理平台的UI框架 ...

随机推荐

  1. [BZOJ2006][NOI2010]超级钢琴(ST表+堆)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 3679  Solved: 1828[Submit][Statu ...

  2. 用flask开发个人博客(26)—— 利用config.py配置文件动态的创建不同的Flask对象

    原文:https://blog.csdn.net/hyman_c/article/details/52877704 对配置进行封装的目的是根据不同的使用场景,给flask的app赋予不同的config ...

  3. openfire安装完毕后无法登录控制台(忘记密码)的解决方法

    openfire登录管理控制提示: Login failed:make sure your username and password are correct and that you’re an a ...

  4. js知识-进阶

    1 DOM 1.1 查找标签 (1)直接查找 document.getElementById(“idname”)          // dom对象 document.getElementsByTag ...

  5. 将int型数值拆分成4字节

  6. xml和集合混合使用-图书管理器

    package com.book; public class Book { private int id; //图书编号 private String name; //图书名称 private Str ...

  7. NHibernate 过滤器(第十五篇)

    NHibernate过滤器相当于定义一个非常类似于类和集合上使用的where子句.ISession 中默认是不启用过滤器的,必须通过ISession.EnableFilter()方法显式的启用. 该方 ...

  8. 使用Git代替FTP进行虚拟主机的代码管理

    为什么要使用Git代替FTP的原因: 由于本人菜鸟+穷屌,玩不起VPS和其他大牌的云主机,所以呢就只能在景安(这不是广告..)申请了免费的虚拟主机,就想着自己玩玩而已,免费的嘛,空间流量什么的就不讨论 ...

  9. Debian 7 源(32/64bit)好用的源

    deb http://mirrors.163.com/debian wheezy main non-free contrib deb http://mirrors.163.com/debian whe ...

  10. iOS文件和文件夹的创建,删除,移动, 拷贝,是否存在及简单数据类型的读写

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...