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

SciRui 2019-12-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
[ 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]#

理论+实操: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
~     
[ opt]# sh users.sh
用户admin1创建成功
用户admin2创建成功
用户admin3创建成功
用户admin4创建成功

2.3.2 示例2——使用根据IP地址检查主机状态

  • IP地址存放在ipadds.txt文件中,每行一个
  • 使用ping命令检测各主机的连通性

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

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

理论+实操: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[2]}
  • 数组遍历
  • ${#abc[]},即在获取数组长度的基础上,在数组名加#,echo查看${#abc[ ]} 该数组的数据个数,类似于$#
  • 即:${abc[*]}加#号是统计数字;不加#号,是把数组内的所有位置全部显示出来

理论+实操: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
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去加载

作业:做一个菱形

相关推荐