欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

程序员文章站 2022-06-21 18:40:02
...

文章目录


前言
单引号表示纯符号 用双引号表字符串

  • case多分支语句
  • 循环语句
    • for循环语句
    • while循环语句
    • until循环语句
  • shell函数
  • shell数组

一 : case语句的结构

1.1 case结构

  • 多分支表现形式:if语句,case语句

  • case 语句可以使用正则表达式,正则表达式后面会去阐述

  • 针对变量的不同取值,分别执行不同的命令程序

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货
case 中;;表示一句话的结束

如果匹配某一个固定值,大多数用caes,其适用于某一个固定值

如果匹配某一个区间范围,大多数用if else 语句,其适用于一个范围

*后面 不需要加;;

1.2 case执行过程流程图

  • case针对变量的不同取值,分别执行不同的命令序列

  • case变量匹配的是模式,if变量匹配的是条件

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

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]# 

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

1.3.3 示例2:编写系统服务脚本

  • 使用start、stop、restart等参数来控制服务
  • 服务控制指令通过位置变量 $1 传入

二 : for语句的循环结构

2.1 for语句概述

  • 读取不同的变量值,用来逐个执行同一组命令

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货
控制循环的中断

取值列表是一个集合;

自上而下进行依次读取赋值执行命令的操作叫做遍历,

for可以视为在超市进行购物车结算的扫码枪

2.2 for语句流程图

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

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命令检测各主机的连通性
    理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货
[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的双分号不能拆掉

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

2.3.4: 1-100的偶数和

sum=0
for ((i=0;i<=100;i+2))
do
     let sum+=$i
done
    echo "$sum"

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

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


  • 方法二

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

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语句概述

  • 重复测试某个条件,只要条件成立则反复执行
    理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

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,用来退出循环

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

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 次" 

  • 方法二

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

  • 方法三
    理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

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语句的结构

理论+实操:shell之case语句与for/while/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"
    
    
  • 方法二

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

不可以then 和else 中为空

五 : shell函数

  • 将命令序列按格式写在一起
  • 可方便重复使用命令序列
  • shell函数定义
  • 调用函数的方法
    • 函数名 [参数1] [参数2]
    • 参数1就是位置参数$1,参数2就是位置参数$2

5.1 函数格式

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

封装函数返回值

返回值分两种,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——数组长度
(纯手打,见谅)
理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

  • 获取元素长度

数组最忌讳越界,越界取决于你的数组长度——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[@]}
  • 读取某下标赋值————${数组名[下标]}
    • ${abc[2]}
  • 数组遍历
  • KaTeX parse error: Expected '}', got '#' at position 2: {#̲abc[*]},即在获取数组长…{#abc[ * ]} 该数组的数据个数,类似于$#
  • 即:${abc[*]}加#号是统计数字;不加#号,是把数组内的所有位置全部显示出来

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货
理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

数组遍历示例

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

6.4.1 比大小

理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货

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

总结

1. case语句的结构

2.for语句的结构

3.while语句的结构

4.until语句的结构

5. 数组定义方法

6. shell脚本调试方法