理论+实操: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 [ opt]# sh shibiejijian.sh 请按个键,我可以测试年的键是字母数字或是其他字符8 你按的是数字 [ opt]# sh shibiejijian.sh 请按个键,我可以测试年的键是字母数字或是其他字符a 你按的是字母 [ opt]# sh shibiejijian.sh 请按个键,我可以测试年的键是字母数字或是其他字符A 你按的是字母 [ 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 [ opt]# sh chengjicase.sh 请输入您的成绩-1 你输入的成绩有误 [ opt]# sh chengjicase.sh 请输入您的成绩0 成绩不合格 [ opt]# sh chengjicase.sh 请输入您的成绩9 成绩不合格 [ opt]# sh chengjicase.sh 请输入您的成绩10 成绩不合格 [ opt]# sh chengjicase.sh 请输入您的成绩59 成绩不合格 [ opt]# sh chengjicase.sh 请输入您的成绩60 成绩合格 [ opt]# sh chengjicase.sh 请输入您的成绩74 成绩合格 [ opt]# sh chengjicase.sh 请输入您的成绩75 成绩良好 [ opt]# sh chengjicase.sh 请输入您的成绩7^H84 你输入的成绩有误 [ opt]# sh chengjicase.sh 请输入您的成绩84 成绩良好 [ opt]# sh chengjicase.sh 请输入您的成绩85 成绩优秀 [ opt]# sh chengjicase.sh 请输入您的成绩99 成绩优秀 [ opt]# sh chengjicase.sh 请输入您的成绩100 成绩优秀 [ opt]# sh chengjicase.sh 请输入您的成绩101 你输入的成绩有误 [ 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 ~ [ opt]# sh users.sh 用户admin1创建成功 用户admin2创建成功 用户admin3创建成功 用户admin4创建成功
2.3.2 示例2——使用根据IP地址检查主机状态
- IP地址存放在ipadds.txt文件中,每行一个
- 使用ping命令检测各主机的连通性
[ 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 qian=0 n=0 echo "======欢迎来到来了一定让你掏钱的商业街===============" for ((i=1;i<=4;i++));do echo "===========来到第$i家店=============" read -p "小帅哥,来玩啊?--是否进店(yes/no)" yesno case $yesno in yes) echo "你不会后悔的,看看商品吧" echo "1.女主播穿过的丝袜300元" echo "2.买了就后悔的瓶子900元" echo "3.会动的可充电扭蛋150元" read -p "你想买哪个呢,一个一个按序号买哦" xuhao case $xuhao in 1) echo "你选择了女主播的袜子,花了300元" let qian+=300 let n++ ;; 2) echo "你选择了买了就后悔的瓶子,里面空无一物,白花了900元" let qian+=900 let n++ ;; 3) echo "你选择了会动的可充电扭蛋,送给女主播会有惊喜哦" let qian+=150 let n++ ;; *) echo "小伙子,店里的东西还不齐全,再看看吧" esac while true do read -p "是否继续看看(yes/no)" yesn if [ $yesn = yes ];then echo "哟吼吼,小伙子挺有钱嘛" echo "你不会后悔的,看看商品吧" echo "1.女主播穿过的丝袜300元" echo "2.买了就后悔的瓶子900元" echo "3.会动的可充电扭蛋150元" read -p "这次又要买什么呢(请输入序号)" xuh case $xuh in 1) echo "你选择了女主播的袜子,花了300元" let qian+=300 let n++ ;; 2) echo "你选择了买了就后悔的瓶子,里面空无一物,白花了900元" let qian+=900 let n++ ;; 3) echo "你选择了会动的可充电扭蛋,送给女主播会有惊喜哦" let qian+=150 let n++ ;; *) echo "小伙子,店里的东西还不齐全,再看看吧" esac else break fi done ;; no) echo "可惜了,欢迎再次光临吧" ;; *) echo "小家伙,你很皮哦,你不进来我还不让你进呢" esac done echo "=======购物结束,看看自己被宰了多少钱=======" 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[@]}
- 读取某下标赋值————${数组名[下标]}
- ${abc[2]}
- 数组遍历
- ${#abc[]},即在获取数组长度的基础上,在数组名加#,echo查看${#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 for ((i=1;i<=5;i++)) do read -p "请输入第$i个数字" num a=$i-1 c=$a-1 abc[a]=$num done #降序 b=0 for ((j=0;j<=c;j++)) do for ((i=0;i<=c;i++)) do ii=`expr $i + 1` if [ ${abc[$i]} -le ${abc[$ii]} ] then b=${abc[$i]} abc[$i]=${abc[$ii]} abc[$ii]=$b fi done done echo ${abc[*]} #升序 mb=0 for ((j=0;j<=c;j++)) do for ((i=0;i<=c;i++)) do ii=`expr $i + 1` if [ ${abc[$i]} -ge ${abc[$ii]} ] then mb=${abc[$i]} abc[$i]=${abc[$ii]} abc[$ii]=$mb fi done done echo ${abc[*]} read -p "输入你想插的数" xnum i=$a+1 abc[i]=$xnum for ((f=0;f<=i;f++)) do for ((g=0;g<=a;g++)) do gg=$(expr $g + 1) if [ ${abc[$g]} -le ${abc[$gg]} ] then b=${abc[$g]} abc[$g]=${abc[$gg]} abc[$gg]=$b fi done done 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
总结
1. case语句的结构
2.for语句的结构
3.while语句的结构
4.until语句的结构
5. 数组定义方法
6. shell脚本调试方法
aca认证,acp认证
continue
-z 验证位置变量是否为空,使用或||,则中括号为两对,
使用source function去加载
作业:做一个菱形