case分支选择结构:

  case 词 in [模式 [| 模式]...) 命令 ;;]... esac

  case 变量引用 in

    模式1)

      分支1

      ;;

    模式2)

      分支2

      ;;

    ...

    *)

      默认分支

      ;;

  esac


模式(PATTERN):

  1.普通的文本字符

  2.globbing风格的通配符:

    *:任意长度任意字符

    ?:任意的单个字符

    []:范围内的任意单个字符

    [^]:范围外的任意单个字符

  3.|:或


写一个脚本:

  提示用户输入信息,然后判断用户输入的信息是否合法;


#!/bin/bash

#

read -p "Please make your choice[yes of no]: " CHOICE


case $CHOICE in

  yes)

    echo "right." 

    ;;

  no)

    echo "wrong."

    ;;

  *)

    echo "Unknown."

    ;;

esac


if CONDITION1 ; then

  STATEMENT

elif CONDITION2 ; then

  STATEMENT

elif CONDITION3 ; then

  STATEMENT

...

else

  STATEMENT

fi


if的多分支结构和case的分支结构之间的区别:

  相同点:

    1.都是条件为真,执行对应分支的语句;条件为假,就不执行;

    2.都可以设置默认分支语句,即:所有条件都不匹配的时候,所执行的语句;


   不同点:

    1.if是根据命令的执行状态返回值来判断正确与否;case是根据变量的值的取值内容是否匹配模式来判断正确与否;

    2.case的每个分支都必须使用';;'结束;



管理用户账户的脚本,第四版:利用case语句实现

#!/bin/bash

#

if [ $# -lt 2 ] ; then

  echo "Usage: $(basename $0) -a User1,User2,...,UserN | -d User1,User2,...,UserN."

  exit 5

fi


case $1 in

  -a)

    for I in $(echo $2 | tr ',' ' ') ; do

      if id $I &> /dev/null ; then

        echo "$I exists already."

      else

        useradd $I

        echo $I | passwd --stdin $I &> /dev/null

        echo "Create $I successfully."

      fi

    done

  ;;

  -d)

    for J in $(echo $2 | tr ',' ' ') ; do

      if id $J &> /dev/null ; then

        userdel -r $J

        echo "Delte $J finished."

      else

        echo "User $J does not exist."

      fi

    done

  ;;

  *)

    echo "Usage: $(basename $0) -a User1,User2,...,UserN | -d User1,User2,...,UserN."

    exit 6

esac


while

  while 命令; do 命令; done

  while CONDITION ; do

    循环体

  done

    进入循环条件:CONDITION一直为真;

    退出循环条件:CONDITION为假;


until

  until 命令; do 命令; done

  until CONDITION ; do

    循环体

  done

    进入循环条件:CONDITION一直为假;

    退出循环条件:CONDITION为真;


while CONDITION ; do CMD ; done 

相当于 

until ! CONDITION ; do CMD ; done


注意:对于while和until两个循环结构来讲,如果要实施变量增量操作,必须手动给出;


利用while和until循环结构,计算100以内所有整数的和;

#!/bin/bash

#

declare -i I=1

while [ $I -le 100 ] ; do

  let SUM+=$I

  let I++

done

echo $SUM


#!/bin/bash

#

declare -i I=1

until [ $I -gt 100 ] ; do

  let SUM+=$I

  let I++

done

echo $SUM


循环控制语句:

  continue

  break


continue:

  continue [n]

  提前结束第n层的本次循环,直接进入下一轮条件判断,若符合循环进入条件,则开启下一轮循环;


break:

  break [n]

  提前技术第n层循环;不再继续后续循环;


无限循环用法:

while true ; do

  循环体

done


until false ; do

  循环体

done


在此类的循环结构中,必须适当的使用continue和break,以保证循环不会一直持续下去;


能够实现遍历功能的while循环和until循环;

while read LINES ; do

  循环体

done < /PATH/FROM/SOMEFILE


until ! read LINES ; do

  循环体

done < /PATH/FROM/SOMEFILE


select

  select循环主要用于创建一个菜单式列表,供用户进行选择;

  列表是按照数字顺序排列的,我们只要选择数字即可;


  一般来讲,select与case一起使用;


  select是一个无限循环结构,因此,必须在循环体中使用break命令以退出循环,或者可以使用exit命令直接终止脚本运行;


  select NAME [in 词语 ... ;] do 命令; done


  select NAME [in LIST] ; do

    命令

  done


总结:

  shell脚本编程语言:

    过程式编程语言

      顺序:主体结构

      选择:

        if

          单

          双

          多

        case

      循环

        for

          遍历列表:

          控制变量

        while

        until

        select


编写个shell脚本将/usr/local/test目录下大于100k的文件转移到/tmp目录下。


#!/bin/bash

#

FPATH="/usr/local/test"

DEST=/tmp

for i in $FPATH/* ; do

  if [ -f $i ] ; then

    if [ $(wc -c < $i) -gt 102400 ] ; then

      ls -l $i

    fi

  fi

done