猜数字游戏加强版, 熟悉shell的基础语法,shell注意事项

猜数字规则

  • 随机生成一个0~99的数字
  • 输入错误 直接返回重新输入
  • 猜测错误 提示大小 继续猜测(并返回剩余猜测次数)
  • 连续猜错5次 退出(提示GAME OVER)
  • 猜测正确(返回 you got it!)

Shell备忘

1. 文件模式

windows下的换行(\r\n)与linux(\n)下不同,如果是windows下创建的shell文件,传到linux后,需要在vim下重设格式为linux模式(重新编辑不需要改)

  • set ff 查看文件模式
  • set ff=unix 设置文件为unix模式

    注:mac系统换行为(\r)

2. 立即执行

  • $()
  • ``

    推荐最外层用反引号``,内层用$()
    rn=$((`head -20 /dev/urandom | cksum | cut -f1 -d “ “` % 100))
    $(()) 表示算数运算

3. 各种判断

推荐用法:

  • [] 用于判断文件(目录)或者变量的存在与否,如 [ -z “a.sh” ]
  • [[]] 用于正则判断,如 [[ “$INT” =~ ^-?[0-9]+$ ]]
  • (()) 用于整数比较和计算,如 (( $gn > $rn )) 、$((chance-count))
  • !表示否定,如 [ ! -z “a.sh” ]
  • 测试: ((1>2)) && echo 111 || echo 222

    注: [][[]] 两边必须有空格

4. 函数的返回值

  • 可以显示加:return 返回
  • 如果不加,将以最后一条命令运行结果,作为返回值
  • return后跟数值n(0-255)

    如需要其他返回值: 可以通过echo返回字符串,或者操作全局变量

远程执行

拷贝下列命令,在 linux 环境下粘贴执行

1
bash <(curl -sSL https://cdn.jsdelivr.net/gh/qinxs/cdn-assets@master/demo/guess.sh)

猜数字代码

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
#!/bin/bash
# Shell猜数字游戏
# 规则
# 1 随机生成一个0~99的数字
# 2 输入错误 直接返回重新输入
# 3 猜测错误 提示大小 继续猜测(并返回剩余猜测次数)
# 4 连续猜错5次 退出(提示GAME OVER)
# 5 猜测正确(返回 you got it!)

count=0
chance=5

cat << EOF
======= Shell猜数字游戏 =======
# 数字区间[0~99]
# 你共有${chance}次机会!
# Ctrl+C可强制退出
EOF

rn=$((`head -20 /dev/urandom | cksum | cut -f1 -d " "` % 100))
# echo $rn

echoColor(){
declare -A colors
colors=(
[black]=30 # 30m 黑色字
[red]=31 # 31m 红色字
[green]=32 # 32m 绿色字
[yellow]=33 # 33m 黄色字
[blue]=34 # 34m 蓝色字
[purple]=35 # 35m 紫色字
[skyblue]=36 # 36m 天蓝字
[white]=37 # 37m 白色字
)
mes="$1"
# 示例 echo -e "\033[31m 颜色字 \033[0m"
echo -e "\033[${colors[$2]}m${mes}\033[0m"
}

chkValue(){
gn="$1"
# 非空判断
if [ -z "$gn" ]; then
echoColor "你还未输入呢" "skyblue"
continue
# 有效数字判断
elif echo "$gn" | grep -q '[^0-9]'; then
echoColor "请输入有效的数字" "red"
continue
# 范围判断
elif (( $gn < 0 )) || (( $gn > 99 )); then
echoColor "输入大小有误,请重新输入!" "red"
continue
fi
}

chkCount(){
if (( $1 >= $chance )); then
echoColor "${chance}次机会已用完, GAME OVER!" "blue"
exit 0
fi
}

guess(){
while true; do
read -p "请输入你猜测的数字[0~99]:" gn
chkValue "$gn"
break
done

if (( $gn > $rn )); then
let "count++"
echo '猜大了'
echo "剩余猜测次数:$((chance-count))"
chkCount $count
guess
elif (( $gn < $rn )); then
let "count++"
echo '猜小了'
echo "剩余猜测次数:$((chance-count))"
chkCount $count
guess
else
echoColor "you got it!!!" "green"
fi
}

guess

交流区 温馨提示: 遵纪守法, 友善评论!