Day11
一、shell 基础
1、shell 概念 shell 英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是 操作系统的外壳。可以通过shell 命令来操作和控制操作系统,比如 Linux中的shell命令就包括 ls、cd、pwd 等等。
2、shell 在内核的基础上编写的一个应用程序,它连接了用户和 Linux 内 核,从而让用户能够更加便捷、高效、安全的使用 linux 内核,这其实 就是 shell 的本质。
3、使用专业术语的说法来解释,Shell 其实是一个命令解释器,它通过接 受用户输入的 Shell 命令来启动、暂停、停止程序的运行或对计算机进行控制。
4、常见的 shell:
Bourne Shell (/usr/bin/sh或/bin/sh)
Bourne Again Shell (/bin/bash)
C Shell (/usr/bin/csh)
K Shell (/usr/bin/ksh)
Shell for Root (/sbin/sh)
5、shell 脚本
shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件 中,
进行处理业务逻辑,脚本不用编译即可运行,它从一定程度上减轻 了工作量,
提高了工作效率,还可以批量、定时处理主机,方便管理员 进行设置或者管
理。
6、shell 脚本编写注意事项
shell命名: shell脚本名称命名一般为英文、大写、小写、后缀以.sh结尾
不能使用特殊符号、空格
名称要写的一眼可以看出功能,也就是顾名思义
shell脚本首行需要#!/bin/bash开头
shell脚本变量不能以数字、特殊符号开头,可以使用下划线 _,但不能用破
折号——
二、shell脚本的构成
脚本声明 注释信息 可执行语句
三、编写shell脚本
1、执行shell脚本的几种
bash 脚本名称
source 脚本名 在当前环境生效,其他方法都是在开一个shell进程
sh 脚本名称
添加x权限,./脚本名称
shell脚本其实就是有序执行命令条件
[root@localhost ~]# touch hello.sh
[root@localhost ~]# vim hello.sh
#!/bin/bash echo "Hello World!"
[root@localhost ~]# bash hello.sh # 运行shell 脚本的方法1
Hello World!
[root@localhost ~]# sh hello.sh # 运行shell脚本的方法2
Hello World!
[root@localhost ~]# chmod +x hello.sh # 运行shell脚本的方法3
[root@localhost ~]# ll hello.sh
-rwxr-xr-x. 1 root root 32 6⽉ 14 14:22 hello.sh
[root@localhost ~]# ./hello.sh
Hello World!
[root@localhost ~]# source ./hello.sh # 只在当前环境生效,其他方法是另外再开
一个shell。
Hello World!
[root@localhost ~]# vim hello.sh # 修改hello脚本
#!/bin/bash
echo "Hello World!"
ls -lh /
df -hT
[root@localhost ~]# sh hello.sh
Hello World!
总用量30K
lrwxrwxrwx. 1 root root 7 10⽉ 11 2021 bin -> usr/bin
dr-xr-xr-x. 5 root root 4.0K 5⽉ 11 20:46 boot
drwxr-xr-x. 19 root root 3.1K 6⽉ 14 22:08 dev
drwxr-xr-x. 144 root root 8.0K 6⽉ 14 22:14 etc
drwxr-xr-x. 3 root root 23 5⽉ 11 20:45 home
lrwxrwxrwx. 1 root root 7 10⽉ 11 2021 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 10⽉ 11 2021 lib64 -> usr/lib64
dr-xr-xr-x. 7 root root 2.0K 11⽉ 11 2022 media
drwxr-xr-x. 3 root root 18 5⽉ 11 20:43 mnt
drwxr-xr-x. 2 root root 6 10⽉ 11 2021 opt
dr-xr-xr-x. 194 root root 0 6⽉ 14 22:08 proc
dr-xr-x---. 15 root root 4.0K 6⽉ 14 22:27 root
drwxr-xr-x. 41 root root 1.2K 6⽉ 14 22:10 run
lrwxrwxrwx. 1 root root 8 10⽉ 11 2021 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 10⽉ 11 2021 srv
dr-xr-xr-x. 13 root root 0 6⽉ 14 22:08 sys
# 可以看出,shell脚本就是有序的执行其中的命令条件
2、编写 nginx 安装脚本
1)安装依赖环境
2)下载nginx压缩包
3)解压
4)make和make install安装
5)按照顺序执行指令
[root@localhost ~]# vim /root/shell/install_nginx.sh
#!/bin/bash
yum -y install gcc gcc-c++ make pcre-devel openssl-devel
wget
cd /usr/local/src/
wget 'http://nginx.org/download/nginx-1.22.1.tar.gz'
tar xf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure --prefix=/usr/local/nginx
make -j 4
make install
# 逻辑顺序:先安装依赖关系,再进入到系统默认的安装包目录src,使用wget
命令从网上下载nginx1.22.1版本的安装包,然后解压,再移动到 nginx 安
装目录,执行编译安装(预配置,编译,编译安装)
四、变量
1、概念
变量用来存放系统或用户需要使用的特定参数或者值,变量的值可以根
据用户设定或者系统环境变化而相应变化,在Shell脚本中使用变量,可
使脚本更加灵活,适应性更强。
与变量相对应的是常量,常量例如“Hello World”,是不可改变的。
变量可以给个变量名,假如为name,值是可变的。
2、变量注意事项
1)变量命名规则:必须由大写字母、小写字母、下划线、数字,并且首字母不能
是数字。
2)在变量命名时:建议也简写出该变量是什么用处
3)变量值的类型:值的类型会分为整型、浮点型、字符串型、布尔型等,
而且使用变量需要指定类型Shell 默认的变量类型都是字符串,无需指
定
3、变量的分类
1)自定义变量:由用户自己定义、使用和修改
[root@localhost ~]# A=1314 # 左边是变量名、右边是值
[root@localhost ~]# echo $A
1314
[root@localhost ~]# unset A # 清除变量
[root@localhost ~]# echo $A
变量名=值中,等于号=之前和之后不能有空格,比如:name = yang,这样是错
的,name=yang 才对。
变量名=值中,值内如果输入数学算式,是没办法算出结果的,只会输出字符
串。
2)环境变量
由系统维护,用于设置工作环境;$PWD;$SHELL ;$USER
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $SHELL
/bin/bash
[root@localhost ~]# echo $USER
root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]#
其中PATH变量用于设置可执行程序的默认搜索路径,可以修改全局变量文件
/etc/profile 或修改某用户家目录下的~/.bash_profile文件永久改变环境变量。
3)位置变量
通过命令行给脚本程序传递参数 (也属于预定义变量)
为了在使用Shel脚本程序时,方便通过命令行为程序提供操作参数,
Bash引入了位置变量的概念位置变量有 ,n,n为1~9之间的数字
$0:第一个字段表示命令名或脚本名称
$1:脚本要处理的第一个参数
$2:脚本要处理的第二个参数
注意:shell脚本最多可以直接处理9个参数
[root@localhost shell]# vim ip.sh
#!/bin/bash
ifconfig $1 | grep -w inet | awk '{print $2}' # 设置⼀个参数
[root@localhost shell]# sh ./ip.sh ens32
192.168.100.100
[root@localhost shell]# vim ip.sh
#!/bin/bash
ifconfig $1$2 | grep -w inet | awk '{print $2}' # 设置两个参数
[root@localhost shell]# sh ./ip.sh ens 32
192.168.100.100
4)预定义变量
Bash中内置的一类变量,不能直接修改;
预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,
而不能创建新的预定义变量,也不能直接为预定义变量赋值。
$*:将所有参数作为整体
$@:单个参数的组合,每个参数占一行
$0:保存了脚本名称
$?:保存命令或脚本的执行状态码
$#:保存脚本要处理的参数的个数
[root@localhost shell]# vim hehe.sh
#!/bin/bash
for x in "$*" # 将所有参数整合到一起,总共列为一行
do
echo $x
done
for y in "$@" # 将所有参数单个列出,每个参数单列一行
do
echo $y
done
[root@localhost shell]# sh ./hehe.sh 1 2 3 4 5 6 #
查看$*和$@的区别
1 2 3 4 5 6 # $*的结果
1
2
3
4
5
6 # $@的结果
[root@localhost shell]# vim hehe.sh
#!/bin/bash
for x in "$*"
do
echo $x
done
for y in "$@"
do
echo $y
done
echo "该脚本是:$0"
echo "此脚本⼀共处理了$#个参数"
[root@localhost shell]# sh hehe.sh 1 2 3 4 5 6
1 2 3 4 5 6
1
2
3
4
5
6
该脚本是:hehe.sh # $0的结果,也就是该脚本的名称
此脚本⼀共处理了6个参数 # $#的结果,执行脚本时,输入了多少参数
4、变量的定义与输出
(1)定义一个新的变量
格式:变量名=变量值
注意:变量名必须以字母或下划线开头,严格区分大小写
(2)变量符号运用
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号: 或$(): 命令替换,提取命令的执行结果
[root@localhost shell]# X=aaa
[root@localhost shell]# echo "$X" # 双引号可以使用变量
aaa
[root@localhost shell]# echo '$X' # 单引号只显示符号内的
字符
$X
[root@localhost shell]# ip1=`ifconfig ens32 | grep -w inet
| awk '{print$2}'` # ``反撇号可以引用命令
[root@localhost shell]# ip2=$(ifconfig ens32 | grep -w
inet | awk '{print$2}') # $()与反撇号作用相同
[root@localhost shell]# echo $ip1
192.168.100.100
[root@localhost shell]# echo $ip2
192.168.100.100
[root@localhost shell]# x=100
[root@localhost shell]# y=50
[root@localhost shell]# z=`expr $x + $y` # 整数运算
[root@localhost shell]# echo $z
150
[root@localhost shell]# x=1.4
[root@localhost shell]# expr $x + 1 # 判断是否为浮点数
expr: ⾮整数参数
[root@localhost shell]# [ $? -ne 0 ] && echo "x为浮点数"
x为浮点数
(3)输入和输出
输入格式:read [-p "显示的提示信息"] 变量名
输出格式:echo $变量名
[root@localhost shell]# read x y # 输⼊,变量输入,在下
一行输入
1 3
[root@localhost shell]# echo $x $y # 输出,直接输出变量
1 3
[root@localhost shell]# read -p "请输⼊你要赋值的变量值" x y
请输⼊你要赋值的变量值1 5
[root@localhost shell]# echo $x $y
1 5
[root@localhost shell]# vim ip.sh # 编写一个查看IP的脚
本,内容如下
#!/bin/bash
read -p "请输⼊接⼝名称:" x # 输入x变量等于什么,脚本内不
用写,命令行输入该变量x等于什么即可,该变量x可在脚本内引用
ifconfig $x | grep -w inet | awk '{print $2}'
:wq
[root@localhost shell]# sh ip.sh
请输⼊接⼝名称:ens32
192.168.100.100
[root@localhost shell]# sh ip.sh
请输⼊接⼝名称:lo
127.0.0.1
[root@localhost shell]# vim read.sh # 编写输入账号密码的脚
本,内容如下
#!/bin/bash
read -p "请输⼊您的姓名:" name # 该变量name是在命令行输入
的,相当于变量=值
read -p "请输⼊您的密码:" passwd # 该变量passwd是在命令行输入
的,相当于变量=值
if [ $passwd = "123456" ]; then # if判断语句,如果(if)某某
等于某某,那么(then)执行什么命令,否则(else)执行什么命令,结尾fi
echo "你好,$name !"
else
echo "抱歉,您输⼊的密码不正确!"
fi
[root@localhost shell]# sh read.sh
请输⼊您的姓名:admin
请输⼊您的密码:112233
抱歉,您输⼊的密码不正确!
[root@localhost shell]# sh read.sh
请输⼊您的姓名:admin
请输⼊您的密码:123456
你好,admin !
5、变量的作用范围
默认情况下,新定义的变量只在当前Shell环境中有效,因此称为局部变
量。当进入子程序或新的子shell 时,局部变量将无法再使用。
为了使用户定义的变量在所有子Shell环境中能够继续使用,减少重复设
置工作,可以通过内部命令export将指定的变量导出为“全局变量”。
格式 1:export 变量名
格式 2:export 变量名=值
[root@localhost shell]# x=aaa
[root@localhost shell]# export y=bbb # 使y=bbb导出为
全局变量,即使下次更新环境变量,y也会生效,相当于在/etc/profile内永
久赋值
[root@localhost shell]# hostname shell
[root@localhost shell]# bash
[root@shell shell]# echo $x
[root@shell shell]# echo $y
bbb
6、变量的数学运算
(1)整数运算
格式:expr 变量1 运算符 变量2 运算符 变量3....
运算符:+ - * /(+ - × ÷)
[root@shell shell]# x=123
[root@shell shell]# y=111
[root@shell shell]# expr $x + $y # 加
234
[root@shell shell]# expr $x - $y # 减
12
[root@shell shell]# expr $x \* $y # 乘
13653
[root@shell shell]# expr $x / $y # 除
1
[root@shell shell]# expr $x % $y # 余数计算
12
(2)精度计算
[root@shell shell]# yum -y install bc # 先安装bc这个软件才可进行,否则只能
进行整数运算
[root@shell shell]# x=123
[root@shell shell]# y=111
[root@shell shell]# echo "scale=5; $x / $y" | bc
1.10810
判断语法
一、条件判断
Shell的返回值:运行一条命令,都会有一个返回值。0代表执行正常,非0代表命令执行异常。
二、if 条件判断语句
1、if 单分支语句
2、if 多分支语句
条件判断:可以有数字判断、字符串判断、⽂件判断等
三、数字判断
1、格式
-eq:equal,等于,一般用于 [ $? -eq 0 ],也就是判断上条命令返回值等于 0,直接数字 -eq 数
字也可以 equals
-ne:not equal,不等于,一般用于 [ $? -ne 0 ],判断上条命令返回值不等于 0
-gt:greater than,大于
-ge:greater or equal,大于或等于
-lt:less than,小于
-le:less or equal,小于或等于
[root@localhost test]# ls /
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
[root@localhost test]# echo $? # $?保存了上条命令的返回值,0表示执行成功,非0表示执
行失败
0
[root@localhost test]# ls /haha
ls: ⽆法访问'/haha': 没有那个⽂件或⽬录
[root@localhost test]# echo $?
2
[root@localhost test]#
if 条件判断; then
条件成⽴执⾏的命令(可以有多个命令,命令执行方式为逐行执行要么全执行,要么全不执行)
fi
if 条件判断; then
条件成⽴执⾏的命令(可以有多个命令)
else
条件不成⽴执⾏的命令(可以有多个命令)
fi
2、应用示例
3、创建简单的数字判断脚本
4、创建检测网络是否畅通的脚本
[root@localhost test]# test 2 -eq 2 # test:shell环境中,测试条件表达式的命令工具
[root@localhost test]# echo $?
0
[root@localhost test]# test 3 -eq 2 # 测试3等于2
[root@localhost test]# echo $?
1 # 返回值为1,说明测试的3等于2这条命令不成立
[root@localhost test]# [ 2 -eq 2 ] # 编程中习惯使⽤[ ]中括号
[root@localhost test]# echo $?
0
[root@localhost test]# [ 3 -eq 2 ]
[root@localhost test]# echo $?
1
[root@localhost test]#
[root@localhost test]# vim if.sh
#!/bin/bash
num1=3 # 给定变量num1
num2=3 # 给定变量num2
if [ $num1 -eq $num2 ];then # 判断num1变量是否等于num2
echo "$num1 equal $num2" # 如果等于,那么执行命令,echo输出
echo "in if"
fi
:wq
[root@localhost test]# sh ./if.sh
3 equal 3
in if
[root@localhost test]#
[root@localhost test]# vim ping.sh
#!/bin/bash
read -p "请输⼊要测试的⽹址:" web # read:命令行内输入web的变量值
ping -c 3 $web &> /dev/null # ping -c 3,连接某个网站三次
if [ $? -eq 0 ];then # 如果ping命令执行成功,那么
echo "此时⽹络畅通!" # 输出“此时网络畅通”
else # 否则
echo "⽆法访问,请检查⽹址是否输⼊正确或检查相关的⽹络配置!" # 输出“无法访
问...”
fi # if语句的结尾
:wq
[root@localhost test]# sh ./ping.sh
请输⼊要测试的⽹址:www.baidu.com
此时⽹络畅通!
[root@localhost test]#
四、字符串判断
1、格式
[ 字符串1 == 字符串2 ] 字符串内容相同
[ 字符串1 != 字符串2 ] 字符串内容不同
[ -z 字符串 ] 字符串内容为空
[ -n 字符串 ] 字符串内容不为空
xxxxxxxxxx #!/bin/bash#简易计算器read -p "NUM_1 = "
num1read -p "NUM_2 = " num2x=echo "scale=2; $num1
/ $num2"|bc | awk -F. '{print $1}'y=echo
"scale=2; $num1 / $num2"|bc | awk -F. '{print
$2}'z=echo "scale=2; $num1 / $num2"|bc -
la=printf "%.2f\n" $num1 | awk -F. '{print
$2}'b=printf "%.2f\n" $num2 | awk -F. '{print
$2}'c=printf "%.2f\n" $num1 | awk -F. '{print
$1}'d=printf "%.2f\n" $num2 | awk -F. '{print
$1}'if [ "
[ num2] echo
"—————————————————————" echo " 相
减:" num1 -
[ num2] echo
"—————————————————————" echo " 相
除:" num1 /
[ num2] echo
"—————————————————————" exit 1else
echo "—————————————————————"
echo " 相除结果:浮点数" echo
"—————————————————————" echo " 相
加:"echo "scale=0; $num1 + $num2" |bc -l echo
"—————————————————————" echo " 相
减:"echo "scale=0; $num1 - $num2" |bc -l echo
"—————————————————————" echo " 相
乘:"echo "scale=0; $num1 * $num2" |bc -l echo
"—————————————————————"fiif [ -z
y" echo
"—————————————————————"else echo "
相除:
a -eq 00 -a $b -eq 00 ];then echo " 取余:"echo
"scale=0; $c % $d"|bc echo
"—————————————————————"fi[root@YH1
shell]# sh jisuan.shNUM_1 = 10NUM_2 = 3 —————————————————————相除结果:浮点数
相除:
————————————————————— 相加:13 ————————————————————— 相减:7 ————————————————————— 相乘:30 ————————————————————— 相除:3.33 ————————————————————— 取余:1
—————————————————————[root@YH1
shell]# sh jisuan.shNUM_1 = 100NUM_2 = 25 —————————————————————相除结果: 整数
————————————————————— 相加: 125 ————————————————————— 相减: 75 ————————————————————— 相乘: 2500 ————————————————————— 相除: 4 ————————————————————— 取余: 0
—————————————————————shell
3、案例
(1)创建简单的字符串判断脚本
[root@localhost test]# [ aaa == aaa ] # aaa字符串等于aaa
[root@localhost test]# echo $?
0 # 命令返回值为0,说明aaa==aaa
[root@localhost test]# [ aaa == bbb ] # aaa字符串等于bbb
[root@localhost test]# echo $?
1 # 命令返回值为非0,说明aaa不等于bbb
[root@localhost test]# [ -z aaa ] # aaa字符串为空字符串
[root@localhost test]# echo $?
1 # 命令返回值为非0,说明aaa字符串不为空
[root@localhost test]# [ -z ] # 直接引用空字符串
[root@localhost test]# echo $?
0 # 命令返回值为0,说明上条判断命令为空字符串
[root@localhost test]# [ -n aaa ] # aaa为非空字符串
[root@localhost test]# echo $?
0 # 命令返回值为0,说明aaa为非空字符串
[root@localhost test]#
[root@localhost test]# vim zifu.sh
#!/bin/bash
read -p "请输⼊账号:" name
if [ "$name" == "admin" ];then # 字符串判断需要加双引号
echo "欢迎您,$name!"
else
echo "系统未查询到此账号,请您重新输⼊!"
fi
:wq
[root@localhost test]# sh ./zifu.sh
请输⼊账号:admin
欢迎您,admin!
[root@localhost test]# sh ./zifu.sh
-e "文件目录或自定变量" 判断文件或目录是否存在 exists
-f "文件目录或自定变量" 判断是否为文件 isfile
-d "文件目录或自定变量" 判断是否为目录 isdirect
-w "文件目录或自定变量" 判断是否可写 w
-r "文件目录或自定变量" 判断是否可读 r
-x "文件目录或自定变量" 判断是否可执行 x
-s "文件目录或自定变量" 判断文件大小,非0时为真 (若为非空文件,则为真) size
-z "文件目录或自定变量" 判断变量参数值是否为空,为空为真,非空为假 zore
(2)创建 rpm 查询软件是否安装的脚本
五、文件、目录、权限的判断
1、格式
[ 操作符 文件或目录]
常用的测试操作符:
请输⼊账号:ads
系统未查询到此账号,请您重新输⼊!
[root@localhost test]#
[root@localhost test]# vim rpm.sh
#!/bin/bash
read -p "请输⼊你要检测的rpm包:" rpmname # 命令行输入rpmname变量值
result=`rpm -qa $rpmname` # 设置result变量为`rpm -qa $rpmname`命令
if [ -z "$result" ];then # 判断result变量内的命令执行后的值是否为空
echo "${rpmname} is not find!" # 如果为空则输出这条
else
echo "${rpmname} is find!" # 否则输出这条
fi
:wq
[root@localhost test]# sh ./rpm.sh
请输⼊你要检测的rpm包:nginx
nginx is not find!
[root@localhost test]# sh ./rpm.sh
请输⼊你要检测的rpm包:lrzsz
lrzsz is find!
[root@localhost test]#
2、示例
3、案例
nginx 安装脚本优化,判断是否已安装 nginx
六、与或判断
判断多个条件
多个条件其中一个成立,或
多个条件都要成立,与
或运算判断:|| 或,两个条件满足其一即可,还有-o
与运算判断:&& 与,两个条件都得满足才行,还有-a
1、或运算判断
[root@localhost test]# [ -e "/etc/passwd" ] # 判断/etc/passwd文件是否存在
[root@localhost test]# echo $?
0
[root@localhost test]# [ -e "/etc/haha" ] # 判断/etc/haha文件是否存在
[root@localhost test]# echo $?
1
[root@localhost test]# [ -f "/etc" ] # 判断/etc是否为普通文件
[root@localhost test]# echo $?
1
[root@localhost test]# [ -x "/bin/bash" ] # 判断/bin/bash是否可执行
[root@localhost test]# echo $?
0
[root@localhost test]#
[root@localhost test]# vim install_nginx.sh
#!/bin/bash
if [ -e "/usr/local/nginx" ];then # -e:判断nginx软件目录是否存在
echo "nginx is install!" # 存在则输出一条nginx已安装的提示信息
exit 1 # 输出完已安装信息则退出脚本
else # 若nginx软件目录不存在,则执行如下命令
yum -y install gcc gcc-c++ make pcre-devel openssl-devel wget
cd /usr/local/src/
wget 'http://nginx.org/download/nginx-1.22.1.tar.gz'
tar xf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure --prefix=/usr/local/nginx
make -j 4&&make install
ln -s /usr/local/nginx/sbin/nginx /usr/bin/
/usr/local/nginx/sbin/nginx
fi
:wq
[root@localhost test]# sh ./install_nginx.sh
[root@localhost test]# vim huo.sh
#!/bin/bash
read -p "请输⼊字符串:" name
if [ "$name" == "haha" ]||[ "$name" == "hehe" ];then # 这两个条件需满足其
一,也可使⽤[ "$name" =="haha" -o "$name" == "hehe" ]
echo "$name is my want"
else
echo "in else"
2、与运算判断
3、混合判断
fi
:wq
[root@localhost test]# sh ./huo.sh
请输⼊字符串:haha
haha is my want
[root@localhost test]# sh ./huo.sh
请输⼊字符串:hehe
hehe is my want
[root@localhost test]# sh ./huo.sh
请输⼊字符串:lala
in else
[root@localhost test]#
[root@localhost test]# vim yu.sh
#!/bin/bash
read -p "请输⼊⼀个数值:" age
if [ $age -gt 30 ]&&[ $age -lt 80 ];then # 这两个条件都得满足,大于30且小于
80,可使用[ $age -gt 30 -a $age -lt 80 ]
echo "age>30 and age<80"
echo "working"
else
echo "in else"
fi
:wq
[root@localhost test]# sh ./yu.sh
请输⼊⼀个数值:60
age>30 and age<80
working
[root@localhost test]# sh ./yu.sh
请输⼊⼀个数值:90
in else
[root@localhost test]#
[root@localhost test]# vim hun.sh
#!/bin/bash
read -p "请输⼊⼀个数值:" age
if [ $age -gt 2 ]&&[ $age -lt 10 ]||[ $age -eq 100 ];then # 先做||前面的与判
断,再进行或判断,可使⽤[ $age -gt 2 -a $age -lt 10 -o $age -eq 100 ]
echo "age is>2 and age is <10 or age ==100 "
else
echo "in else"
fi
:wq
[root@localhost test]# sh ./hun.sh
请输⼊⼀个数值:7
age is>2 and age is <10 or age ==100
[root@localhost test]# sh ./hun.sh
请输⼊⼀个数值:100
age is>2 and age is <10 or age ==100
[root@localhost test]# sh ./hun.sh
请输⼊⼀个数值:30
in else
[root@localhost test]#
七、多重判断语法 elif
1、if 多分支语句结构
2、案例
八、多重判断的 case 语句
1、case 语句概述
case 语句是多分支选择语句
使用case语句改写if多分支可以使脚本结构更加清晰、层次分明。针对变量的不同取值,执行不同
的命令序列,case还支持正则。
if 条件1; then
#命令,条件1成⽴执⾏
elif 条件2;then
#命令,条件1不成⽴,条件2成⽴执⾏
elif 条件3;then
#命令,条件1不成⽴,条件2不成⽴,条件3成⽴执⾏
else
#命令 ,以上条件都不成⽴执⾏
fi
[root@localhost test]# vim fs.sh
#!/bin/bash
#分数等级评定
read -p "请输⼊您的分数(0-100):" fs
if [ $fs -ge 0 -a $fs -lt 60 ];then
echo "$fs分,不及格!"
elif [ $fs -ge 60 -a $fs -lt 70 ];then
echo "$fs分,及格!"
elif [ $fs -ge 70 -a $fs -lt 85 ];then
echo "$fs分,良好!"
elif [ $fs -ge 85 -a $fs -le 100 ];then
echo "$fs分,优秀!"
else
echo "您输⼊的分数有误!"
fi
:wq
[root@localhost test]# sh ./fs.sh
请输⼊您的分数(0-100):20
20分,不及格!
[root@localhost test]# sh ./fs.sh
请输⼊您的分数(0-100):85
85分,优秀!
[root@localhost test]# sh ./fs.sh
请输⼊您的分数(0-100):70
70分,良好!
[root@localhost test]# sh ./fs.sh
请输⼊您的分数(0-100):123
您输⼊的分数有误!
[root@localhost test]#
2、case 语句的结构
3、示例
提示用户输入一个字符,判断该字符是字母、数字或者其他字符的脚本
4、案例
输入分数变量,然后判定等级
case $变量名称 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认命令序列
esac
[root@localhost test]# vim hitkey.sh
#!/bin/bash
#击键类型识别
read -p "请输⼊⼀个字符,并按Enter键确认:" key
case $key in
[a-z]|[A-Z]) # a到z或A到Z,当变量输入为字母则执行下面的echo命令
echo "您输⼊的是⼀个 字⺟"
;;
[0-9]) # 0到9,当变量输入为数字则执行下面的echo的命令
echo "您输⼊的是⼀个 数字"
;;
*) # 若变量输入为空格等其他符号字符,则执行下
面的echo命令
echo "您输⼊的是 空格、功能键或其他控制字符"
;;
esac
:wq
[root@localhost test]# sh ./hitkey.sh
请输⼊⼀个字符,并按Enter键确认:5
您输⼊的是⼀个 数字
[root@localhost test]# sh ./hitkey.sh
请输⼊⼀个字符,并按Enter键确认:b
您输⼊的是⼀个 字⺟
[root@localhost test]# sh ./hitkey.sh
请输⼊⼀个字符,并按Enter键确认:P
您输⼊的是⼀个 字⺟
[root@localhost test]# sh ./hitkey.sh
请输⼊⼀个字符,并按Enter键确认:!
您输⼊的是 空格、功能键或其他控制字符
[root@localhost test]#
[root@localhost test]# vim fscase.sh
#!/bin/bash
#使⽤case语句编写分数等级评定脚本
read -p "请输⼊您的分数(0-100):" fs
case $fs in
[0-9]|[0-5][0-9]) # 0到9或59以内的两位数
echo "$fs分,不及格!"
;;
6[0-9]) # 6开头的两位数,若$fs输入为0,则判定为60,即执行下面的echo命令
echo "$fs分,及格!"
;;
7[0-9]|8[0-5]) # 以7开头的两位数或以8开头的两位数
echo "$fs分,良好!"
;;
8[6-9]|9[0-9]|100) # 以8开头的两位数,第二位最少为6,也就是最小是86 | 以9
开头的两位数 | 100
echo "$fs分,优秀!"
;;
*) # 输入不在上述规则内的其他字符,则echo如下命令
echo "您输⼊的分数有误!"
esac
:wq
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):5
5分,不及格!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):58
58分,不及格!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):69
69分,及格!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):70
70分,良好!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):89
89分,优秀!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):100
100分,优秀!
[root@localhost test]# sh ./fscase.sh
请输⼊您的分数(0-100):110
您输⼊的分数有误!
[root@localhost test]#vim menu.sh
#!/bin/bash
echo "1新增文件 2删除文件 3查找文件 4修改文件"
read -p "请输入序号选择功能:"m
if [ $m == 1]; then
touch aaaa.txt
elif [ $m == 2]; then
rm -rf aaaa.txt
else
echo "其他功能正在开发"
fi
[root@lq ~]# read -p "输入一个数据" s # 有回显
输入一个数据aabbcc
[root@lq ~]# echo $s
aabbcc
aabbcc
[root@lq ~]# read -p "输入一个数据" -s s # 没有回显
输入一个数据[root@lq ~]#
[root@lq ~]# echo $S
Kofkgerf
[root@lq ~]# read -p "3个变量" a b c
3个变量12 14 18
[root@lq ~]# echo $a
12
[root@lq ~]# echo $b
14
[root@lq ~]# echo $c
18
[root@lq ~]# vim 2.sh
#!/bin/bash
read -p "username:" username
read -p "password:" -s password # 密码不回显
useradd $username
echo $password|passwd --stdin $username
if [ $? -eq 0 ];then
echo "账户$username注册成功"
fi
[root@lq ~]# bash 2.sh
username:tom
password:更改用户 tom 的密码 。
passwd:所有的身份验证令牌已经成功更新。
账户tom注册成功
循环语法
一、for 循环
1、作用
读取不同的变量值,以逐个执行同一组命令
2、结构
取值列表:数字范围、字符串、多个字符串、提前设定好的变量等
for默认以所有的空白字符进行分隔: tab、空格、回车,去循环处理
分隔成几段就循环几次
3、示例
(1)分隔值循环
(2)在命令结果中循环
for 变量名 in 取值列表(范围)
do
命令序列
done
[root@localhost test]# vim quzhi.sh
#!/bin/bash
for home in 北京 上海 ⼴州 深圳 # home变量在北京、上海、广州、深圳这四个地名中间循环一次
do
echo "$home 是个好地⽅!"
done
[root@localhost test]# bash quzhi.sh
北京 是个好地⽅!
上海 是个好地⽅!
⼴州 是个好地⽅!
深圳 是个好地⽅!
[root@localhost test]#
[root@localhost test]# vim 1.sh
#!/bin/bash
x=1
for user in $(awk -F':' '{print $1}' /etc/passwd) # 在/etc/passwd文件中以用
户名作为循环
do
echo "第 $x ⽤户名称为: $user"
let x=x+1
done
echo "该系统有 $(($x-1)) 个⽤户"
[root@localhost test]# bash 1.sh
第 1 ⽤户名称为: root
...省略部分内容
第 45 ⽤户名称为: yunjisuan
第 46 ⽤户名称为: apache
第 47 ⽤户名称为: nginx
该系统有 47 个⽤户
[root@localhost test]#
(3)检测某个网段的存活主机
(4)判断包是否已安装
二、while 循环
1、作用
重复测试某个条件,只要条件成立则反复执行
2、结构
3、while 和 for区别
while循环也有条件判断,当条件成立的时候,会循环执行。当条件不成立退出
if判断当条件成立时,会执行一次,然后退出。当条件不成立时直接退出
[root@localhost test]# vim ping.sh
#!/bin/bash
for IP in $(echo 192.168.33.{100..120}) # 192.168.33网段的100到120的主机,在此
循环
do
ping -c 2 -i 0.1 $IP &> /dev/null
if [ $? -eq 0 ];then
echo "Host $IP is up."
fi
done
[root@localhost test]# bash ping.sh
Host 192.168.100.100 is up.
Host 192.168.100.101 is up.
[root@localhost test]#
[root@localhost test]# vim 2.sh
#!/bin/bash
for softpack in wget gcc pcre pcre-devel zlib zlib-devel;do
soft_result=$(rpm -qa $softpack)
if [ -z "$soft_result" ];then
yum install -y $softpack
else
echo "$softpack is installed"
fi
done
[root@localhost test]# bash 2.sh
wget is installed
gcc is installed
pcre is installed
pcre-devel is installed
zlib is installed
zlib-devel is installed
[root@localhost test]#
while 条件测试操作
do
命令序列
done
4、示例
(1)批量添加用户
创建时交互输入用户前缀、创建用户个数、初始密码、过期时间(可选设置),用户首次登陆强制要
求修改密码
三、循环的 break 和 continue
xxxxxxxxxx #!/bin/bash#简易计算器read -p "NUM_1 = " num1read -p "NUM_2 = "
num2x= echo "scale=2; $num1 / $num2"|bc | awk -F. '{print $1}' y= echo
"scale=2; $num1 / $num2"|bc | awk -F. '{print $2}' z= echo "scale=2; $num1 /
$num2"|bc -l a= printf "%.2f\n" $num1 | awk -F. '{print $2}' b= printf "%.2f\n"
$num2 | awk -F. '{print $2}' c= printf "%.2f\n" $num1 | awk -F. '{print
[root@localhost test]# vim useradd.sh # 批量创建⽤户脚本
#!/bin/bash
read -p "请输⼊创建⽤户的名称前缀:" QZ
read -p "请输⼊创建⽤户的个数:" NUM
read -p "请输⼊⽤户的初始密码:" PS
i=1
while [ $i -le $NUM ]
do
useradd $QZ$i
echo "$PS" |passwd --stdin $QZ$i &> /dev/null
chage -d 0 $QZ$i
let i++
done
:wq
[root@localhost test]# bash useradd.sh
请输⼊创建⽤户的名称前缀:admin
请输⼊创建⽤户的个数:5
请输⼊⽤户的初始密码:123456
[root@localhost test]# tail /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
yunjisuan:x:1000:1000:yunjisuan:/home/yunjisuan:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
nginx:x:975:974:Nginx web server:/var/lib/nginx:/sbin/nologin
admin1:x:1001:1001::/home/admin1:/bin/bash
admin2:x:1002:1002::/home/admin2:/bin/bash
admin3:x:1003:1003::/home/admin3:/bin/bash
admin4:x:1004:1004::/home/admin4:/bin/bash
admin5:x:1005:1005::/home/admin5:/bin/bash
[root@localhost test]# vim userdel.sh # 批量删除⽤户脚本
#!/bin/bash
read -p "请输⼊要删除⽤户的前缀:" QZ
read -p "请输⼊要删除⽤户的个数:" NUM
i=1
while [ $i -le $NUM ]
do
userdel -r $QZ$i
let i++
done
:wq
[root@localhost test]# bash userdel.sh
请输⼊要删除⽤户的前缀:admin
请输⼊要删除⽤户的个数:5
[root@localhost test]#
$1}' d= printf "%.2f\n" $num2 | awk -F. '{print $1}' if [ "
[ num2] echo "—————————————————————" echo " 相
减:" num1 -
[
num2] echo "—————————————————————" echo " 相
除:" num1 /
[
num2] echo "—————————————————————" exit 1else
echo "—————————————————————" echo " 相除结果:浮点数" echo
"—————————————————————" echo " 相加:" echo "scale=0; $num1
+ $num2" |bc -l echo "—————————————————————" echo " 相
减:" echo "scale=0; $num1 - $num2" |bc -l echo
"—————————————————————" echo " 相乘:" echo "scale=0; $num1
* $num2" |bc -l echo "—————————————————————"fiif [ -z
y" echo "—————————————————————"else
echo " 相除: a -eq
00 -a $b -eq 00 ];then echo " 取余:" echo "scale=0; $c % $d"|bc echo
"—————————————————————"fi[root@YH1 shell]# sh jisuan.shNUM_1 =
10NUM_2 = 3—————————————————————相除结果:浮点数
————————————————————— 相加:13
————————————————————— 相减:7
————————————————————— 相乘:30
————————————————————— 相除:3.33
————————————————————— 取余:1
—————————————————————[root@YH1 shell]# sh jisuan.shNUM_1 =
100NUM_2 = 25 —————————————————————相除结果: 整数
————————————————————— 相加: 125
————————————————————— 相减: 75
————————————————————— 相乘: 2500
————————————————————— 相除: 4
————————————————————— 取余: 0
—————————————————————shell
相除结果:整数
相乘:
取余:
相除:
break直接结束循环,循环立即退出
continue可以用来跳过一次循环,跳过后循环继续,直到循环停止
1、示例
[root@localhost test]# vim test.sh
#!/bin/bash
for line in 北京 上海 ⼴州 深圳
do
echo $line
if [ "$line" == "上海" ];then $ 循环到上海⽴即退出
break
fi
done
:wq
[root@localhost test]# bash test.sh
北京
上海
[root@localhost test]# vim test.sh
#!/bin/bash
for line in 北京 上海 ⼴州 深圳
do
三、九九乘法表
if [ "$line" == "上海" ];then
continue
fi
echo $line
done
:wq
[root@localhost test]# bash test.sh
北京
⼴州
深圳
[root@localhost test]#
[root@localhost test]# vim 99.sh
#!/bin/bash
#九九乘法表
for i in {1..9};do
for j in {1..9};do
echo -n "$j*$i=$(($i*$j)) "
if [ $j == $i ];then
echo -e '\n'
break
fi
done
done
:wq
[root@localhost test]# bash 99.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
[root@localhost test]#
[root@localhost test]# vim 99-2.sh
#!/bin/bash
#九九乘法表
i=1
while [ $i -le 9 ];do
j=1
while [ $j -le 9 ];do
echo -n "$j*$i=$(($i*$j)) "
if [ $j -eq $i ];then
echo -e '\n'
break
fi
let j++
done
let i++
done
:wq
[root@localhost test]# bash 99-2.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
脚本实战
一、系统性能监控脚本
#!/bin/bash
# 系统性能监控脚本
# 时间
Time=$(date +"%Y-%m-%d %H:%M:%S")
# ip
ip=$(ifconfig ens32 | grep -w inet | awk '{print $2}')
# 内存剩余空间
a=$(cat /proc/meminfo | grep -i avai | awk '{print $2}')
free_mem=$(($a / 1024))
# 磁盘剩余空间
b=$(df | grep "/$" | awk '{print $4}')
free_disk=$(($b / 1024 / 1024))
# 已登录用户
users=$(who | wc -l)
# 当前进程数
procs=$(ps aux | wc -l)
warn=/root/warning
mkdir -p $warn
if [ $free_mem -lt 1024 ];then
echo -e "$Time,内存剩余不足1G!\n当前内存剩余:
$free_mem\n主机IP:$ip">>$warn/mem_warning
else
echo "$Time,内存剩余容量正常" >> $warn/mem_warning
fi
if [ $free_disk -lt 10 ];then
echo -e "$Time,磁盘剩余不足10G!\n当前磁盘剩余:
$free_disk\n主机IP:$ip">>$warn/disk_warning
else
echo "$Time,磁盘剩余容量正常" >> $warn/disk_warning
fi
if [ $users -gt 3 ];then
echo -e "$Time,当前用户登录过多!\n当前用户数:$users\n
主机IP:$ip">>$warn/user_warning
else
echo "$Time,登录用户正常" >> $warn/user_warning
fi
if [ $procs -gt 500 ];then
echo -e "$Time,进程数量过多!\n当前进程数:$procs\n主机
IP:$ip">>$warn/procs_warning
else
echo "$Time,进程数正常" >> $warn/procs_warning
fi
#!/bin/bash
g='\e[1;32m'
e='\e[0m'
prin(){
echo -e "$1"
}
cpu_red(){
#内核数[即线程]
cpu_processor=`grep processor /proc/cpuinfo | wc -
l`
#CPU数量[即多路]
cpu_number=`cat /proc/cpuinfo| grep "physical id"|
sort| uniq| wc -l`
#CPU物理内核
cpu_core=`cat /proc/cpuinfo | grep "cpu cores" |
sed -n '1p' | awk '{print $4}'`
#CPU型号
cpu_info=`cat /proc/cpuinfo | grep name | cut -f2
-d: | uniq -c`
}
mem_red(){
#总内存[单位MB]
total=`free -m | grep -v "Swap" | awk '{print $2}'
| sed -n "2p"`
used=`free -m | grep -v "Swap" | sed -n '2p' | awk
'{print $3}'`
二、菜单脚本
free=`free -m | grep -v "Swap" | sed -n '2p'| awk
'{print $4}'`
shared=`free -m | grep -v "Swap" | sed -n '2p' |
awk '{print $5}'`
cache=`free -m | grep -v "Swap" | sed -n '2p' |
awk '{print $6}'`
}
print_cpu(){
cpu_red
echo -e "CPU物理数:${g}${cpu_number}${e}\nCPU内核
数:${g}${cpu_core}${e}\nCPU型号:${g}${cpu_info}${e}"
if [[ ${cpu_core} == ${cpu_processor} ]];then
echo -e "超线程:${g}支持${e}"
else
echo -e "超线程:${g}不支持${e}"
fi
}
print_mem(){
mem_red
d="当前主机内存信息 总内存:${g}${total}MB${e} 当前已
用:${g}${used}MB${e} 当前可用:${g}${free}MB${e} 共享占
用:${g}${shared}MB${e} 缓存占用:${g}${cache}MB${e}"
for i in $d;do
prin "$i"
done
}
print_cpu
print_mem
#!/bin/bash
clear
echo -e "\033[33m—————————————————————————————————\033[0m"
echo -e "|\e[2;12H\033[43;30m这里是菜单\033[0m\t\t|"
echo -e "\033[33m—————————————————————————————————\033[0m"
echo -e "|\e[36m1.查看网卡信息\e[0m\t\t\t|"
echo -e "|\e[34m2.查看内存信息\e[0m\t\t\t|"
echo -e "|\e[35m3.查看磁盘信息\e[0m\t\t\t|"
echo -e "|\e[32m4.查看CPU信息\e[0m\t\t\t|"
echo -e "|\e[33m5.查看账户信息\e[0m\t\t\t|"
echo -e "\033[33m—————————————————————————————————\033[0m"
echo
read -p "请输入选项[1-5]:" key
case $key in
1)
ens=`ifconfig|head -1|awk -F':' '{print
$1}'`
ip=`ifconfig|head -2|tail -1|awk '{print
$2}'`
run=`ifconfig ens32|head -1|awk -F','
'{print $3}'`
echo -e "网卡名称:$ens\nIP地址:$ip\n启动状
态:$run"
;;
2)
a=$(free |grep Mem |tr -s " " | cut -d" "
-f7)
mem=$(echo "scale=2;$a / 1024"|bc -l)
echo "当前内存剩余容量:${mem}M"
;;
3)
b=$(df | grep /$ | tr -s " " | cut -d " "
-f4)
disk=$(echo "scale=2;$b / 1024"|bc -l)
echo "当前磁盘剩余容量:${disk}M"
;;
4)
cpu=$(uptime | tr -s " " | cut -d" " -f12)
echo "本机CPU的15分钟的平均负载为:$cpu"
;;
5)
login_num=$(who | wc -l)
total_num=$(cat /etc/passwd | wc -l)
echo "当前系统登录账户:$USER"
echo "当前登陆系统的账户数量为:$login_number"
echo "当前系统中总⽤户数量为:$total_number"
;;
*)
三、nginx 启动脚本
echo "您输入的序号有误,请重新输入!"
exit 1
;;
esac
#!/bin/bash
nginx="/usr/local/nginx"
pid="/usr/local/nginx/logs/nginx.pid"
case $1 in
start)
if [ -f $pid ];then
echo -e "\033[91mNginx运行
中...\033[0m"
exit 1
else
$nginx && echo -e "\033[32mNginx已
启动 ~\033[0m"
fi
;;
stop)
if [ ! -f $pid ];then
echo -e "\033[91mNginx未运行!
\033[0m"
exit 2
else
$nginx -s stop && echo -e
"\033[32mNginx已停止!\033[0m"
fi
;;
restart)
if [ ! -f $pid ];then
echo -e "\033[91mNginx未运行!
\033[0m"
echo -e "\033[91m请先启动Nginx!
\033[0m"
exit 3
else
$nginx -s stop && $nginx && echo -
e "\033[32mNginx已重启!\033[0m"
fi
;;
status)
if [ -f $pid ];then
echo -e "\033[32mNginx运行
中...\033[0m"
else
echo -e "\033[91mNginx未运行!
\033[0m"
fi
;;
reload)
if [ ! -f $pid ];then
echo -e "\033[91mNginx未运行!
\033[0m"
exit 4
else
$nginx -s reload && echo -e
"\033[32mNginx配置文件已重新载入...\033[0m"
fi
;;
*)
echo "输入错误!格式:$0
[start|stop|restart|status|reload]"
;;
esac
四、简易猜拳脚本
#!/bin/bash
computer=$[RANDOM%3+1]
g='\e[1;32m'
e='\e[0m'
clear
echo -e "${g}—————————————————————————————————${e}"
echo -e "${g}#\t 石头剪刀布游戏\t\t#${e}"
echo -e "${g}—————————————————————————————————${e}"
echo -e "${g}#${e} 请输入对应序号出拳 \t${g}#${e}"
echo -e "${g}—————————————————————————————————${e}"
echo -e "${g}#${e}\t\033[33m1.剪刀\033[0m\t\t\t${g}#${e}"
echo -e "${g}#${e}\t\033[35m2.石头\033[0m\t\t\t${g}#${e}"
echo -e "${g}#${e}\t\033[31m3.布\033[0m\t\t\t${g}#${e}"
echo -e "${g}—————————————————————————————————${e}"
echo
read -p "请输入序号[1-3]:" person
case $person in
1)
if [[ $computer == 1 ]];then
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 您出:剪刀
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机:石头
\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机赢!
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
elif [[ $computer == 2 ]];then
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 您出:剪刀
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机:剪刀
\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 平局
~\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
elif [[ $computer == 3 ]];then
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 您出:剪刀
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机:布
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 恭喜,您获胜!
\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
fi;;
2)
if [[ $computer == 1 ]];then
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 您出:石头
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机:石头
\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 平局
~\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
elif [[ $computer == 2 ]];then
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 您出:石头
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机:剪刀
\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 恭喜,您获胜!
\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
elif [[ $computer == 3 ]];then
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 您出:石头
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机:布
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机赢!
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
fi;;
3)
if [[ $computer == 1 ]];then
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 您出:布
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机:石头
\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 恭喜,您获胜!
\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
elif [[ $computer == 2 ]];then
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 您出:布
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机:剪刀
\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机胜!
\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
elif [[ $computer == 3 ]];then
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 您出:布
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 计算机:布
\t\t|${e}"
echo -e "${g}
—————————————————————————————————${e}"
echo -e "${g}|\t 平局
~\t\t|${e}"
五、随机双色球脚本
echo -e "${g}
—————————————————————————————————${e}"
fi;;
*)
echo "请正确输入出拳序号!"
exit 1
;;
esac
#!/bin/bash
RED_COL='\033[91m'
BLUE_COL='\033[34m'
NONE_COL='\033[0m'
red_ball=""
while :
do
clear
echo "---机选双色球---"
tmp=$[RANDOM%33+1]
if echo "$red_ball" | grep -q -w $tmp; then
continue
fi
red_ball+=" $tmp"
echo -en "$RED_COL$red_ball$NONE_COL"
word=$(echo "$red_ball" | wc -w)
if [ $word -eq 6 ]; then
blue_ball=$[RANDOM%16+1]
echo -e "$BLUE_COL $blue_ball$NONE_COL"
break
fi
sleep 0.5
done
BLUE_COL='\033[34m'
NONE_COL='\033[0m'
# 使用关联数组来存储选中的红球号码,方便后续检查是否重复选中
declare -A red_balls
# 生成1到33的随机数,检查是否已经选中,如果没有,则添加到red_balls数
组并输出
function select_red_ball {
local num=$(( RANDOM % 33 + 1 ))
if [[ -z ${red_balls[$num]} ]]; then
red_balls[$num]="true"
echo -e "$RED_COL $num$NONE_COL"
else
# 如果已经选中,则重新选择
select_red_ball
fi
sleep 0.5
}
# 生成1到16的随机数,作为蓝球号码并输出
function select_blue_ball {
local num=$(( RANDOM % 16 + 1 ))
echo -e "$BLUE_COL $num$NONE_COL"
}
clear
echo "红球号码:"
# 主循环,持续选择红球,直到选够6个为止
while [[ ${#red_balls[@]} -lt 6 ]]; do
select_red_ball
done
echo "蓝球号码:"
sleep 0.5
# 选择蓝球号码并输出
select_blue_ball