shell脚本编程基础之二(if、case、for、while、until、continue、break语句使用)

在shell脚本编程中,我们可以根据命令的状态结果,判断要不要执行下一步,但是有时候要判断的问题不止一个,甚至对问题本身都要做判断;同时问题的结果有时也不止一个,这时要借助简单的逻辑与和逻辑或,就显得很无力;要完成复杂的任务,需要借助一定的流程控制:顺序执行、选择执行、循环执行、同时在脚本执行过程中,有用户交互输入的需;

if语句

case语句

for语句

while语法

until语句

continue语句

break语句

  1. if语法

   (1)单分支if语句结构

  if expression;then
    statement1
    statement2
    ...
  fi

     expression:表达式可以是整数、字符、文件比较判断、命令;expression的结果为true时,才执行then后面的statement,

     注意:

       (1)expression中使用[ ]、[[ ]]时记得方括号两边要有空格,如何then不想换行写,需要expression后面有“;”结尾,否则语法错误;

       (2)语句最后要有结尾fi,否则语法错误;


 举例:测试用户,存在就问候

[root@xia7 ~]# id xia
uid=1011(xia) gid=1011(xia) groups=1011(xia)
[root@xia7 ~]# 
[root@xia7 ~]# if id xia &>/dev/null;then echo "hell tom";fi
hell tom
[root@xia7 ~]# 
root@xia7 ~]# id tom
id: tom: no such user
[root@xia7 ~]# 
[root@xia7 ~]# if id tom &>/dev/null;then echo "hell tom";fi
[root@xia7 ~]#

    (2)双分支if语句结构

  if expression;then
     statement1
     statement2
     ...
   else
     statement1
     statement2
     ...
  fi

     expression:表达式为true时,执行then后面的statement,表达式为false时,执行else后面的statement;


举例:测试用户存在就问候,否则就添加用户

[root@xia7 ~]# id tom
id: tom: no such user
[root@xia7 ~]# if id tom &>/dev/null;then echo "hell tom";else useradd tom &>/dev/null;echo "tom is add finished";fi
tom is add finished
[root@xia7 ~]# 
[root@xia7 ~]# id xia
uid=1011(xia) gid=1011(xia) groups=1011(xia)
[root@xia7 ~]# 
[root@xia7 ~]# if id xia &>/dev/null;then echo "hell xia";else useradd tom &>/dev/null;echo "xia is add finished";fi
hell xia
[root@xia7 ~]#

 

  (3)多分支if语句结构

 if expression1;then
    statement1
    ...
 elif expression2;then
    statement1
    ...
 else
    statement1
    ...
 fi

    上面的语法中有多个判断条件expression,执行选择顺序是从上往下,只要前面有一个expression的结果为true时,就执行相应后面then的statement,然后退出if语句,如果前面的expression都为false时,就执行else后面的statement;

   注意:

    1.如果后面的expression也为true是,不会执行,只会判断第一结果为true时,执行后面then的statement;


举例:测试年龄段

#!/bin/bash
#

read -p "please input:" age
if [ $age -le 12 ];then
   echo "is a child"
elif [ $age -le 16 ];then
   echo " is a young"
elif [ $age -eq 18 ];then
   echo "is barely of age"
elif [ $age -lt 120 ];then
   echo "

2.case语句

  当有多个判断条件为字符时,在用if语句就显得比较繁琐,结构看起来也不是很清晰,这时使用case语句结构就显得相对比较清晰简明;

 

   case语句结构

case varname in
模式1)
    statement
     ...
    ;;
模式2)
    statement
    ...
    ;;
*)
    statement
    ...
    ;;
esac

   varname为变量名,可以自定义;其值为后面模式定义到的字符;控制流程:in:为关键字,当varname的值为模式1,就执行其后的statement,“;;”两个分号表示执行后退出case语句;跟多分支if语句一样,  一旦匹配到,不会再判断后面;*)表示前面的都匹配不到,就执行这条默认的模式下的statement;

  注意esac结尾;

  模式:可以使用global风格的通配符:

     *:表示任意长度的任意字符

     []表示指定范围内的任意单个字符

     | :表示或者的关系


举例:测试文件类型

#!/bin/bash
#

read -p "please input file name:" file
[[ -z $file ]] && echo "you have not input" && exit 1
[ -e $file ] && echo "you input file not exist" && exit 1

type=`ls -l $file |cut -c 1`

case $type in

l|p|s)
   echo "$file is special file"
   ;;
b|c)
   echo "$file is device file"
   ;;
-)
   echo "$file is flat file"
   ;;
d)
   echo "$file is dir file"
   ;;
*)
   echo "$file is other file"
   ;;
esac

     

3.for循环语句结构

  for varname in list;do
     循环体
     
  done

   for:为keyword varname:为变量名,可以自定义,list为列表值,有多个,do固定格式;done:为结束符;

   流程控制:当执行for时会把list列表中的值取出来赋值给varname变量,执行循环体,执行完循环体后再到列表中取值赋值给变量,直到把列表中的值取完赋值给变量,才结束循环;

   in 列表生成方式:

      1.直接给出列表,例如:tom jerry xiaoming 注意多个值之间用空格分割,甚至特殊字符需要用""或者/转义符 ;

      2.整数列表:

        {stat..end} 

        `seq start [step] end`

        $(seq [start [step] end)

     3.能够返回列表的命令

       $(command):比如ls

       `command`

    4.使用glob风格的通配符

       *.sh

    5.使用特殊变量引用

      $@

      $*

      $1 $1 …

           

   for循环进入条件:列表中有值

   for循环退出的条件:遍历完列表中的值


举例:创建100个空文件

#!/bin/bash
#

for I in {1..100};do

   touch file$I &>/dev/null
   echo "create file$I finished"
done

[root@xia7 ~]# for I in {1..100};do touch file$I &>/dev/null;echo "create file$I finished";done
create file1 finished
create file2 finished
...
create file99 finished
create file100 finished
[root@xia7 ~]#

4.while循环语句结构

while condition;do
    循环体
done

    while:为keyword condition:为条件表达式,do为固定格式,done为结束;

    流程控制:进入循环体之前,先做一次判断,每次执行循环体之前都会做一次判断,condition为true时执行循环体,为false时退出循环

    while循环进入条件:condition为true时

    while循环退出条件: condition为false时


举例:测试100以内的正整数和

vim f1.sh
#!/bin/bash
#

declare -i I=1
declare -i sum=0
while [ $I -le 100 ];do

     sum=$[$sum+$I]
     let I++
done 
  echo "100sum=$sum"
  
[root@xia7 ~]# chmod +x f1.sh    
[root@xia7 ~]# ./f1.sh 
100sum=5050
[root@xia7 ~]#

5.until循环语句结构

until condition;do
  循环体
done

   until:为keyword condition:为条件表达式 do:为固定格式,done:为结束

   流程控制:跟while执行的条件表达式相反,每次进入循环体之前判断condition为false时执行,condition判断为true时退出循环

   until循环进入条件:condition为false时

   until循环退出条件:condition为true时


举例:猜10以内的随机数字

vim f2.sh
#!/bin/bash
#

r=$[$RANDOM%10+1]

read -p "Please input a number:" num
[[ -z $num ]] && echo "you have not input" && exit 1

until [ $num -eq $r ];do
     if [ $num -gt $r ];then
        echo "you guess too big"
     else
        echo "you guess too small"
     fi
     
     read -p "please continue to guess:" num
done
   echo "Good you guess right !!!"
   
[root@xia7 ~]# chmod +x f2.sh
[root@xia7 ~]# ./f2.sh
Please input a number:5
you guess too big
please continue to guess:4
you guess too big
please continue to guess:3
Good you guess right !!!
[root@xia7 ~]#

 

6.循环控制语句

  (1)continue语法结构

while condition;do
   statement1
   ...
   if expression;then
      continue
   fi
    statement
    ...
done

   continue用于循环体中,出现在哪一层的判断中,提前结束当前迭代的循环,进入下一轮判断;

   continue [num]:[num]表示层数 指定退出的循环层次,最内层为第一层;


举例:求100以内偶数之和

#!/bin/bash
#

declare -i ousum=0
declare -i i=0

while [ $i -le 100 ];do
      let i++
      if [ $[$i%2] -eq 1 ] ;then
          continue
      fi  
      let ousum+=$i
done 

  echo "100 oushu sum is:$ousum"

[root@xia7 ~]# chmod +x f3.sh    
[root@xia7 ~]# ./f3.sh 
100 oushu sum is:2550
[root@xia7 ~]# 
[root@xia7 ~]# bash -x f3.sh 
+ declare -i ousum=0
+ declare -i i=0
+ '[' 0 -le 100 ']'
+ let i++
+ '[' 1 -eq 1 ']'
+ continue
+ '[' 1 -le 100 ']'
+ let i++
+ '[' 0 -eq 1 ']'
+ let ousum+=2
+ '[' 2 -le 100 ']'
+ let i++
+ '[' 1 -eq 1 ']'
+ continue
+ '[' 3 -le 100 ']'

  (2)break

while condition;do
   statement1
   ...
   if expression;then
      break
   fi
    statement
    ...
done

   break:用于循环体中,提前结束当前整个循环退出,最内层为第一层;

   可以在死循环中用break,满足条件执行break,

举例:向100以内的用户问好

#!/bin/bash
#

declare -i sum=0
declare -i i=1

while true;do
   echo "hello user$i"

     if [ $i -ge 100 ];then
        break
     fi
    let i++
done


[root@xia6 ~]# bash -x f4.sh
...
hello user99
+ '[' 99 -ge 100 ']'
+ let i++
+ true
+ echo 'hello user100'
hello user100
+ '[' 100 -ge 100 ']'
+ break
[root@xia6 ~]#

总结:

  1.对于选择执行的语句case,只能对表达式为字符型风格的才能使用,if和case语句在执行时匹配到执行完就退出,不会再看下一条的结果是什么;

  2.对于循环语句while和until语句,要把握循环的进入和退出条件,否则造成死循环,无意义的消耗系统资源,对系统负载有影响;

  3.对于控制语句continue语句是结束本次迭代循环,进入下一轮判断,而break是结束退出当前整个循环;

原创文章,作者:xiashixiang,如若转载,请注明出处:http://www.178linux.com/38242

(0)
xiashixiangxiashixiang
上一篇 2016-08-21
下一篇 2016-08-21

相关推荐

  • 用户\组的管理

    1、用户的标识符:UID与GID   每个登录的用户都至少会识别两个ID,那么就是UID与GID(username与groupneme)当我们要显示文件属性时,系统会根据/etc/passwd与/etc/group的内容,找到id对应的账号与组名再显示出来。 /etc/passwd文件结构   他的每一行都代表一个账号,并且里面许多账号都…

    Linux干货 2016-08-04
  • CentOS 7上配置php-fpm

    CentOS 7上配置php-fpm:              httpd-2.4:rpm包默认编译支持了fcgi模块;              php-fpm包:专用于将php运行于fpm模式;   &n…

    2017-06-06
  • 软链接和硬链接的区别

    文件管理 前言 Linux的一则哲学:一切皆文件。既然入坑,那么管理linux就是管理一堆文件,操作文件这是展示个人十八般武艺的时候,功夫高下一招下。怎么成为高手,高手的招式都有哪些,拳脚掌刀枪棍棒,一招一式如何练就。 1文件存储 文件存储就好比每个练武人必备的技能——挨打,在你耍十八般武艺前,必须先扛住对方的一掌。我们不必拥有金刚罩铁布衫,至少要学会如何躲…

    Linux干货 2016-10-20
  • 上古神器之vim

    sed 前言:前面学到了文本处理三剑客之一grep,但是grep在有些时候显得力不从心,我们需要一款针对行操作的处理工具,没错,这就是sed流编辑器。 sed用法提炼: sed 's/(text1)(text2)(text3)/\1\2\3/'  vim 前言:强大的Linux如果没有一款疯狂的编辑器,常用的编辑操作会…

    Linux干货 2016-08-12
  • n28 第二周作业

    n28 第二周作业

    Linux干货 2017-12-09
  • N26-第八周

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。     网桥(birdge):工作于OSI模型中的数据链路层,是连接两个局域网的一种存储/转发设备,能将一个大的LAN分割为多个网段,或将两个以上的LAN互联为一个逻辑LAN,使LAN上的所有用户都可访问服务器,可以分割冲突域。   &nb…

    2017-03-08

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-22 09:49

    态度不够端正,发布前未进行预览,发布后代码都混在一起了。