概述
詳細
一、功能簡介
作為IT人員,給同事的感覺呆板,不會會浪漫,不懂情趣。其實不然,我們可以用我們的技能創造出IT人員獨有的浪漫。girlLove腳本就可以實現IT人員的浪漫。girlLove本質上是一個簡易的問答系統,通過設置不同的問題和答案來實現“浪漫”效果。讀者通過改寫該腳本,可以很輕松的實現一個基於Linux終端的調查系統或考試系統等。
二、實現方法
girlLlove腳本可以展示如下幾個部分:文字特效(poetry),問題(question),問題選項(bakans),答案(answer)和提示(tips)。這些內容都保存在shell數組(girlLove.txt文件)中,並且是一一對應的關系,在主程序girlLove.sh中通過while循環一個一個的展示出來。以上各部分的具體內容都可以在girlLove.txt文件中設定,設定的選項數量和用戶的屏幕相關,如果讀者顯示屏幕過小,則選項數量多了有可能產生位置偏移等影響。
1. 終端上的字是輸出在指定位置的,通過以下代碼記錄終端的X/Y軸信息
# 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:根據參數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. 循環輸出問題
while [ ${seq} -lt ${#poetry[@]} ] do ... done
4. 更多詳情請參考程序內更詳細的注釋
# 循環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. 完整的程序如下
#!/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. 相關的問題和答案文件設計如下:
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:
# unzip girlLove.zip
3. 進入girlLove目錄執行./girlLove.sh命令
# 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命令
./girlLove.sh
3. DIY自己的問題和答案
只需要修改girlLove.txt文件即可,需要修改:question(問題), bakans(選項), answer(答案), tips(提示)。注意修改的時候數目要一致。poetry變量行數需要等於問題個數+1,如果不滿足需要自行DIY poetry變量行數。
四、運行效果
五、壓縮包文件截圖
整個程序只有三個文件,如下圖所示:
六、其他補充
無
注:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權