多分支語句之case,及shift使用

    有時候一個長的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"



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章