FOR 和 SELECT 循环语句的应用实践
文章目录
- FOR 和 SELECT 循环语句的应用实践
- 1 for 循环语法结构
- 1.1 变量取值型
- 1.2 C 语言型
- 2 for 循环语句的基础实践
- 示例1:竖向升序打印
- 示例2:竖向降序打印
- 示例3:求和、求乘积
- 示例4:求水仙花数
- 示例5:求素数
- 示例6:九九乘法表
- 示例7:求出满足条件的4位数
- 示例8: 百钱买百鸡
- 示例9:三对情侣参加婚礼
- 示例10:求a+aa+aaa+...aaaaa
- 示例11:排列组合
- 3 for 循环语句的企业级案例
- 4 for 循环语句的企业高级实战案例
- 5 Linux 系统产生随机数的6种方法
- 6 select 循环语句介绍及语法
- 7 select 循环语句案例
for循环语句和while循环语句类似,但for循环语句主要用于执行次数有限的循环,而不是用于守护进程及无限循环。for循环语句常见的语法有两种,下面将在不同的语法中对for循环语句进行详尽的讲解。
1 for 循环语法结构
1.1 变量取值型
第一种for循环语句语法结构如下:
for变量名in变量取值列表do指令...done在此结构中“in 变量取值列表”可以省略,省略时相当于in "$@",也就是使用for i就相当于使用for i in "$@"。
这种for循环语句执行过程如下:
- for关键字后面会有一个“变量名”,变量名依次获取in关键字后面的变量取值列表内容(以空格分隔)。
- 每次仅取一个,然后进入循环(do和done之间的部分)执行循环内的所有指令,当执行到done时结束本次循环。
- 之后,“变量名”再继续获取变量列表里的下一个变量值,继续执行循环内的所有指令,当执行到done时结束返回。
- 以此类推,直到取完变量列表里的最后一个值并进入循环执行到done结束为止。
1.2 C 语言型
第二种for循环语句称为C 语言型for循环,语法结构如下:
for((expl;exp2;exp3))do指令...done此种循环语句和while循环语句类似,但语法结构比while循环更规范、工整。
这种for循环语句说明如下:
for关键字后的双括号内是三个表达式:
第一个是变量初始化(例如:i=0)
第二个为变量的范围(例如:i<100)
第三个为变量自增或自减(例如:i++)。
当第一个表达式的初始值符合第二个变量的范围时,就进入循环执行;条件不满足时就退出循环。
for循环结构执行流程对应的逻辑图如下:
2 for 循环语句的基础实践
示例1:竖向升序打印
# 列表型[laoma@shell ~]$vimfor1.sh#!/bin/bashforiin{1..5}doecho$idone[laoma@shell ~]$bashfor1.sh12345[laoma@shell ~]$vimfor2.sh#!/bin/bashforiin$(seq5)doecho$idone# c语言型[laoma@shell ~]$vimfor3.sh#!/bin/bashfor((i=1;i<=5;i++))doecho$idone# while型[laoma@shell ~]$vimwhile1.sh#!/bin/bashi=1while((i<=5))doecho$i((i++))done示例2:竖向降序打印
[laoma@shell ~]$vimfor4.sh#!/bin/bashforiin{5..1}doecho$idone[laoma@shell ~]$bashfor4.sh54321[laoma@shell ~]$vimfor5.sh#!/bin/bashforiin$(seq5-11)doecho$idone示例3:求和、求乘积
#!/bin/bashsum=0foriin{1..10}dosum=$[sum+ i]doneecho$(seq-s'+'10)=$sum#!/bin/bashsum=1foriin{1..10}do((sum*=i))doneecho$(seq-s'*'10)=$sum示例4:求水仙花数
水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。
#!/bin/bashfornumin{100..999}don1=$[num/100]n2=$[num%100/10]n3=$[num%10]if[$[n1**3 + n2**3 + n3**3]-eq$num];thenecho$n1^3 +$n2^3 +$n3^3=$n1$n2$n3fidone示例5:求素数
素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。
#!/bin/bashecho-n"100~200之间所有的素数为:"for((i=100;i<=200;i++))do# 除数的范围是2和本身-1的数for((j=2;j<=i-1;j++))do# 如果能整除,说明不是质数,跳出本次循环if[$[i%j]-eq0];thenbreakfi# 如果本次循环到最后都不能整除,则是质数if[$j-eq $[i-1]];thenecho-n"$i"fidonedoneecho执行结果:
100~200之间所有的素数为: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199示例6:九九乘法表
#!/bin/bashfornum1in{1..9}dofor((num2=1;num2<=num1;num2++))doecho-en"$num2*$num1=$[ num2 * num1 ]\t"doneechodone示例7:求出满足条件的4位数
解题思路:
- 余数是5,除数肯定大于5,至少是6
- 大于等于6的个位数乘以一个数,结果是还是一位数,则商上面的每个数都是1。
解题思路1:从1000开始枚举到9999
[laoma@shell ~]$vimcompute1.sh#!/bin/bash# num是被除数fornumin{1000..9999}do# i是除数foriin{6..9}donum1=$[$num/1000]num2=$[$num/100%10]num3=$[$num/10%10]num4=$[$num%10]e=$[num1*10+num2-i]if((e<10));thenf=$[e*10+num3-i]if((f<10&&$[f*10+num4-i]==5));thenecho"${i}x111+5=$num"fifidonedone解题思路2:分别对每个数进行枚举。
[laoma@shell ~]$vimcompute2.sh#!/bin/bashfor((i=6;i<=9;i++))dofor((a=1;a<=9;a++))dofor((b=0;b<=9;b++))doe=$[a*10+b-i]# e是个位数if[$e-lt10];thenfor((c=0;c<=9;c++))do# f是个位数f=$[e*10+c-i]if[$f-lt10];thenfor((d=0;d<=9;d++))doif[$[f*10+d-i]-eq5];thenecho"${i}x111+5=$[i*111+5]"fidonefidonefidonedonedone示例8: 百钱买百鸡
中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”:
鸡翁一,值钱五
鸡母一,值钱三
鸡雏三,值钱一
百钱买百鸡,问翁、母、雏各几何?
#!/bin/bash# 鸡翁数量 cock_num# 鸡母数量 hen_num# 鸡雏数量 chick_num# 鸡总数量 sumsum=100# 钱总数 moneymoney=100for((cock_num=1;cock_num<=money/5;cock_num++))dofor((hen_num=1;hen_num<=money/3;hen_num++))doforchick_numin{3..100..3}doif[$[cock_num+hen_num+chick_num]-eq$sum-a $[cock_num*5+hen_num*3+chick_num/3]-eq$money];thenecho"鸡翁:$cock_num鸡母:$hen_num鸡雏:$chick_num"echo"$cock_num*5+$hen_num*3+$chick_num/3=100"echofidonedonedone执行结果:
鸡翁:4 鸡母:18 鸡雏:784*5+18*3+78/3=100鸡翁:8 鸡母:11 鸡雏:818*5+11*3+81/3=100鸡翁:12 鸡母:4 鸡雏:8412*5+4*3+84/3=100示例9:三对情侣参加婚礼
3个新郎为A、B、C,3个新娘为X、Y、Z。有人想知道究竟谁与谁结婚,于是就问新人中的三位,得到如下结果:
- A说他将和X结婚;
- X说她的未婚夫是C;
- C说他将和Z结婚。
这人事后知道他们说的全是假话。那么,究竟谁与谁结婚呢?
解题思路:
- 根据之前的假话得出反向判定条件
- 多个人不能同时和一个人结婚
方法一:
#!/bin/bashforAinX Y ZdoforBinX Y ZdoforCinX Y Zdoif["$A"!="$B"-a"$A"!="$C"-a"$B"!="$C"-a"$A"!="X"-a"$C"!="X"-a"$C"!="Z"];thenechoA 与$A结婚echoB 与$B结婚echoC 与$C结婚fidonedonedone方法二:
#!/bin/bash# 将X Y Z 抽象为 1 2 3# 定义函数,根据参数1的值判断是X Y Zduixiang(){case$1in1)echoX;;2)echoY;;3)echoZ;;esac}for((A=1;A<=3;A++))dofor((B=1;B<=3;B++))dofor((C=1;C<=3;C++))do# 多个人不能同时和一个人结婚# 根据之前的假话得出反向判定条件if[$A-ne1-a$C-ne1-a$C-ne3-a$A-ne$B-a$A-ne$C-a$B-ne$C];thenecho"A 与$(duixiang $A)结婚"echo"B 与$(duixiang $B)结婚"echo"C 与$(duixiang $C)结婚"exitfidonedonedone执行结果:
A 与 Z 结婚 B 与 X 结婚 C 与 Y 结婚示例10:求a+aa+aaa+…aaaaa
例如:2+22+222+2222+22222(此时共有5个数相加),数字和数字最长位数由键盘输入。
解题思路:
- 枚举数字长度
- 计算出特定长度数字值,然后计算总值
程序代码:
#!/bin/bashread-p"输入1-9之间一个数:"mread-p"输入数字的最长位数:"n# 定义最终和sum=0for((i=1;i<=n;i++))do# count是j位m的值,每次计算完count值设置为0count=0for((j=1;j<=i;j++))do# 计算j位m的值count=$[count+m*10**(j-1)]doneecho-n"$count"# 控制输出if[$i-eq$n];thenecho-n"= "elseecho-n"+ "fisum=$[sum+count]doneecho$sum执行结果:
输入1-9之间一个数:6 输入数字的最长位数:5 6 + 66 + 666 + 6666 + 66666 = 74070示例11:排列组合
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
解题思路:枚举。
程序代码:
#!/bin/bash# 组合数量为sumsum=0echo-n"组合包括:"for((i=1;i<=4;i++))dofor((j=1;j<=4;j++))dofor((k=1;k<=4;k++))doif[$i-ne$j-a$i-ne$k-a$j-ne$k];thenecho-n"$i$j$k"sum=$[sum+1]fidonedonedoneechoecho"组合总数量为:$sum"执行结果:
组合包括:123 124 132 134 142 143 213 214 231 234 241 243 312 314 321 324 341 342 412 413 421 423 431 432 组合总数量为:243 for 循环语句的企业级案例
示例1:批量修改文件扩展名(把txt改成jpg)
[laoma@shell ~]$touchfile-{1..3}.txt[laoma@shell ~]$lsfile-{1..3}.txt file-1.txt file-2.txt file-3.txt# 获取新文件名方法[laoma@shell ~]$echofile-3.txt|sed's/\.txt$/.jpg/'file-3.jpg[laoma@shell ~]$echo$(echofile-3.txt|cut-d. -f1).jpg file-3.jpg[laoma@shell ~]$echo$(echofile-3.txt|awk-F.'{print$1}').jpg# 使用sed[laoma@shell ~]$vimfor6.sh#!/bin/bashforfilein$(ls*.txt)donew_name=$(echo$file|sed's/.txt$/.jpg/')mv$file${new_name}done[laoma@shell ~]$bashfor6.sh[laoma@shell ~]$lsfile* file-1.jpg file-2.jpg file-3.jpg# 还可以直接使用rename命令[laoma@shell ~]$rename".jpg"".txt"*jpg[laoma@shell ~]$ls*txt file-1.txt file-2.txt file-3.txt# rename还可用于删除文件名中特定字符串[laoma@shell ~]$rename"file-"""*txt[laoma@shell ~]$ls*txt1.txt2.txt3.txt示例2:批量设置服务开启启动
#!/bin/bashforserviceincrond atd chronyddosystemctlenable$servicedone示例3:批量重启多个主机sshd服务
#!/bin/bashforhostinserver{1..10}dosshroot@$hostsystemctl restart sshddone示例4:批量备份文件
#!/bin/bashforfileinhost*docp$file/backup/${file}.bak;done示例5:分析当前网络172.25.254.0/24网络中有哪些机器在线?
#!/bin/shforiin`seq1254`doIP=172.25.254.$ping-c2$IP&>/dev/nullif[$?-eq0];thenecho"$IPis online">>node_online.txtelseecho"$IPis offline">>node_offline.txtfidone注意:如果想并发扫描,只需要再fi后添加符号&即可。
示例6:监控主机磁盘。
- 假设被监控主机ip列表存放在文件 /tmp/hosts。
- 监控一组主机,如果主机文件系统使用超过80%,就报警。
#!/bin/bashhostfile=/tmp/hostsif[$(cat$hostfile|wc-l)-lt1];thenecho$hostfileis empty.exit1fiforhostin$(cat$hostfile)do>disk.logecho"=============HOSTNAME:$host=============">>disk.logssh$hostdf-h|grep'^/dev/'|awk'{print$1,$5}'|cut-f1-d%|awk'{if ($2> 80) print$0}'>>disk.logif[$(catdisk.log|wc-l)-gt1];thencatdisk.log|mail -s"$host: disk is greater than 80%"root@localhostfidone4 for 循环语句的企业高级实战案例
# 准备mariadb数据库[laoma@shell scripts]$sudoyuminstall-y mariadb-server[laoma@shell scripts]$sudosystemctl start mariadb示例1:实现 MySQL库备份的脚本
创建数据库脚本
[laoma@shell scripts]$vimcreate_dbs.sh#!/bin/bashMYSQL_CMD='mysql -uroot -e 'fordbinweb1 web2do${MYSQL_CMD}"create database$db;"done执行效果
[laoma@shell scripts]$bashcreate_dbs.sh[laoma@shell scripts]$ mysql -uroot -e'show databases;'+--------------------+|Database|+--------------------+|information_schema||mysql||performance_schema||test||web1||web2|+--------------------+备份数据库脚本
[laoma@shell scripts]$vimdump_dbs.sh#!/bin/bashMYSQL_CMD='mysqldump -uroot 'fordbinweb1 web2do${MYSQL_CMD}$db>$db.sql;done执行效果
[laoma@shell scripts]$bashdump_dbs.sh[laoma@shell scripts]$ls*sql web1.sql web2.sql示例2:实现 MySQL分库分表备份的脚本
创建表脚本
[laoma@shell scripts]$vimcreate_tables.sh#!/bin/bashMYSQL_CMD='mysql -uroot$db-e 'fordbinweb1 web2do${MYSQL_CMD}"create table test(id int,name varchar(16));insert into test values(1,'testdata')";done执行结果
[laoma@shell scripts]$bashcreate_tables.sh[laoma@shell scripts]$ mysql -uroot -e'use web1;show tables; select * from test;'+----------------+|Tables_in_web1|+----------------+|test|+----------------+ +------+----------+|id|name|+------+----------+|1|testdata|+------+----------+备份表脚本
[laoma@shell scripts]$vimdump_tables.sh#!/bin/bashMYSQL_CMD='mysqldump -uroot$db'fordbinweb1 web2do${MYSQL_CMD}>${db}_test.sql;done执行效果
[laoma@shell scripts]$bashdump_tables.sh[laoma@shell scripts]$ls*test.sql web1_test.sql web2_test.sql示例3:批量创建系统账号
创建用户账号,账号清单来源于文件/tmp/users,文件内容如下:
laoma laowang tony jack设置密码(密码为随机数,要求是字符和数字的混合)
要求用户首次登录必须更改密码。
用户信息保存在 /etc/users文件中,格式:
username: USERNAME password: PASSWRODUSERNAME和PASSWORD是真实的用户名和密码。
创建成功显示:AddUSERNAMESuccess。
创建失败显示:AddUSERNAMEFail。
准备用户清单
cat>/tmp/users<<EOF laoma laowang tony jack EOF参考脚本如下:
#!/bin/bash# Author: LaoMa# Time: 2022-12-10 12:28:34# Name: create_users.sh# 引入系统函数库./etc/init.d/functions# 用户信息保存到users_info_file定义的文件中users_info_file=/etc/usersusers_list_file=/tmp/users[!-f$users_info_file]&&touch$users_info_fileexec<${users_list_file}# 创建用户并设置密码whilereadusernamedo# 获取密码pass=$(echo"$user+$RANDOM"|md5sum|cut-c3-11)# 添加用户并设置密码useradd$username&>/dev/null&&chage -d0$username&&\echo"$pass"|passwd--stdin$username&>/dev/null&&\echo-e"username:$username\tpassword:$pass">>$users_info_file# 根据返回值判断用户和密码是否添加成功。if[$?-eq0];then#优雅地显示成功action"$usernameis ok"/bin/trueelse# 优雅地显示失败action"$usernameis fail"/bin/falsefidoneecho---------------------------cat$users_info_file执行结果
[laoma@shell scripts]$sudobashusers.sh laoma01 is ok[OK]laoma02 is ok[OK]laoma03 is ok[OK]laoma04 is ok[OK]laoma05 is ok[OK]laoma06 is ok[OK]laoma07 is ok[OK]laoma08 is ok[OK]laoma09 is ok[OK]laoma10 is ok[OK]--------------------------- user: laoma01 passwd:31e617e6b user: laoma02 passwd:23b5f1dab user: laoma03 passwd:74a2ed20a user: laoma04 passwd:ec25542b3 user: laoma05 passwd:e4a709eef user: laoma06 passwd:a9568297d user: laoma07 passwd:f800b9d10 user: laoma08 passwd:4c10f9f29 user: laoma09 passwd:a11c595b1 user: laoma10 passwd:a2e346c245 Linux 系统产生随机数的6种方法
方法1:通过系统环境变量(RANDOM)实现
RANDOM的随机数范围为0~32767,因此加密性不是很好,可以通过在输出的随机数前后增加自定义字符串的方式解决,最后再一起执行md5sUm操作并截取结果的后n位,这样一来,就无法根据随机数范围0~32767来猜出具体结果了。
[laoma@shell ~]$echo"laoma$RANDOM"|md5sum|cut-c1-8 884075a2方法2:通过openssl产生随机数,结果中包涵字母大小写和数字更加安全。
[laoma@shell ~]$ openssl rand -base648+uArtNyqlCc=[laoma@shell ~]$ openssl rand -base6420pkNvRrTzvzn2wYFsSRcSoL3lWao=方法3:通过date命令获得随机数,%N输出纳秒(nanoseconds)。
[laoma@shell ~]$date+%s%N1670641243375230850[laoma@shell ~]$date+%s%N1670641244098686603方法4:通过设备/dev/urandom或/dev/random和md5sum生成随机数。
这两个设备存储着系统当前运行的环境的实时数据。它可以看作是系统某个时候,唯一值数据,因此可以用作随机数元数据。我们可以通过文件读取方式,读得里面数据。
/dev/urandom,返回指定请求数量的随机数,如果请求的数量非常庞大的话,返回的随机数可能是伪随机数,随机数质量稍差些。即使如此,它们对大多数应用来说已经足够了。
/dev/urandom,也是返回指定请求数量的随机数,但是它产生的随机数质量很高, 是属于真随机数, 主要用于需要高质量的随机数的地方,比如:生成加密密钥等。
为了保证随机数的质量,
/dev/random只能返回熵池当前最大可用的随机二进制位,当请求超过这个值,就会阻塞,直到熵池中有足够的随机二进制位。
[laoma@shell ~]$head/dev/urandom|md5sum c597b451b896ad5294c582ba4fce1d0f -[laoma@shell ~]$head/dev/urandom|md5sum 05f666f24ce1144804e74d21b9390ed6 -方法5:通过UUID生成随机数。
UUID码全称是通用唯一识别码(UniversallyUniqueIdentifier,UUID),它是一个软件建构的标准,亦为自由软件基金会(OpenSoftwareFoundation,OSF)的组织在分布式计算环境(DistributedComputingEnvironment,DCE)领域的一部分。
UUID的目的是让分布式系统中的所有元素都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其他人发生冲突的UUID。在这样的情况下,就不需要考虑数据库创建时的名称重复问题了。它会让网络中任何一台计算机所生成的UUID码都是互联网整个服务器网络中唯一的编码。它的原信息会加人硬件、时间、机器当前运行信息等。
[laoma@shell ~]$cat/proc/sys/kernel/random/uuid 42d2d760-f865-450f-b231-1dcabd591d1c[laoma@shell ~]$ uuidgen 5bf06174-dad9-4680-bd7d-bc1d3a02e70f方法6:使用expect附带的mkpasswd命令生成随机数。
[laoma@shell ~]$ mkpasswd -l20-d4-c4-C4-s4-m6]Ai+A2wd^zxPXe6s1选项说明:
- -l,控制密码长度。
- -d,控制数字字母最小数量。
- -c,控制小写字母最小数量。
- -C,控制大写字母最小数量。
- -s,控制特殊符号最小数量。
方法7:使用mktemp命令和sha1sum生成随机数。
[laoma@shell ~]$ mktemp -u /tmp/tmp.0d3pi70J8a[laoma@shell ~]$ mktemp -u|sha1sum 9505b8634ad25c9db571a4beb62d49fc6484e06c -为了让随机数统一,可以统一使用md5sum或者sha1sum等校验命令处理。
6 select 循环语句介绍及语法
select循环语句的主要作用可能就是创建菜单。
在执行带select循环语句的脚本时,输出会按照数字顺序的列表显示一个菜单项,并显示提示符(默认是#?),同时等待用户输入数字进行选择。
下面就来带大家看看生成菜单项的语法及具体案例实践。
第一种for循环语句为变量取值型,语法结构如下:
select变量名[in菜单取值列表]do指令...done此结构中“in 变量取值列表”可省略,省略时相当于使用in "$@",使用for i就相当于使用for i in "$@"。
在这种select循环语句的语法中,select关键字后面会有一个“变量名”:
- 每次执行时,变量名从in关键字后面的变量取值列表中(以空格分隔)取一个,然后进人循环(do和done之间),执行循环内的所有指令,当执行到done时结束返回。
- select循环执行后会出现菜单项等待用户选择(不会自动循环所有变量列表),而用户输人的只能是菜单项前面的数字序号,每输入一次对应的序号就会执行一次循环。
- 之后“变量名”再继续取变量列表中取一个值,继续执行循环内的所有指令(do和done之间的指令),当执行到done时结束返回。
- 以此类推。
- select是一个没有终止的循环,除非选择某个值时执行了退出循环指令,才会退出select循环;否则select需要会一直执行下去。
- select如何遍历列表,完全取决于用户的选择,而for、while、until等是按顺序遍历列表。
select循环结构执行流程对应的逻辑图如下:
7 select 循环语句案例
示例1:打印课程清单
[laoma@shell ~]$vimselect1.sh#!/bin/bashselectcourseinmysql python linuxdoecho$coursedone[laoma@shell ~]$bashselect1.sh1)mysql2)python3)linux#? 1mysql#? 2python#? 1mysql#? 1mysql#? 3linux#? ^C# 按ctrl+c退出。用while和case实现上面的select语句
#!/bin/bashfunctionmenu(){echo-n'1) mysql 2) python 3) linux #? '}menureadchoicewhiletruedocase$choicein1)echomysqlread-p'#? 'choice;;2)echopythonread-p'#? 'choice;;3)echolinuxread-p'#? 'choice;;'')menureadchoice;;*)echoread-p'#? 'choice;;esacdone示例2:更改提示符,并配合case和exit使用
环境变量:
- PS3,是select的选择提示符。
- REPLY,是select选择的对应序号。
[laoma@shell ~]$catselect2.sh#!/bin/bashPS3="选择你的课程: "selectcourseinlinux mysql pythonexitdoecho"你选择了第$REPLY个条目。"case$courseinlinux)echolinux xxx;;mysql)echomysql yyy;;python)echopython zzz;;exit)exit;;esacechodone# 执行结果如下[laoma@shell ~]$bashselect2.sh1)linux2)mysql3)python4)exit选择你的课程:1你选择了第1个条目。 linux xxx 选择你的课程:2你选择了第2个条目。 mysql yyy 选择你的课程:1你选择了第1个条目。 linux xxx 选择你的课程:4你选择了第4个条目。示例3:两个数计算器
[laoma@shell ~]$vimselect3.sh#! /bin/bashnum1=10num2=20echoThere are two numbers$num2and$num1。selectmethodin加法 减法 乘法 退出docase$methodin加法)echo$[num1 + num2];;减法)echo$[num2 - num1];;乘法)echo$[num1 * num2];;退出)exit;;*)echo从1-4中选择;;esacdone# 执行效果[laoma@shell ~]$bashselect3.sh There are two numbers20and10。1)加法2)减法3)乘法4)退出#? 130#? 210#? 3200#? 4示例4:一键安装mysql和httpd
[laoma@shell ~]$viminstall_httpd_or_mysql.sh#! /bin/bashfunctionprint(){if["$1"=="PASS"];thenecho-e'\033[1;32mPASS\033[0;39m'elif["$1"=="FAIL"];thenecho-e'\033[1;31mFAIL\033[0;39m'elif["$1"=="DONE"];thenecho-e'\033[1;35mDONE\033[0;39m'elseecho"Usage: print PASS|FAIL|DONE"fi}functionInstallService(){case$1inhttpd)echo-n"Start installing httpd..."{yuminstall-y httpd systemctlenablehttpd --nowechoHello World>/var/www/html/index.html}&>/dev/null[$?-eq0]&&print DONE||print FAIL;;mysql)echo-n"Start installing mysql..."{yuminstall-y mariadb-server systemctlenablemariadb --now}&>/dev/null[$?-eq0]&&print DONE||print FAIL;;esac}selectappin"Install httpd""Install mysql""Exit"docase$REPLYin1)InstallService httpd;;2)InstallService mysql;;3)exit;;*)echo从1-3中选择。;;esacdone# 执行验证[laoma@shell ~]$sudobashinstall_httpd_or_mysql.sh1)Install httpd2)Install mysql3)Exit#? 1Start installing httpd...DONE#? 2Start installing mysql...DONE#? 3[laoma@shell ~]$curlhttp://localhost/ Hello World[laoma@shell ~]$sudomysql Welcome to the MariaDB monitor. Commands end with;or\g. Your MariaDB connectionidis2Server version:5.5.68-MariaDB MariaDB Server Copyright(c)2000,2018, Oracle, MariaDB Corporation Ab and others. Type'help;'or'\h'forhelp. Type'\c'toclearthe current input statement. MariaDB[(none)]>quit Bye