一、语法格式
case 变量引用(${}) in
value1) #变量的值是value1,则执语句1,语句2,······
语句1
语句2
······
;; #每个分支结束时都需要以双分号结尾
value2) #变量的值是value2,则执语句3,语句4,······
语句3
语句4
······
;;
value3) #变量的值是value3,则执语句5,语句6,······
语句5
语句6
······
;;
*) #其他任意情况,则执行语句7,语句8,······;支持字符通配globbing,*为任意长度的任意字符;支持star|Star)这类格式;不支持正则表达式
语句7
语句8
······
;;
esac #语句以esac结束
二、练习
示例1:写一个脚本,能接受参数gzip、bzip2或xz,而后能将/etc/目录归档备份至/backup目录,并以参数指定的形式压缩存放;文件名称包含脚本执行时刻的时间
#!/bin/bash # Date: 2015-04-12 # Description: # Version: 1.0 if [ ! -e /backup ];then #这里可以用[ -d /backup ] || mkdir /backup 替代 mkdir /backup fi Command=$1 if [ -z $1 ]; then #如果脚本给定的是空值,则默认输入gzip Command=gzip fi if [ $Command == gzip ];then tar czfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.gz /etc/ [ $? -eq 0 ] && echo "Backup etc successfully.(gzip)" elif [ $Command == bzip2 ];then tar cjfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.bz2 /etc/ [ $? -eq 0 ] && echo "Backup etc successfully.(bzip2)" elif [ $Command == xz ];then tar cJfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.xz /etc/ [ $? -eq 0 ] && echo "Backup etc successfully.(xz)" else echo "Usage:`basename $0`{gzip | bzip2 | xz }." exit 5 fi
练习1:用case语句完成示例1要求
脚本1:
#!/bin/bash # Date: 2015-04-12 # Description: # Version: 1.0 if [ ! -e /backup ];then #这里可以用[ -d /backup ] || mkdir /backup 替代 mkdir /backup fi Command=$1 if [ -z $1 ]; then #如果脚本给定的是空值,则默认输入gzip Command=gzip case $Command in gzip) tar czfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.gz /etc/ [ $? -eq 0 ] && echo "Backup etc successfully.(gzip)" ;; bzip2) tar cjfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.bz2 /etc/ [ $? -eq 0 ] && echo "Backup etc successfully.(bzip2)" ;; xz) tar cJfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.xz /etc/ [ $? -eq 0 ] && echo "Backup etc successfully.(xz)" ;; *) echo "Usage:`basename $0`{gzip | bzip2 | xz }." exit 5 ;; esac
脚本2:
#!/bin/bash # Date: 2015-04-12 # Description: # Version: 1.0 if [ ! -e /backup ];then #这里可以用[ -d /backup ] || mkdir /backup 替代 mkdir /backup fi Command=$1 if [ -z $1 ]; then #如果脚本给定的是空值,则默认输入gzip Command=gzip fi case $Command in gzip) tar czfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.gz /etc/ Ret=$? ;; bzip2) tar cjfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.bz2 /etc/ Ret=$? ;; xz) tar cJfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.xz /etc/ Ret=$? ;; *) echo "Usage:`basename $0`{gzip | bzip2 | xz }." exit 5 ;; esac [ $Ret -eq 0 ] && echo "Backup etc successfully.($Command)" #通过每个循环分支的返回值
示例2:写一个脚本:可以接受一个参数,其使用形式如下:
script.sh {start|stop|restart|status}
如果参数为start,创建空文件/var/lock/subsys/script,并显示“Starting script successfully.”;
如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script finished.”;
如果参数为restart,则删除文件/var/lock/subsys/script后重新创建,并显示“Restarting script successfully.”;
如果参数为status,那么:
如果/var/lock/subsys/script文件存在,则显示为“script is running.”
否则,则显示为“script is stopped.”
其它任何参数:则显示“script.sh {start|stop|restart|status}”
#!/bin/bash # Date: 2015-04-13 # Author: ArvinLau # Description: # Version: 1.0 FileName=`basename $0` FilePath="/var/lock/subsys/$FileName" #变量替换,使用双引号 if [ $# -lt 1 ]; then echo "Usage:$0 {start | restart | stop | status}" exit 5 fi if [ $1 == start ]; then touch $FilePath echo "Starting $FileName successfully." elif [ $1 == stop ]; then rm -f $FilePath echo "Stop script finished." elif [ $1 == restart ]; then rm -f $FilePath touch $FilePath echo "Restarting script successfully." elif [ $1 == status ]; then if [ -e $FilePath ]; then echo "Script is running." elif [ ! -e $FilePath ]; then echo "Script is stopped." fi else echo "Usage:$0 {start | restart | stop | status}" exit 7 fi
练习2:用case语句完成示例2的要求
#!/bin/bash # Date: 2015-04-13 # Author: ArvinLau # Description: # Version: 1.0 FileName=`basename $0` FilePath="/var/lock/subsys/$FileName" #变量替换,使用双引号 if [ $# -lt 1 ]; then echo "Usage:$0 {start | restart | stop | status}" exit 5 fi case $1 in start) touch $FilePath echo "Starting $FileName successfully." ;; stop) rm -f $FilePath &> /dev/null echo "Stop script finished." ;; restart) rm -f $FilePath &> /dev/null touch $FilePath echo "Restarting script successfully." ;; status) if [ -e $FilePath ]; then echo "Script is running." else echo "Script is stopped." fi *) echo "Usage:$0 {start | restart | stop | status}" exit 7 ;; esac
练习3:判断当前Linux发行版是RedHat,Fedora,CentOS还是其他,
方法:取得/etc/issue文件第一行的第一个单词后进行比较
#!/bin/bash # Date: 2015-04-13 # Author: ArvinLau # Description: # Version: 1.0 Name=`head -1 /etc/issue | cut -d‘ ‘ -f1` case $Name in CentOS) echo "The system is $Name." ;; Fedora) echo "The system is $Name." ;; RedHat) echo "The system is $Name." ;; *) echo "The system is $Name or Unknown system." ;; esac