shell脚本与sed基本语法

news2024/11/16 16:49:44

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一个设计模式——单例模式

目录 一、特点&#xff1a; 二、实现单例模式步骤 三、饿汉式 四、懒汉式 五、双重检查锁 六、静态内部类 七、枚举 八、可能被反序列化和反射破坏什么意思&#xff1f; 九、如何解决呢&#xff1f; 一、特点&#xff1a; 唯一性&#xff0c;单例模式确保程序中只有一…

甘肃粉条:一口爽滑,满心欢喜

在甘肃的美食世界里&#xff0c;粉条是一道独具特色的存在&#xff0c;它以其爽滑的口感和多样的烹饪方式&#xff0c;赢得了无数人的喜爱。甘肃食家巷粉条&#xff0c;选用当地优质的土豆或红薯为原料&#xff0c;经过一系列精细的加工工艺&#xff0c;最终成就了这一根根晶莹…

SSRF (服务端请求伪造)

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

2-48 基于matlab的EM算法聚类可视化程序

基于matlab的EM算法聚类可视化程序&#xff0c;通过期望最大化算法&#xff08;EM&#xff09;优化类别间距&#xff0c;使得类别间距最大、类内间距最小。输出聚类前后结果及收敛曲线。程序已调通&#xff0c;可直接运行。 2-48 期望最大化算法&#xff08;EM&#xff09; 聚类…

6/9-axis imu sensor/姿态传感器 学习板/开发板 开源 MPU6500 QMC5883 加速度 陀螺仪 地磁传感器

1-应用领域&#xff1a; 游戏交互、3D模型控制、机器人、设备姿态检测、翻转状态检测、无人机、无人船、无人车、VR/AR、AHRS、姿态算法研究与分析&#xff0c;短距无效姿态测量、车辆调平系统&#xff0c;机器震动检测 2-产品硬件规格: 尺寸: 蓝牙:5.0 电池:默认150ma&…

TCP程序设计

TCP概述 建立连接 客户端和服务器端在建立连接时&#xff1a; 服务端是典型的监听接受连接的模式&#xff0c;就是ListenAccept 客户端是主动建立连接的模式&#xff0c;就是Dial Go语言中使用 net包实现网络的相关操作&#xff0c;包括我们TCP的操作。 用于建立连接的典型…

tusiart吐司艺术图像生成、LoRA 模型的使用和训练网站

文章目录 前言一、Tusiart&#xff08;吐司艺术&#xff09;是什么二、Tusiart&#xff08;吐司艺术&#xff09;主要功能三、Tusiart&#xff08;吐司艺术&#xff09; 网站图片四、Tusiart&#xff08;吐司艺术&#xff09; 相关地址总结 前言 每天分享一个关于AI项目或者网…

【系统架构设计师】二十、云原生架构设计理论与实践①

目录 一、云原生架构内涵 二、云原生的原则 三、主要架构模式 四、典型的云原生架构反模式 相关推荐 一、云原生架构内涵 云原生架构是基于云原生技术的一组架构原则和设计模式的集合&#xff0c;旨在将云应用中的非业务代码部分进行最大化的剥离&#xff0c;从而让云设施…

SQL Server索引碎片的基本知识(附Demo)

目录 前言1. 基本知识2. 检索碎片2.1 dm_db_index_physical_stats2.2 DBCC SHOWCONTIG 3. 修复和优化 前言 索引碎片太高本身会阻碍查询的效率&#xff0c;这个问题要重视 1. 基本知识 索引中的数据页不再连续&#xff0c;导致存储和检索数据时的效率降低 碎片通常发生在以…

虚拟机启动电脑蓝屏问题解决方案

1.查看CPU虚拟化是否开启&#xff0c;没有开启的可以按照教程开启 打开任务管理器&#xff0c;查看是否开启CUP虚拟化 如果没有开启,可以查看下面的链接&#xff0c;进入BIOS开启 win10如何开启虚拟化支持_win10开启cpu虚拟化的方法&#xff0d;系统城 2&#xff0c;控制面板…

C#中的同步编程和异步编程

1. 简单描述一下同步编程和异步编程 同步编程&#xff1a;按照代码的顺序一行一行执行&#xff0c;如果某个操作需要等待&#xff08;比如读取文件、网络请求、数据库操作等&#xff09;&#xff0c;那么当前的线程就会停下来&#xff0c;一直到这个操作完成了之后&#xff0c…

无坚不摧的Python重试机制:探索Tenacity库

无坚不摧的Python重试机制&#xff1a;探索Tenacity 库 背景&#xff1a;为何选择Tenacity&#xff1f; 在软件开发中&#xff0c;我们经常面临需要重试操作的场景&#xff0c;比如网络请求、数据库操作等。这些操作可能会因为各种原因暂时失败&#xff0c;但稍后可能会成功…

更换CentOS Stream 8镜像源

CentOS Stream 8替换阿里云镜像源 确认CentOS版本 hostnamectl备份当前配置 sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.backup创建临时文件下载目录 mkdir -p /tmp/aliyun-repos cd /tmp/aliyun-repos下载 .repo 文件列表并解析链接 wget -r -np -nd -A ".repo&…

ssm框架整合,异常处理器和拦截器(纯注解开发)

目录 ssm框架整合 第一步&#xff1a;指定打包方式和导入所需要的依赖 打包方法&#xff1a;war springMVC所需依赖 解析json依赖 mybatis依赖 数据库驱动依赖 druid数据源依赖 junit依赖 第二步&#xff1a;导入tomcat插件 第三步&#xff1a;编写配置类 SpringCon…

C++知识点总结:2.类和对象(自用)

类和对象 1. 类和对象的关系2. 对象指针3. 在堆上创建对象4. 成员访问限定符5. 名字编码&#xff08;Name Mangling&#xff09;6.构造函数7.构造函数的重载8.初始化列表8. 成员变量初始化的顺序&#xff08;通过初始化列表&#xff09;9. 初始化 const 成员变量10. 析构函数11…

安装 moleculeSTM 踩坑日记

“学习 LLM &#xff0c;在大模型时代为自己存张船票”。 相信很多人都有这样的想法。那么&#xff0c;在 AI for science 领域&#xff0c;哪些 LLM 模型值得一试呢&#xff1f; 笔者认为&#xff1a; LLM 直接预测 SMILES 性质 or 直接生成 SMILES 的技术路线是行不通的。因…

成为git砖家(6): git restore 命令

文章目录 1. git restore 命令是新命令2. git官方对于restore命令的说明3. 总结 1. git restore 命令是新命令 在2019年8月发布的 Git 2.23 版本中&#xff0c;git checkout 命令的功能被拆解到两个新的命令中&#xff1a; git switch: 负责分支相关的操作git restore: 负责文…

微信小程序教程001:小程序简介

文章目录 学习目标小程序简介1、小程序和普通网页开发的区别2、注册小程序账号3、获取小程序的AppID4、安装开发者工具4.1 了解开发者工具4.2 下载开发工具 5、设置开发者工具外观 学习目标 如何创建小程序项目小程序项目的基本组成结构小程序页面由几部分组成小程序常见的组件…

Vscode——如何快速搜索项目工程中的某个文件的位置

第一步&#xff1a;按 shift ctrl p 第二步&#xff1a;然后把 > 删除 第三步&#xff1a;输入文件名称即可