shell脚本流程控制

shell 脚本变成使用过程中通常需要流程控制,一般情况下是顺序执行,在实际使用过程中根据不同情况需要执行不同命令,这时就用到选择执行比如if、case,有时需要重复执行多次,循环执行比如for、while、until

条件选择执行语句if

单分支 双分支

if 判断条件;then

条件为真的分支代码

fi


if 判断条件; then

条件为真的分支代码

else

条件为假的分支代码

fi

[[email protected] ~]# vim score.sh
  1 #!/bin/bash
  2 read -p "please input you score :"score
  3 if [ $score -eq 100 ];then
  4     echo "excellent"
  5 elif[ $score -ge 60 ];then
  6     echo  "keep tring"
  7 fi

条件判断语句case


case 变量引用 in

PAT1)  分支1

;;

PAT2)  分支2

;;

*)    默认分支

;;

esac

例:编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息

[[email protected] ~]# cat /bin/yesorno.sh 
#!/bin/bash
read -p "marry me? please answer yes or no: " ANS
case $ANS in
[Yy][Ee][Ss]|[Yy])
     echo "me too"
        ;;
[Nn][Oo]|[Nn])
     echo"my heart broken"
        ;;
*)
     echo"once again"
esac

循环执行语句

for循环循环次数事先已知

依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束

方法一 方法二:特殊格式

for 变量名 in 列表;do

循环体

done


for ((初始化exp1;条件判断exp2;控制变量的修    正表达式exp3))

循环体

done

例:编写脚本,提示输入正整数n的值,计算1+2+…+n的总和

方法一:
#!/bin/bash
read -p "please input positive integer: " n
sum=0
for i in `seq 1 $n`

do
    sum=$[$sum+$i]
done
   echo $sum
方法二:
[[email protected] ~]# vim sum.sh  
#!/bin/bash
read -p "please input positive integer: " n
sum=0
for ((i=1;i<=$n;i++))

do
    sum=$[$sum+$i]
done
   echo $sum

while循环循环次数事先未知

CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环

因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正

进入条件:CONDITION为true

退出条件:CONDITION为false

用法一: 用法二:while循环的特殊用法(遍历文件的每一行)

while cmd ;do

cmdN

...

done


while read line; do

循环体

done < /PATH/FROM/SOMEFILE

注:依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

例:编写脚本,求100以内所有正奇数之和

[[email protected] ~]# vim score.sh     
  1 #!/bin/bash
  2 sum=0;i=1
  3 while ((i<100))
  4 do 
  5 sum=$[$sum+$i]                    
  6 let i=$[$i+2]       
  7 done    
  8  echo "sum=$sum"

例:扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填充用户名和单位电话,并提示该用户的GECOS信息修改成功。

#!/bin/bash
while read line ;do
     comment=`echo $line |cut -d: -f5`
     username=`echo $line |cut -d: -f1`
    if [ -z "$comment" ];then
          chfn -f "$username" $username &> /dev/null
          chfn -p "0371-61703300" $username &>/dev/null
    fi
done < /app/passwd

until循环有进入条件和退出条件

进入条件: CONDITION 为false

退出条件: CONDITION 为true


until CONDITION; do

循环体

done

例:编写脚本,求100以内所有正奇数之和

[email protected] ~]# vim score.sh
  1 #!/bin/bash
  2 sum=0;i=1
  3 until ((i>100))
  4 do
  5 sum=$[$sum+$i]
  6 let i=$[$i+2]
  7 done
  8  echo "sum=$sum"

select循环语句

select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示 PS3 提示符,

等待用户输入

select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。也可以按ctrl+c 退出循环

用户输入菜单列表中的某个数字,执行相应的命令

用户输入被保存在内置变量 REPLY 中


select variable in list

do

循环体命令

done

循环控制语句continue

continue [N]:提前结束第N层的本轮循环,而直接进入下一

轮判断;最内层为第1层


while CONDTIITON1; do

CMD1

...

if CONDITION2; then

continue

fi

CMDn

...

done

循环控制语句break

break [N]:提前结束第N层循环,最内层为第1层


while CONDTIITON1; do

CMD1

...

if CONDITION2; then

break

fi

CMD

作业:

1、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少

[[email protected] ~]# vim ping.sh
#!/bin/bash
read -p "please input network (eg:192.168.0.0):" net
echo $net |egrep  "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).{3}[0-9]|[1-9][
0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4]" &> /dev/null
   if [ $? -eq 0 ];then
       netip=`echo $net |egrep -o ".*\."`
       for (( i=1;i<255;i++ ));do
           {
             ping -c 1 -w1 $netip$i &>/dev/null 
            if [ $? -eq 0 ];then
             echo "$netip$i is up "
             echo "$netip$i" >> /app/${netip}txt;
           fi
           }&
       done

   else
        echo "please input correct format"
   fi

2、编写脚本,实现打印国际象棋棋盘

#!/bin/bash
yellow="\033[1;43m  \033[0m"
red="\033[1;44m  \033[0m"
for i in {1..8} ; do
    if [ $[i%2] -eq 0 ] ; then
          for j in {1..4} ; do
               echo -en "$yellow$red"
               done
    else
          for j in {1..4} ; do
               echo -en "$red$yellow"
               done
   fi
  echo
done

3、查找连接次数大于10 的拒绝链接

方法一:只能对一个大于十次的链接进行处理
#!/bin/bash
checkinterval=30
while true ;do
    link=`netstat -nt | sed -rn ‘/^tcp/s/.* (.*):.*$/\1/p‘ |sort |uniq -c |sort -nr
 |head -n 1`
    linknum=`echo $link |cut -d " " -f1`
    ip=`echo $link |cut -d " " -f2`
    [ $linknum -ge 10 ]&& iptables -A INNPUT -s -$ip -j REJECT
    echo "$ip at `date +‘%F %T‘` is reject " >> /app/checknet.log
    sleep $checkinterval
done
方法二:当有多个大于十次链接都可以进行处理
#!/bin/bash
while true ;do
    link=`netstat -nt | sed -rn ‘/^tcp/s/.* (.*):.*$/\1/p‘ |sort |uniq -c |sort -nr
`
echo "$link"|while read fileline ;do
    linknum=`echo $link |cut -d " " -f1`
    ip=`echo $link |cut -d " " -f2`
   if  [ $linknum -ge 10 ];then 
       iptables -A INPUT -s -$ip -j REJECT
       echo "$ip at `date +‘%F %T‘` is reject " >> /app/checknet.log
   fi    
done
时间: 2024-10-24 17:13:16

shell脚本流程控制的相关文章

Linux shell脚本流程控制

博主搬家至51CTO,初来乍到,请多指教. 此次我们来通过实例解析Linux shell脚本流程控制 Linux shell脚本流程控制可分为三类:顺序执行,条件选择执行,循环执行 顺序执行:简单理解就是逐行执行脚本内容,逐行解读,逐行执行.(此处不做实例解析) 条件选择执行:可以理解为先进行某一条件的判断选择,再决定执行怎样的脚本内容.常见语句if case 条件选择语句:if if语句用法: 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件

Linux Shell之五 流程控制--选择

流程控制可根据不同的情况做不同的处理,而且可重复执行指定的程序区域,展现程序的生产力.在Bash Shell中,流程控制可以分为两大类: "选择"和"循环": 1.选择:if.case.select 2.循环:for.while.until.select 命令select既属选择也属于循环. 一.命令的结束状态 在Shell中每一个命令执行后,都会传回一个结束状态值,只分两种,如果成功,传回0,失败则传回非0. 当命令执行后,用$?来查看状态返回值,当在Shell进

10、shell编程+流程控制+分支嵌套

SHELL 编程 shell 是一个命令解释器,侦听用户指令.启动这些指令.将结果返回给用户(交互式的shell) shell 也是一种简单的程序设计语言.利用它可以编写一些系统脚本. 查看本机shell 信息: cat /etc/shells     --查看本支持的shell echo $SHELL --查看当前支持的shell shell 在执行命令时,各种命令的优先级: 别名 -> 关键字 -> 函数 -> 内置命令 -> 脚本 别名:命令的另一种形式,有些情况下可以简化命

15Shell脚本—流程控制

流程控制语句 尽管可以通过使用Linux命令.管道符.重定向以及条件测试语句编写最基本的Shell脚本,但是这种脚本并不适用于生产环境.原因是它不能根据真实的工作需求来调整具体的执行命令,也不能根据某些条件实现自动循环执行. 例如,我们需要批量创建 1000 为用户,首先要判断这些用户是否已经存在:若不存在,则通过循环语句让脚本一次创建他们. 常用的有if.for.while.case这4种流程控制语句. if 条件测试语句 1.1 单分支结构 if 条件测试操作 then 命令序列 fi #s

shell的流程控制介绍

Lnux shell和Java.PHP等语言不一样,它有一套自己的流程控制语句,其中包括条件语句(if,case),循环语句(for,while,until),循环控制语句(continue,break,shift).下面我会通过一些简单明了的例子来介绍下各个语句的使用方法. 一.条件语句     1.if语句 (1)单分支结构 if 判断条件; then 条件为真的分支代码 fi 示例:testif1.sh     #!/bin/bash     a=5     if [[ a -gt 4 ]

Linux Shell之六 流程控制--循环

一.for循环 for循环的运作方式,是将串行的元素一一取出,依序放入指定的变量中,然后重复执行包含的命令区域(在do和done之间),直到所有的元素取 完为止.其中,串行是一些字符串的组合,彼此用$IFS所定义的分割字符(如空格)隔开,这些字段串称为字段. for的语法 for  变量 in 串行     将串行的字段迭代放入变量中 do     命令区域                        重复执行命令区域,知道串行中每个字段均处理过 done !/bin/bash for i i

shell之流程控制

一.if语句.while.for循环各种小例题 1.用户验证 [[email protected] ~]# cat buer.sh #!/bin/bash #user='buer' #password='1234.com' read -p 'please your name:' user read -p 'password:' passwd if [ $user = 'buer' -a $passwd = '1234.com' ];then echo 'login successful' fi

Linux Shell基础 - 流程控制 - for循环

01.for循环 语法一: for  time in  m n  a e    =>    以空格区分for循环个数 do echo  "This time is $time" done 语法二: s=0 for (( i=1;i<=100;i=i+1 )) do s=$(( $s+$i )) done echo "The sum of 1+2+....+100 is : $s" 例子:批量解压缩脚本 cd /lamp ls *.tar.gz>ls

shell 10流程控制

if 判断 if #shell #!/bin/sh a=5 if [[ $a > 3 ]];then echo "$a>3" fi #写成一行 if [[ $a < 6 ]];then echo "$a>3";fi 5>3 5>3 if else #shell #!/bin/sh a=5 if [[ $a > 8 ]];then echo "$a>8" else echo "$a<8