理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货
文章目录
前言
单引号表示纯符号 用双引号表字符串
- case多分支语句
- 循环语句
- for循环语句
- while循环语句
- until循环语句
- shell函数
- shell数组
一 : case语句的结构
1.1 case结构
-
多分支表现形式:if语句,case语句
-
case 语句可以使用正则表达式,正则表达式后面会去阐述
-
针对变量的不同取值,分别执行不同的命令程序
case 中;;表示一句话的结束
如果匹配某一个固定值,大多数用caes,其适用于某一个固定值
如果匹配某一个区间范围,大多数用if else 语句,其适用于一个范围
*后面 不需要加;;
1.2 case执行过程流程图
-
case针对变量的不同取值,分别执行不同的命令序列
-
case变量匹配的是模式,if变量匹配的是条件
1.3 case语句应用示例
1.3.1 示例1:击键类型识别
- 提示用户输入一个字符
- 判断出该字符是字母、数字或者其他字符
#/bin/bash
read -p "请按个键,我可以测试年的键是字母数字或是其他字符" jian
case "$jian" in
[0-9])
echo "你按的是数字"
;;
[a-z]|[A-Z])
echo "你按的是字母"
;;
*)
echo "你按的是特殊字符"
esac
[aaa@qq.com opt]# sh shibiejijian.sh
请按个键,我可以测试年的键是字母数字或是其他字符8
你按的是数字
[aaa@qq.com opt]# sh shibiejijian.sh
请按个键,我可以测试年的键是字母数字或是其他字符a
你按的是字母
[aaa@qq.com opt]# sh shibiejijian.sh
请按个键,我可以测试年的键是字母数字或是其他字符A
你按的是字母
[aaa@qq.com opt]# sh shibiejijian.sh
请按个键,我可以测试年的键是字母数字或是其他字符@
你按的是特殊字符
1.3.2 请输入您的成绩判断优良合格不合格
#!/bin/bash
read -p "请输入您的成绩" cj
case "$cj" in
[0-9]|[1-5][0-9])
echo "成绩不合格"
;;
7[0-4]|6[0-9])
echo "成绩合格"
;;
7[5-9]|8[0-4])
echo "成绩良好"
;;
8[5-9]|9[0-9]|100)
echo "成绩优秀"
;;
*)
echo "你输入的成绩有误"
esac
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩-1
你输入的成绩有误
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩0
成绩不合格
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩9
成绩不合格
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩10
成绩不合格
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩59
成绩不合格
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩60
成绩合格
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩74
成绩合格
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩75
成绩良好
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩7^H84
你输入的成绩有误
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩84
成绩良好
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩85
成绩优秀
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩99
成绩优秀
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩100
成绩优秀
[aaa@qq.com opt]# sh chengjicase.sh
请输入您的成绩101
你输入的成绩有误
[aaa@qq.com opt]#
1.3.3 示例2:编写系统服务脚本
- 使用start、stop、restart等参数来控制服务
- 服务控制指令通过位置变量 $1 传入
二 : for语句的循环结构
2.1 for语句概述
- 读取不同的变量值,用来逐个执行同一组命令
控制循环的中断
取值列表是一个集合;
自上而下进行依次读取赋值执行命令的操作叫做遍历,
for可以视为在超市进行购物车结算的扫码枪
2.2 for语句流程图
2.3 for语句应用实例
2.3.1 示例1——批量添加用户
- 用户名存放在users.txt文件中,每行一个
- 初始密码设为123456
- 验证脚本
#!/bin/bash
for ((i=1;i<=4;i++))
do
useradd "admin$i" &> /dev/null
echo "123456" | passwd --stdin "admin$i" &> /dev/null
echo "用户admin$i创建成功"
done
~
[aaa@qq.com opt]# sh users.sh
用户admin1创建成功
用户admin2创建成功
用户admin3创建成功
用户admin4创建成功
2.3.2 示例2——使用根据IP地址检查主机状态
- IP地址存放在ipadds.txt文件中,每行一个
- 使用ping命令检测各主机的连通性
[aaa@qq.com opt]# vim addr.sh
#!/bin/bash
List=$(cat /opt/ipadds.txt)
for ((i=0;i<=256;i++))
do
ping -c 3 -i 0.2 -W 1 192.168.10.$i &> /dev/null
if [ $? = 0 ]
then
echo "192.168.10.$i is up"
else
echo "192.168.10.$i is down"
fi
done
2.3.3 将1-10从上往下排列
#!/bin/bash
for ((i=1;i<=10;i++))
do
echo "$i"
done
for的双分号不能拆掉
2.3.4: 1-100的偶数和
sum=0
for ((i=0;i<=100;i+2))
do
let sum+=$i
done
echo "$sum"
i+=2 代表i=i+2
continue 跳过自己部分的语句,重新循环
let 命令 ,重新赋值的意思,相当于在sum的基础上,再加一个数
break 看到break后,直接退出循环
$RANDOM是随机值
用其取余可以固定随机数的范围
2.3.5 猜价格
- 方法一
#!/bin/bash
echo "话不多说,过来猜价格"
b=`expr $RANDOM % 1000`
n=0
read -p "输入你心中的数,猜猜今天的优惠商品的价格(0-999)?" a
while [ $a -ne $b ]
do
if [ $a -gt $b ]
then
echo "你把它想得太贵了"
read -p "输入你心中的数,猜猜今天的优惠商品的价格(0-999)?" a
let n++
else
echo "你太低估它的价格了"
let n++
read -p "输入你心中的数,猜猜今天的优惠商品的价格(0-999)?" a
fi
done
let n++
echo "恭喜你猜对了,他的价格是$b,你一共猜了$n次可惜你没钱买"
exit 0
- 方法二
#!/bin/bash
n=0
echo "这是一个猜价格的游戏,价格在1~1000的范围内."
jiage=$(expr $RANDOM % 1000)
while true
do
read -p "请输入你猜的价格:" cai
if [ $cai -eq $jiage ]
then
let n++
echo "恭喜你猜对了!它的价格是:$jiage.你一共猜了$n次."
exit 0
elif [ $cai -gt $jiage ]
then
let n++
echo "你猜的价格高了,猜低一点."
elif [ $cai -lt $jiage ]
then
let n++
echo "你猜的价格低了,猜高一点."
fi
done
2.3.6 九九乘法表
- 方法一
#!/bin/baash
for ((i=1;i<=9;i++))
do
for ((a=1;a<=i;a++))
do
echo -n "$i x $a=$(expr $i \* $a) "
if [ $a -eq $i ]
then
echo -e '\n'
fi
done
done
- 方法二
echo 的help帮助
NAME(名称)
echo - 显示一行文本
SYNOPSIS(总览)
echo[OPTION]... [STRING]...
DESCRIPTION(描述)
允许在标准输出上显示STRING(s).
-n 不输出行尾的换行符.
-e 允许对下面列出的加反斜线转义的字符进行解释.
-E 禁止对在STRINGs中的那些序列进行解释.
--help 显示帮助并退出(须单独运行)
--version 输出版本信息并退出(须单独运行)
在没有 -E 的情况下,可承认并可以内置替换以下序列:
\NNN 字符的ASCII代码为NNN(八进制)
\\ 反斜线
\a 报警符(BEL)
\b 退格符
\c 禁止尾随的换行符
\f 换页符
\n 换行符
\r 回车符
\t 水平制表符
\v 纵向制表符
- 菱形的九九乘法表
#!/bin/bash
for ((i=1;i<=17;i++))
do
if [ $i -le 9 ];then
k=$(expr 45 - $(expr $i \* 5))
until [ $k -eq 0 ]
do
echo -n " "
let k-=5
done
for ((j=1;j<=i;j++))
do
echo -n "$i*$j=$(expr $i \* $j) "
if [ $i -eq $j ]
then
echo -e '\n'
fi
done
else
xi=$(expr 18 - $i)
xk=$(expr 45 - $(expr $xi \* 5))
until [ $xk -eq 0 ]
do
echo -n " "
let xk-=5
done
for ((xj=1;xj<=xi;xj++))
do
echo -n "$xi*$xj=$(expr $xi \* $xj) "
if [ $xj -eq $xi ]
then
echo -e '\n'
fi
done
fi
done
三 : while语句的结构
3.1 while语句概述
- 重复测试某个条件,只要条件成立则反复执行
3.2 while 语句应用示例
3.2.1 逛商业街
- 方法一
#!/bin/bash:
echo "欢迎来到商业街,走一走逛一逛"
qian=0
a=1.电脑城
b=2.服装店
c=3.馒头店
d=4.泳装店
goumai=你购买了
while true
do
echo "1.电脑城"
echo "2.服装店"
echo "3.馒头店"
echo "4.泳装店"
read -p "商业街上有电脑城、服装店、馒头店、泳装店,你想去哪一个瞅瞅?(输入序号)" nub
case $nub in
1)
echo “===========欢迎进入电脑城==========================”
echo "1.手机800元"
echo "2.电脑1200元"
echo "3.充电器线15元"
echo "4.键盘100元"
read -p "有以上商品供你选购---有你想买的东西吗?(yes/no)" yesno
while true
do
if [ $yesno = yes ]
then
read -p "输入你想买的商品序号" xuhao
case $xuhao in
1)
echo "你购买了价值800元的手机"
let qian=800+$qian
goumai=$goumai手机、
;;
2)
echo "你购买了价值1200元的电脑"
qian=`expr $qian + 1200`
goumai=$goumai手机、
;;
3)
echo "你购买了价值15元的充电线"
qian=`expr $qian + 15`
goumai=$goumai手机、
;;
4)
echo "你购买了价值100元的键盘"
qian=`expr $qian + 100`
goumai=$goumai手机、
;;
*)
echo "店里没有你想要的东西"
break
esac
else
echo "没有想买的那我们就走"
break
fi
done
;;
2)
echo “===========欢迎进入服装店==========================”
echo "1.鞋子120元"
echo "2.裤子85元"
echo "3.帽子15元"
echo "4.皮带320元"
read -p "有以上商品供你选购---有你想买的东西吗?(yes/no)" yesno
while true
do
if [ $yesno = yes ]
then
read -p "输入你想买的商品序号" xuhao
case $xuhao in
1)
echo "你购买了价值120元的鞋子"
let qian=120+$qian
goumai=$goumai鞋子、
;;
2)
echo "你购买了价值85元的裤子"
qian=`expr $qian + 85`
goumai=$goumai裤子、
;;
3)
echo "你购买了价值15元的帽子"
qian=`expr $qian + 15`
goumai=$goumai帽子、
;;
4)
echo "你购买了价值320元的皮带"
qian=`expr $qian + 320`
goumai=$goumai皮带、
;;
*)
echo "店里没有你想要的东西"
break
esac
else
echo "没有想买的那我们就走"
break
fi
done
;;
3)
echo “===========欢迎进入馒头店==========================”
echo "1.山东杂粮大煎饼15元"
echo "2.青岛大龙虾馅儿包子15元"
echo "3.简单的白馒头1元"
echo "4.不简单的白馒头1000元"
read -p "有以上商品供你选购---有你想买的东西吗?(yes/no)" yesno
while true
do
if [ $yesno = yes ]
then
read -p "输入你想买的商品序号" xuhao
case $xuhao in
1)
echo "你购买了价值15元的山东杂粮大煎饼"
let qian=15+$qian
goumai=$goumai山东杂粮大煎饼、
;;
2)
echo "你购买了价值15元的青岛大龙虾馅儿包子"
qian=`expr $qian + 15`
goumai=$goumai青岛大龙虾包子、
;;
3)
echo "你购买了一个简单的白馒头"
qian=`expr $qian + 1`
goumai=$goumai白馒头、
;;
4)
echo "你购买了不简单的白馒头,获取了老板娘的芳心"
qian=`expr $qian + 1000`
goumai=$goumai老板娘的芳心、
;;
*)
echo "店里没有你想要的东西"
break
esac
else
echo "没有想买的那我们就走"
break
fi
done
;;
4)
echo “===========欢迎进入泳装店==========================”
echo "1.泳帽10元"
echo "2.泳衣15元"
echo "3.泳镜12元"
echo "4.比基尼32元"
read -p "有以上商品供你选购---有你想买的东西吗?(yes/no)" yesno
while true
do
if [ $yesno = yes ]
then
read -p "输入你想买的商品序号" xuhao
case $xuhao in
1)
echo "你购买了价值10元的泳帽"
let qian=10+$qian
goumai=$goumai泳帽、
;;
2)
echo "你购买了价值15元的泳衣"
qian=`expr $qian + 15`
goumai=$goumai泳衣、
;;
3)
echo "你购买了价值12元的泳镜"
qian=`expr $qian + 12`
goumai=$goumai泳镜、
;;
4)
echo "你购买了价值32元的比基尼"
qian=`expr $qian + 32`
goumai=$goumai比基尼、
;;
*)
echo "店里没有你想要的东西"
break
esac
else
echo "没有想买的那我们就走"
break
fi
done
;;
*)
echo "输入错误,不带你逛街了"
echo "你这次逛街花了$qian元,$goumai"
exit 1
esac
done
- 方法二
#!/bin/bash
2 qian=0
3 n=0
4 echo "======欢迎来到来了一定让你掏钱的商业街==============="
5
6 for ((i=1;i<=4;i++));do
7 echo "===========来到第$i家店============="
8 read -p "小帅哥,来玩啊?--是否进店(yes/no)" yesno
9 case $yesno in
10 yes)
11 echo "你不会后悔的,看看商品吧"
12 echo "1.女主播穿过的丝袜300元"
13 echo "2.买了就后悔的瓶子900元"
14 echo "3.会动的可充电扭蛋150元"
15 read -p "你想买哪个呢,一个一个按序号买哦" xuhao
16 case $xuhao in
17 1)
18 echo "你选择了女主播的袜子,花了300元"
19 let qian+=300
20 let n++
21 ;;
22 2)
23 echo "你选择了买了就后悔的瓶子,里面空无一物,白花了900元"
24 let qian+=900
25 let n++
26 ;;
27 3)
28 echo "你选择了会动的可充电扭蛋,送给女主播会有惊喜哦"
29 let qian+=150
30 let n++
31 ;;
32 *)
33 echo "小伙子,店里的东西还不齐全,再看看吧"
34 esac
35 while true
36 do
37 read -p "是否继续看看(yes/no)" yesn
38 if [ $yesn = yes ];then
39 echo "哟吼吼,小伙子挺有钱嘛"
40 echo "你不会后悔的,看看商品吧"
41 echo "1.女主播穿过的丝袜300元"
42 echo "2.买了就后悔的瓶子900元"
43 echo "3.会动的可充电扭蛋150元"
44 read -p "这次又要买什么呢(请输入序号)" xuh
45 case $xuh in
46 1)
47 echo "你选择了女主播的袜子,花了300元"
48 let qian+=300
49 let n++
50 ;;
51 2)
52 echo "你选择了买了就后悔的瓶子,里面空无一物,白花了900元"
53 let qian+=900
54 let n++
55 ;;
56 3)
57 echo "你选择了会动的可充电扭蛋,送给女主播会有惊喜哦"
58 let qian+=150
59 let n++
60 ;;
61 *)
62 echo "小伙子,店里的东西还不齐全,再看看吧"
63 esac
64 else
65 break
66 fi
67 done
68 ;;
69 no)
70 echo "可惜了,欢迎再次光临吧"
71 ;;
72 *)
73 echo "小家伙,你很皮哦,你不进来我还不让你进呢"
74 esac
75 done
76 echo "=======购物结束,看看自己被宰了多少钱======="
77 echo "你花了$qian元,买了$n个物品"
while true 代表死循环 ,需要在其中加入一个if语句,if语句内含break,用来退出循环
3.2.2 猜猜谁最幸运
- 方法一
#!/bin.bash
n=0
c=0
b=0
for ((i=1;i<=10;i++))
do
shuzi=`expr $(expr $RANDOM % 2) + 1`
xingming=`cat /opt/jbxx/mingdan.txt | grep $shuzi | awk -F: '{print $2}'`
# cat 人员名单
case "$shuzi" in
1)
let n++
;;
2)
let c++
;;
*)
let b++
esac
echo "$xingming"
done
echo "zhangsan $n次、 lisi $c 次、 wangwu $b 次"
- 方法二
- 方法三
3.2.3 批量添加用户
- 用户名称以stu开头,按数字顺序进行编号
- 一共添加20个用户,即stu1、stu2、stu3·······、stu20
- 初始密码设为123456
#!/bin/bash
i=1
until [ $i -gt 20 ];do
useradd stu$i
#echo "123456" | passwd --stdin stu$i &> /dev/null
let i++
echo "用户stu$i创建成功"
done
===========================================================
#!/bin/bash
i=1
while [ $i -le 20 ];do
userdel -r stu$i
#echo "123456" | passwd --stdin stu$i
let i++
echo "用户stu$i删除成功"
done
3.2.4 猜商品价格游戏
- 通过变量RANDOM获得随机数
- 提示用户猜测并记录次数,猜中后退出循环
#!/bin/bash
n=1
jiage=$[RANDOM%1000+1]
read -p "请输入你心中的价格:" cai
while [ $cai != $jiage ];do
if [ $cai -gt $jiage ];then
echo "你输入的价格高了"
let n++
read -p "请输入你心中的价格:" cai
else
echo "价格低了"
let n++
read -p "请输入你心中的价格:" cai
fi
done
echo "恭喜你猜中了,该商品的价格是$jiage,你一共猜了$n次"
exit 0
四 : until 语句
4.1 until语句的结构
4.2 until 语句应用实例
4.2.1计算1-50的和值
- 通过循环累加的方式计算1-50的和值
#!/bin/bash
num=0
n=1
until [ $n -gt 50 ];do
let sum+=$n
let n++
done
echo "$sum"
4.2.2为指定用户发送在线消息
-
若用户不在线(未登录系统),则每10分钟试一次,直至用户登录系统后再发送信息
-
用户名与消息通过位置参数传递给脚本
-
方法一
#!/bin/bash #判断是否输入参数 if [ $# = 0 ];then echo "请输入用户名" exit 1 fi #判断用户是否存在 if grep "^$1" /etc/passwd &> /dev/null;then : else echo "用户不存在" exit 2 fi #判断用户是否在线 until who | grep "$1" &> /dev/null;do echo "用户不在线" sleep 3 done #给用户发消息 echo "$*" | write "$1"
-
方法二
不可以then 和else 中为空
五 : shell函数
- 将命令序列按格式写在一起
- 可方便重复使用命令序列
- shell函数定义
- 调用函数的方法
- 函数名 [参数1] [参数2]
- 参数1就是位置参数$1,参数2就是位置参数$2
5.1 函数格式
封装函数返回值
返回值分两种,return 状态 ————调用使用$?
echo 值 ————调用使用赋予变量
状态用$?调,值用变量调
传参数用位置变量传进去
5.2 示例
5.2.1两个数字求和
- 通过sum (){}定义函数
- 使用read命令交互输入两个数并求和
#!/bin/bash
function qiuehe(){
sum=`expr $1 + 10`
#echo "$sum"
return $sum
echo "$?"
}
qiuehe $1
~
5.2.2 编写登录系统后便可使用的用户自定义函数,执行命令servicectl httpd start
-
编辑用户自定义函数文件/root/function
-
在当前shell中加载可执行的函数文件/root/function
-
在~/.bash文件中添加source /root/function命令
-
systemctl start httpd
-
service httpd start
新建一个service httpd start 命令
思路:
1.验证语法格式
2.验证版本类型、验证linux版本,只有centos7,才能使用servicectl命令
查看版本类型 cat /etc/centos-release
3.执行命令servicectl httpd start
- 方法一
#!/bin/bash
function servicectl (){
#判断格式是否正确
if [ $# -lt 2 ];then
echo "用法错误,格式为:servicectl <服务名> <选项>"
exit 1
fi
#判断系统版本是否为centos7版本
if [ $(cat /etc/centos-release |awk '{print $4}' | awk -F. '{print $1}') -ge 7 ];then
echo "符合版本centos7及以上要求,可以使用servicectl 命令"
service $1 $2
else
echo "你版本太低无法使用!"
fi
}
- 方法二
#!/bin/bash
#这是系统启动后用户可以使用的一个自定义函数
#功能:开机启动服务
#判断使用脚本格式是否正确,即参数个数判断
function format(){
echo $#
if [ $# -ne 2 ]
then
echo "你输入的参数格式不正确,UsageMethod:serve <cmd> <serve> "
exit 1
fi
}
#判断使用的Linux版本是否是Centos7版本
function version(){
echo "hello"
num=$(cat /etc/centos-release |awk '{print $4}' |awk -F. '{print $1}')
if [ $num -eq 7 ]
then
echo "您的系统版本是centos的7版本且准备执行服务启动脚本,请稍后"
fi
}
#服务启动
function serve(){
format $1 $2
version
case $2 in
start)
systemctl start httpd
;;
stop)
systemctl stop httpd
;;
*)
echo "nothing need to do"
esac
}
六 : shell数组
6.1 应用场景
组有利于存放相同类型的数据,这句话也适用于java
数组内可以存放数据,数据类型有
1.整型 init 1 2 3 100
2.长整型 long
3.浮点型 单精度 float 4字节,带小数点就是浮点型
4.string 字符串:char 字符 英文字母字符 a 占一个字节;中文汉字字符,男 占两个字节而在java中,所有字符都占两个字节
5.boolean 布尔值 ture 和false
6.date 日期
7.html 标记语言 以标签形式存在
下标或者索引用来去找数组内的数据
- 获取数组长度
索引是从0开始,
数组有长度,下面的例子就是4——数组长度
(纯手打,见谅)
- 获取元素长度
数组最忌讳越界,越界取决于你的数组长度——abc[4],这样就是越界了
索引下标一定是0开始
- 遍历元素
遍历元素:循环
- 元素切片
- 元素替换
- 元素删除
- ·······
6.2 数组定义方法
- 数据与数据之间用空格隔开,即数组元素之间使用空格隔开
6.2.1 方法一
数组名 = (value0 value1 value2…)
abc = (10 20 30 )
最简单的方式,动态输入,也叫可变长数组
6.2.2 方法二
数组名 = ([0] = value [1] = value [2] = value…)
abc = ([0] = 10 [1] = 20 [2] = 30 …)
6.2.3 方法三
列表名 = ”value0 value1 value2 …“
数组名 = ($列表名)
给数组名赋予列表名,列表名里有数据
6.2.4 方法四
数组名[0]=“value” abc[0] = 10
数组名[1]=“value” abc[1] = 20
数组名[2]=“value” abc[2] = 30
…
这种方法不建议使用
6.3 数组包括的数据类型
- 数值类型
- 字符类型
- 使用”或“定义
不可以放入对象
shell当中没有二维数组
6.4 shell数组操作
- 获取数组长度————${数组名[@/*]}
- @或*,可以理解为通配符号,类似于$ *,可以查看数组内的所有数据 {abc[@]}
- 读取某下标赋值————${数组名[下标]}
- ${abc[2]}
- 数组遍历
- KaTeX parse error: Expected '}', got '#' at position 2: {#̲abc[*]},即在获取数组长…{#abc[ * ]} 该数组的数据个数,类似于$#
- 即:${abc[*]}加#号是统计数字;不加#号,是把数组内的所有位置全部显示出来
数组遍历示例
6.4.1 比大小
max=0
for ((i=1;i<=5;i++))
do
read -p "请输入第$i个数字" num
a=i-1
abc[a]=$num
if [ ${abc[a]} -gt $max ]
then
max=${abc[a]}
fi
done
echo ${abc[*]}
echo "最大值为 $max"
6.4.2 给数组排序、插数后再排序
#/bin/bash
2 for ((i=1;i<=5;i++))
3 do
4 read -p "请输入第$i个数字" num
5 a=$i-1
6 c=$a-1
7 abc[a]=$num
8 done
9 #降序
10 b=0
11 for ((j=0;j<=c;j++))
12 do
13 for ((i=0;i<=c;i++))
14 do
15 ii=`expr $i + 1`
16 if [ ${abc[$i]} -le ${abc[$ii]} ]
17 then
18 b=${abc[$i]}
19 abc[$i]=${abc[$ii]}
20 abc[$ii]=$b
21 fi
22 done
23 done
24 echo ${abc[*]}
#升序
25 mb=0
26 for ((j=0;j<=c;j++))
27 do
28 for ((i=0;i<=c;i++))
29 do
30 ii=`expr $i + 1`
31 if [ ${abc[$i]} -ge ${abc[$ii]} ]
32 then
33 mb=${abc[$i]}
34 abc[$i]=${abc[$ii]}
35 abc[$ii]=$mb
36 fi
37 done
38 done
39 echo ${abc[*]}
40 read -p "输入你想插的数" xnum
41 i=$a+1
42 abc[i]=$xnum
43
44 for ((f=0;f<=i;f++))
45 do
46 for ((g=0;g<=a;g++))
47 do
48 gg=$(expr $g + 1)
49 if [ ${abc[$g]} -le ${abc[$gg]} ]
50 then
51 b=${abc[$g]}
52 abc[$g]=${abc[$gg]}
53 abc[$gg]=$b
54 fi
55 done
56 done
57 echo ${abc[*]}
拓展
1.求ax^2+bx+c=0的解,a、b、c为手动输入
- 平方根示例
#!/bin/bash
a=9
b=$(awk -v x=$a 'BEGIN{print sqrt(x)}')
echo $b
b=$(echo "$a" | awk '{print sqrt($1)}')
echo $b
b=$(echo | awk "{print sqrt($a)}")
echo $b
b=$(bc <<< "scale=6; sqrt($a)") #scale=6,表示结果保留6位小数
echo $b
b=$(echo "scale=6; sqrt($a)" | bc)
echo $b
b=`"sqrt($a)"`
echo $b
- 方法
#!bin/bash
echo "求二元一次方程解ax^2 + bx + c = 0"
read -p "请输入a:" a
read -p "请输入b:" b
read -p "请输入c:" c
echo "你输入的方程为"$a"x^2 + "$b"x + $c = 0"
if [ $a -eq 0 ]
then
if [ $b -eq 0 ]&&[ $c -ne 0 ]
then
echo "你输入的格式有误,a、b、c不能同时等于0,否则x等于任何数"
else
x=`expr $c / $b`
echo "该方程只有一个解,即x=-$x"
fi
else [ $a -ne 0 ]
era=`expr $a \* 2`
b2=`expr $b \* $b`
ac=`expr $a \* $c`
siac=`expr 4 \* $ac`
gx=`expr $b2 - $siac`
if [ $gx -lt 0 ];then echo "无解" && exit 1
fi
gxj=$(bc <<< "sqrt($gx)")
q=`expr 0 - $b`
fs1=`expr $q + $gxj`
fs2=`expr $q - $gxj`
j1=`expr $fs1 / $era`
j2=`expr $fs2 / $era`
echo "x1 = $j1 ;x2 = $j2"
fi
#!/bin/bash
echo please input the number a
read a
echo please input the number b
read b
echo please input the number c
read c
(( d = b*b - 4*a*c))
if [ $a -eq 0 ]
then
(( x = - c/b))
echo the number of x is: $x
elif [ $d -gt 0 ]
then
(( x= a*x*x + b*x +c))
echo the number of x is: $x
else
echo x has no answer
fi
2.购物中心做活动,购买食物满500元打8折,购买日用满300元打9折,购买衣服满1000打7折,每类商品都有三种(分别起名字)
需求:程序运行后可以任意选择商品类别,进入商品类别后可以选择不购买或购买哪一个商品,退出某类别后还可以进入该类别进行购买
3.输入星期几的英文单词来判断星期几
#!/bin/bash
echo "请输入星期的英文单词"
read w
case $w in
Monday)
echo "星期一"
;;
Tuesday)
echo "星期二"
;;
Wednesday)
echo "星期三"
;;
Thursday)
echo "星期四"
;;
Friday)
echo "星期五"
;;
Saturday)
echo "星期六"
;;
Sunday)
echo "星期日"
;;
*)
echo "输入错误"
esac
4.将按顺序输入的5个字符以相反的顺序打印出来
#!/bin/bash
echo "请输入五个字符,以空格隔开"
read a b c d e
echo "$e $d $c $b $a"
5.一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
#!/bin/bash
read -p "请输入一个五位数字" num
w=$(expr $num / 10000)
q=$(expr $num / 1000)
until [ $q -lt 10 ]
do
let q-=10
done
b=$(expr $num / 100)
until [ $b -lt 10 ]
do
let b-=10
done
s=$(expr $num / 10)
until [ $s -lt 10 ]
do
let s-=10
done
g=$num
until [ $g -lt 10 ]
do
let g-=10
done
if [ $w -eq $g ]&&[ $q -eq $s ]
then
echo "$num这个数是一个回文数"
else
echo "$num这个数不是回文数"
fi