有時候一個長的if語句會讓一個程序變得非常難讀,有了case後,可以使case語句變得更加簡潔
case語法格式如下:
case expression in pattern1) suite1 ;; pattern2) suite2 ;; ... patternn) suiten ;; *) other_suite ;; esac
case中各pattern可以使用模式:
a|b: a或者b
*:匹配任意長度的任意字符;
?:匹配任意單個字符;
[-]:範圍匹配
使用示例:
寫一個腳本,接受如此格式
script.sh {start|stop|restart|status}
1、如是start,那麼創建/var/lock/subsys/script.sh,顯示啓動成功;
2、如果參數是stop,則刪除/var/lock/subsys/script.sh,顯示停止成功
3、如果restart,則刪除,再創建,顯示成功;
4、如果status, 如果文件存在,則顯示running,否則,顯示stopped
#!/bin/bash script=$0 lockfile=/var/lock/subsys/script.sh [ $# -lt 1 ] && echo "usage: $script {start|stop|restart|staus}" && exit 6 case $1 in start) touch $lockfile echo "$script service start" ;; stop) rm -f $lockfile echo "$script service stop" ;; restart) rm -f $lockfile touch $lockfile echo "$scrtip service restart" ;; status) if [ -f $lockfile ];then echo "$script service is running" else echo "$script service is stop" fi ;; *) echo "usage: $script {start|stop|restart|staus}" ;; esac
寫一個簡單腳本
1、提示用戶輸入一個任意字符;
2、能判斷此字符是數字、字母或特殊字符;
#!/bin/bash # while true;do read -p "enter a char: " char [[ "$char" == "quit" ]] && exit 8 case $char in [1-9]) echo "$char is digit" ;; [a-z]) echo "$char is letter" ;; *) echo "special" esac done
寫一個腳本,能對/etc/目錄進行打包備份,備份位置爲/backup/etc-日期.後綴
1、顯示如下菜單給用戶:
xz) xz compress
gzip) gzip compress
bip2) bzip2 compress
2、根據用戶指定的壓縮工具使用tar打包壓縮;
3、默認爲xz;輸入錯誤則需要用戶重新輸入;
#!/bin/bash # dir="/etc/*" bak="/backup/etc-" [ -d backup ] || mkdir /backup cat << EOF xz) xz compress gzip) gzip compress bzip2) bzip2 compress EOF while true;do read -p "please enter a tool: " tools tools=${tools:-xz} case $tools in xz) backuptools=J end=xz break ;; gzip) backuptools=z end=gz break ;; bzip2) backuptools=j end=bz2 break ;; *) echo "wrong option,please enter again" esac done tar -c${backuptools}f ${bak}`date +%F-%T`.$end $dir
寫一個腳本,完成如下功能
說明:此腳本能夠爲指定網卡創建別名,指定地址;使用格式:mkethalias.sh -v|--verbose -i|--interface ethX
1|-i選項用於指定網卡;
2、如果網卡存在:在命令行,請用戶指定一個別名;
3、讓用戶指定IP和掩碼;
4、用戶可以同時使用-v或--verbose選項:如果使用了,則在配置完成後,顯示配置結果;否則,則不予顯示;
#!/bin/bash # debug=0 [ $# -lt 1 ] && echo "usage: $0 {-v|--verbose -i|--interface ethX}" while [ $# -ge 1 ];do case $1 in -v|--verbose) debug=1 shift 1 ;; -i|--interface) interface=$2 shift 2 ;; *) echo "usage: $0 {-v|--verbose -i|--interface ethX}" shift $* ;; esac done #echo "$interface $debug" if ! ip link show $interface &> /dev/null;then echo "networkcard no such" exit 6 fi read -p "please enter network_alias: " network_alias read -p "please enter IPaddr: " IPaddr read -p "please enter netmask: " netmask ip addr add dev $interface ${IPaddr}/${netmask} label $network_alias [ "$debug" -eq 1 ] && ip addr show $interface || echo "setup successfuly"