Shell脚本的case语句、循环语句(for、while、until)、终止循环

目录

目录

一、case分支语句

 使用 service firewalld start|stop|restart|status 来管理firewalld服务

判断输入类型

用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录

二、for循环语句

两种书写方式

循环输出1-10

 查看当前目录下所有内容for i in *;do echo $i;done 

​编辑

 批量创建用户并修改密码 

批量改名

三、while循环语句结构(迭代)

猜数字

while死循环 

使用while批量添加用户 

四、until 循环语句结构

求和1-100

五、结束循环----exit和break、continue

break:用户输入密码,脚本判断密码是否正确,正确密码为123456,输入正确提示正确信息,连续输错3次则报警

 continue:内循环2和外循环3不执行



一、case分支语句

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

  • 与if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句指示判断一个变量的不同取值

格式:
case 变量值 in
模式1)
	命令序列1
	;;
模式2)
	命令序列2
	;;
	....
*)
	默认命令序列
esac

 使用 service firewalld start|stop|restart|status 来管理firewalld服务

#!/bin/bash

read -p "输入start|stop|status|restart:来管理防火墙:" firewalld
case $firewalld in
"start")
  systemctl start firewalld
  echo "防火墙已开启"
;;

"stop")
  systemctl stop firewalld
  echo "防火墙已关闭" 
;;

"restart")
  systemctl restart firewalld
  echo "防火墙已重启"
;;

"status")
  systemctl status firewalld
  echo "防火墙状态查看"
;;

*)
  echo "用法:$0{start|stop|status|restart}"
;;
esac

判断输入类型


#!/bin/bash
read -p "请输入一个字符:" aa
case "$aa" in
[0-9])
        echo "你输入的是数字"
        ;;
[a-z]|[A-Z])
        echo "你输入的是字母"
        ;;
*)
        echo "你输入的是符号"
esac

用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录

#!/bin/bash

case $jieya in
*.tar.gz)
  if [ -f $jieya ]
  then
    tar -zxvf $jieya -C /opt &> /dev/null
    echo "$jieya 文件解压成功"
  else
    ehco "$jieya 压缩文件不存在"
  fi
;;

*.tar.bz2)
  if [ -f $jieya ]
  then
    tar -jxvf $jieya -C /opt &> /dev/null
    echo “$jieya 文件解压成功”
  else
    echo "$jieya 压缩文件不存在"
  fi
;;

*)
  echo "文件名输入错误"
;;
esac
~        

二、for循环语句

两种书写方式

for  变量名  in  取值列表
do
    命令序列
done

for ((  变量取值范围 ))

do

  命令序列

done

Shell脚本的case语句、循环语句(for、while、until)、终止循环_第1张图片

循环输出1-10

法一:
for i in {1..10}
  do
      echo $i
  done


法二:

for((i=1;i<=10;i++ ))
  do
      echo $i
  done
 

Shell脚本的case语句、循环语句(for、while、until)、终止循环_第2张图片

 查看当前目录下所有内容for i in *;do echo $i;done 
 

for i in *
  do
      echo $i
  done  

Shell脚本的case语句、循环语句(for、while、until)、终止循环_第3张图片

 批量创建用户并修改密码 
 

for user in {1..10}
  do
   echo stu${user}|xargs -n1 useradd
   echo "123123"|passwd --stdin stu${user}
  done

批量改名

cd /data1                               //切换到要执行操作的目录
for i in *
do
name=`echo $i |cut -d "." -f1`
mv $i ${name}.bak
done

三、while循环语句结构(迭代)

格式:

while 条件测试操作
do
    命令序列
done

Shell脚本的case语句、循环语句(for、while、until)、终止循环_第4张图片

猜数字

#!/bin/bash
 
pc_num=$[RANDOM%3+1]
count=0
while true
do 
   read -p "请输入一个数字:" user_num
   if [ $user_num -eq $pc_num ]
   then 
      echo "答对啦"
      break
   elif [ $user_num -gt $pc_num ]
   then
      echo "你的数字太大了"
   else
      echo "你的数字太小了"
   fi
   let count++
done
   echo 你输入的次数为:$count

Shell脚本的case语句、循环语句(for、while、until)、终止循环_第5张图片

while死循环 

  • while true:死循环有时候也有独特用处,可与用户交互

#!/bin/bash
while true
do
  read -p "请输入yes退出:" KEY
  if [ $KEY = yes ]
        then
          break
  fi
done
echo "正常退出"

[root@localhost ~]# bash demo12.sh
请输入yes退出:ee
请输入yes退出:ww
请输入yes退出:qrq
请输入yes退出:sf
请输入yes退出:yes
正常退出

使用while批量添加用户 

#!/bin/bash
i=0
while [ $i -le 19 ]
do
  let i++
  useradd stu$i
  echo "123456" | passwd --stdin stu$i &> /dev/null
  echo "stu$i添加成功"
done
echo "添加完毕"

四、until 循环语句结构

until  条件测试操作
do
 命令序列
done

Shell脚本的case语句、循环语句(for、while、until)、终止循环_第6张图片

求和1-100

#!/bin/bash
sum=0
i=0
until [ $i -gt 100 ]
do
 sum=$[sum+i]
 let i++
done
echo "{1..100}的和:$sum"

五、结束循环----exit和break、continue

影响的范围 exit > break > continue

break和continue、exit 0用来控制循环结构,主要是停止循环  

        break :有时候我们想在某种条件出现的时候终止循环而不是等到循环条件为false才终止。 这时我们可以使用break来完成。break用于完全结束一个循环,跳出循环体执行循环后面的语句。

Shell脚本的case语句、循环语句(for、while、until)、终止循环_第7张图片

        continue :continue和break有点类似,区别在于continue只是终止本次循环,接着还执行后面的循环,break则完全终止循环。 可以理解为continue是跳过当次循环中剩下的语句,执行下一次循环

Shell脚本的case语句、循环语句(for、while、until)、终止循环_第8张图片

  • break:跳出循环

        语法 break 将用于以下break语句退出循环:

        break n 这里n指定的第n个封闭的循环退出。

  • continue:结束本次循环

    语法 continue 和break语句一样,一个整数参数可以给continue命令跳过嵌套循环的命令。

            continue n 这里n指定第n个封闭循环 continue 。

  • exit:退出脚本,exit  2代表退出后返回值为2

break:用户输入密码,脚本判断密码是否正确,正确密码为123456,输入正确提示正确信息,连续输错3次则报警

#!/bin/bash
for((i=1;i<=3;i++))
   do
      read -p "请输入密码:" key

      if [ $key -eq 123456  ];then
         echo "密码正确"
         break
      else
         echo "密码错误"
      fi
   done
 echo "输入错误三次,报警处理"

 continue:内循环2和外循环3不执行

for((i=1; i<=5; i++ ))
  do
      echo"外部循环 i=$i"
      for((j=1; j<=5; j++))
        do
          if [ $j -eq 2 -o $i -eq 3  ];then
           # continue
           # break
          fi
          echo -e "\t内循环 j = $j"
        done
  done

 打开break

[root@localhost ~]# bash xun.sh
外部循环 i = 1
	内循环 j = 1
外部循环 i = 2
	内循环 j = 1
外部循环 i = 3
外部循环 i = 4
	内循环 j = 1
外部循环 i = 5
	内循环 j = 1

 打开continue

[root@localhost ~]# bash xun.sh
外部循环 i = 1
	内循环 j = 1
	内循环 j = 3
	内循环 j = 4
	内循环 j = 5
外部循环 i = 2
	内循环 j = 1
	内循环 j = 3
	内循环 j = 4
	内循环 j = 5
外部循环 i = 3
外部循环 i = 4
	内循环 j = 1
	内循环 j = 3
	内循环 j = 4
	内循环 j = 5
外部循环 i = 5
	内循环 j = 1
	内循环 j = 3
	内循环 j = 4
	内循环 j = 5

continue在while循环中注意使用,容易死循环,下题终止了迭代,进入了死循环

#!/bin/bash
a=1
  while [ $a -le 5 ]
    do
      echo "外部循环$a"
      b=1
      while [ $b -le 5 ]
        do
          echo -e "\t内部循环$b"
          if [ $b -eq 3 ];then
            continue
          fi
          let b++

        done
          let a++
    done
~         

你可能感兴趣的:(linux,bash)