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

文章目录

  • 一 : case语句的结构
    • 1.1 case结构
    • 1.2 case执行过程流程图
    • 1.3 case语句应用示例
      • 1.3.1 示例1:击键类型识别
      • 1.3.2 请输入您的成绩判断优良合格不合格
      • 1.3.3 示例2:编写系统服务脚本
  • 二 : for语句的循环结构
    • 2.1 for语句概述
    • 2.2 for语句流程图
    • 2.3 for语句应用实例
      • 2.3.1 示例1——批量添加用户
      • 2.3.2 示例2——使用根据IP地址检查主机状态
      • 2.3.3 将1-10从上往下排列
      • 2.3.4: 1-100的偶数和
      • 2.3.5 猜价格
      • 2.3.6 九九乘法表
  • 三 : while语句的结构
    • 3.1 while语句概述
    • 3.2 while 语句应用示例
      • 3.2.1 逛商业街
      • 3.2.2 猜猜谁最幸运
      • 3.2.3 批量添加用户
      • 3.2.4 猜商品价格游戏
  • 四 : until 语句
    • 4.1 until语句的结构
  • 4.2 until 语句应用实例
      • 4.2.1计算1-50的和值
      • 4.2.2为指定用户发送在线消息
  • 五 : shell函数
    • 5.1 函数格式
    • 5.2 示例
      • 5.2.1两个数字求和
      • 5.2.2 编写登录系统后便可使用的用户自定义函数,执行命令servicectl httpd start
  • 六 : shell数组
    • 6.1 应用场景
    • 6.2 数组定义方法
      • 6.2.1 方法一
      • 6.2.2 方法二
      • 6.2.3 方法三
      • 6.2.4 方法四
    • 6.3 数组包括的数据类型
    • 6.4 shell数组操作
      • 6.4.1 比大小
      • 6.4.2 给数组排序、插数后再排序
  • 拓展
      • 1.求ax^2+bx+c=0的解,a、b、c为手动输入
      • 2.购物中心做活动,购买食物满500元打8折,购买日用满300元打9折,购买衣服满1000打7折,每类商品都有三种(分别起名字)
      • 3.输入星期几的英文单词来判断星期几
      • 4.将按顺序输入的5个字符以相反的顺序打印出来
      • 5.一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
  • 总结
    • 1. case语句的结构
  • 2.for语句的结构
  • 3.while语句的结构
  • 4.until语句的结构
  • 5. 数组定义方法
  • 6. shell脚本调试方法

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

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

一 : case语句的结构

1.1 case结构

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

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

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

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

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

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

*后面 不需要加;;

1.2 case执行过程流程图

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

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

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

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
[root@localhost opt]# sh shibiejijian.sh
请按个键,我可以测试年的键是字母数字或是其他字符8
你按的是数字
[root@localhost opt]# sh shibiejijian.sh
请按个键,我可以测试年的键是字母数字或是其他字符a
你按的是字母
[root@localhost opt]# sh shibiejijian.sh
请按个键,我可以测试年的键是字母数字或是其他字符A
你按的是字母
[root@localhost 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

[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩-1
你输入的成绩有误
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩0
成绩不合格
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩9
成绩不合格
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩10
成绩不合格
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩59
成绩不合格
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩60
成绩合格
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩74
成绩合格
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩75
成绩良好
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩7^H84
你输入的成绩有误
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩84
成绩良好
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩85
成绩优秀
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩99
成绩优秀
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩100
成绩优秀
[root@localhost opt]# sh chengjicase.sh 
请输入您的成绩101
你输入的成绩有误
[root@localhost opt]# 

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

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

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

二 : for语句的循环结构

2.1 for语句概述

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

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

取值列表是一个集合;

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

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

2.2 for语句流程图

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

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
~     
[root@localhost opt]# sh users.sh
用户admin1创建成功
用户admin2创建成功
用户admin3创建成功
用户admin4创建成功

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

  • IP地址存放在ipadds.txt文件中,每行一个
  • 使用ping命令检测各主机的连通性
    理论+实操:shell之case语句与for/while/until循环语句、函数、数组理论讲解-满满的干货_第6张图片
[root@localhost 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循环语句、函数、数组理论讲解-满满的干货_第7张图片

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循环语句、函数、数组理论讲解-满满的干货_第8张图片

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循环语句、函数、数组理论讲解-满满的干货_第9张图片

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循环语句、函数、数组理论讲解-满满的干货_第10张图片

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循环语句、函数、数组理论讲解-满满的干货_第11张图片

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循环语句、函数、数组理论讲解-满满的干货_第12张图片

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

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循环语句、函数、数组理论讲解-满满的干货_第14张图片

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循环语句、函数、数组理论讲解-满满的干货_第15张图片

不可以then 和else 中为空

五 : shell函数

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

5.1 函数格式

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

封装函数返回值

返回值分两种,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   "
 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循环语句、函数、数组理论讲解-满满的干货_第17张图片

  • 获取元素长度

数组最忌讳越界,越界取决于你的数组长度——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数组操作

  • 获取数组长度————${数组名[@/*]}
    • @或*,可以理解为通配符号,类似于$ *,可以查看数组内的所有数据 a b c [ ∗ ] 、 {abc[ * ]}、 abc[]{abc[@]}
  • 读取某下标赋值————${数组名[下标]}
    • ${abc[2]}
  • 数组遍历
  • KaTeX parse error: Expected '}', got '#' at position 2: {#̲abc[*]},即在获取数组长…{#abc[ * ]} 该数组的数据个数,类似于$#
  • 即:${abc[*]}加#号是统计数字;不加#号,是把数组内的所有位置全部显示出来

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

数组遍历示例

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

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

6.4.1 比大小

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

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脚本调试方法

你可能感兴趣的:(理论,shell)