概述
詳細
一、功能簡介
作為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大師發表,拒絕轉載,轉載需要作者授權

