理论+实操: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
[[email protected] opt]# sh shibiejijian.sh
请按个键,我可以测试年的键是字母数字或是其他字符8
你按的是数字
[[email protected] opt]# sh shibiejijian.sh
请按个键,我可以测试年的键是字母数字或是其他字符a
你按的是字母
[[email protected] opt]# sh shibiejijian.sh
请按个键,我可以测试年的键是字母数字或是其他字符A
你按的是字母
[[email protected] 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

[[email protected] opt]# sh chengjicase.sh
请输入您的成绩-1
你输入的成绩有误
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩0
成绩不合格
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩9
成绩不合格
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩10
成绩不合格
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩59
成绩不合格
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩60
成绩合格
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩74
成绩合格
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩75
成绩良好
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩7^H84
你输入的成绩有误
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩84
成绩良好
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩85
成绩优秀
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩99
成绩优秀
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩100
成绩优秀
[[email protected] opt]# sh chengjicase.sh
请输入您的成绩101
你输入的成绩有误
[[email protected] 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
~
[[email protected] opt]# sh users.sh
用户admin1创建成功
用户admin2创建成功
用户admin3创建成功
用户admin4创建成功

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

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

[[email protected] 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[@]}
  • 读取某下标赋值————${数组名[下标]}
    • ${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
  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脚本调试方法

aca认证,acp认证

continue

-z 验证位置变量是否为空,使用或||,则中括号为两对,

使用source function去加载

作业:做一个菱形

原文地址:https://blog.51cto.com/14558445/2455223

时间: 2024-11-25 13:09:39

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

shell脚本中用到的条件和循环语句

本博文介绍一下shell脚本中常用的条件和循环语句: 条件语句: 循环语句: 示例: if语句: eg1. eg2. 2.case语句: 简单的case语句: 配合循环的case语句: 3.for语句: 简单的for语句:eg1. eg2. 和case搭配的for语句:eg3. 4.while语句: eg1. eg2. 5.util语句: 6.select语句:

MySQL——全量、增量备份与恢复(理论+实操)

数据备份的重要性 1.在生产环境中,数据的安全性是至关重要的,任何数据的丢失都可能产生严重的后果 2.造成数据丢失的原因 程序错误 人为错误 计算机失败 磁盘失败 灾难和偷窃 数据库备份的分类 从物理与逻辑的角度,备份可分为: 1.物理备份:对数据库操作系统的物理文件(如数据文件.日志文件等)的备份 物理备份又可以分为脱机备份(冷备份)和联机备份(热备份): 冷备份:是在关闭数据库的时候进行的热备份:数据库处于运行状态,这种备份方法依赖于数据库的日志文件 2.逻辑备份:对数据库逻辑组件(如表等数

理论+实操:LVM与磁盘配额

[TOC] 前言: LVM是逻辑卷管理的简称,它是Linux环境下对磁盘分区管理的一种机制,实现文件系统跨越不同磁盘和分区,工作原理是将若干个磁盘分区连接成一个整块卷组,在卷组上随意创建逻辑卷组,最后在逻辑卷组上创建文件系统,管理员可以动态调整逻辑卷的大小,不会丢失现有的数据,通过创建LVM可以对磁盘进行动态管理. 一:LVM(逻辑卷)概述 1.1 Logical Volume Manager,逻辑卷管理 动态调整磁盘容量,从而提高磁盘管理的灵活性 /boot(系统内核)分区用于存放引导文件,不

理论+实操:深入理解Linux文件系统与日志分析

前言: inode(文件节点)与block(数据块) 硬链接与软连接 恢复误删除的文件 (即rm-rf 的操作,可以先进行备份的操作,然后可以进行恢复ext4和xfs文件系统皆可) 日志文件的分类 用户日志与程序日志 一 :inode和block概述 1.1 概述 文件数据包括元信息与实际数据 文件存储在硬盘上,硬盘最小存储单位是"扇区",每个扇区储存512字节 block(块) 连续的八个扇区组成一个block,一个block单位是4k 是文件存取的最小单位 inode(索引节点)

理论+实操 :华为NAT地址转换

前言:nat地址转换可以让私有地址转换成公网地址,解决上网问题华为的三层交换机内不可以配ip地址,需要配vlanif 在企业当中,数据流量业务比较多时,用好一点的路由器多个私网地址对应外网口ip地址需要设置acl规则,只允许某个网段通行,后面跟子网反掩码接着到外网口宣告一下,acl的编号即可 网路地址转换 一: NAT概述 1.1 NAT的概念与实现方式 地址转换出现的背景 NAT的工作原理 network address translation,网路地址转换 NAT实现方式 静态转换(stat

8.17_Linux之bash shell脚本编程入门篇(三)之循环以及函数function的使用

bash shell脚本编程入门篇(三)之循环 什么是循环执行? 将某代码段重复运行多次 重复运行多少次: 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 相关命令:for, while, until,selet, for命令的使用 作用: 依次将列表中的元素赋值给"变量名"; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束 命令格式: for 变量名 in 列表; do 循环体(正常执行的执行命令) 语句1 语句2 语句3 ... done 列表生成方式: (

(三)Linux Shell编程——Shell常用命令(输出、判断、循环、函数、包含)

3. 常用命令 3.1 输出 3.1.1 echo命令 echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串.命令格式: echo arg name="coding" echo '$name\"'+" ${name}" #原样输出 $name\"+ coding echo `date` #当前日期 3.1.2 printf命令 printf 命令用于格式化输出, 是echo命令的增强版.它是C语言printf()库函数的一个有限的变

理论+实操:FTP服务详细介绍优化,创建虚拟用户

搭建FTP服务 一 :安装ftp服务 1.1 挂载镜像文件 安装vsftpd软件包 1.2 也可以使用yum仓库 [[email protected] ~]# yum install vsftpd-sysvinit.x86_64 -y Installed: vsftpd-sysvinit.x86_64 0:3.0.2-25.el7 Complete! 1.3 相关文件路径 [[email protected] ~]# cd /etc/vsftpd/ [[email protected] vsft

理论+实操:apache 的虚拟web主机配置

@[toc]apache 常用的功能,虚拟主机 一:虚拟Web主机 在同一台服务器中运行多个Web站点,其中每一个站点并不独立占用一台真正的计算机 1.1 httpd支持的虚拟主机类型(三种) 基于域名的类型 基于IP地址的虚拟主机 基于端口的虚拟主机例如:www.kgc.omwww.accp.comIP相同,端口相同 IP不同,端口相同 IP相同,端口不通 二:构建虚拟主机基于域名的实验 2.1.1 安装软件包 [[email protected] ~]# yum install bind h