case 语句

时间:2019-04-16 23:59:05  来源:igfitidea点击:

case语句可以用于多级if-then-else-fi语句。它也能够将一个变量和多个值进行比较。

语法

case  $variable-name  in
    pattern1)       
    command1
        ...
        ....
        commandN
        ;;
    pattern2)
    command1
        ...
        ....
        commandN
        ;;            
    patternN)       
    command1
        ...
        ....
        commandN
        ;;
    *)              
esac 

或者

case  $variable-name  in
    pattern1|pattern2|pattern3)       
    command1
        ...
        ....
        commandN
        ;;
    pattern4|pattern5|pattern6)
    command1
        ...
        ....
        commandN
        ;;            
    pattern7|pattern8|patternN)       
    command1
        ...
        ....
        commandN
        ;;
    *)              
esac 

注意
每个模式pattern 后面有个 右括号)
commandN后面必须有两个分号 ;;
别漏了 esac

示例

#!/bin/bash

# 如果没有提供参数
# 那么将租赁物设置为 Unknown
if [ -z  ]
then
  rental="*** Unknown vehicle ***"
elif [ -n  ]
then
# 否则将第一个参数设置为租金物
  rental=
fi

# 使用case语句进行决策
case $rental in
   "car") echo "For $rental rental is Rs.20 per k/m.";;
   "van") echo "For $rental rental is Rs.10 per k/m.";;
   "jeep") echo "For $rental rental is Rs.5 per k/m.";;
   "bicycle") echo "For $rental rental 20 paisa per k/m.";;
   "enfield") echo "For $rental rental Rs.3  per k/m.";;
   "thunderbird") echo "For $rental rental Rs.5 per k/m.";;
   *) echo "Sorry, I can not get a $rental rental  for you!";;
esac

在case中使用多个模式

#!/bin/bash
NOW=$(date +"%a")
case $NOW in
	Mon)	
		echo "全备";;
	Tue|Wed|Thu|Fri)
		echo "增量备份";;
	Sat|Sun)	
		echo "不做备份";;
	*) ;;
esac

如果我们要使用shell写备份脚本,就可以这样写,很直观

#!/bin/bash
# 一个shell脚本,用于备份mysql, webserver和文件到磁带
opt=
case $opt in
    sql)
            echo "Running mysql backup using mysqldump tool..."
            ;;
    sync)
            echo "Running backup using rsync tool..."
            ;;
    tar)
            echo "Running tape backup using tar tool..."
            ;;
    *)
            echo "Backup shell script utility"
            echo "Usage: 
echo "TeSt" | tr '[:upper:]' '[:lower:]'

var="TesT"
tr '[:upper:]' '[:lower:]' <<<"$var"

# 所以将 opt= 改成:
opt=$( tr '[:upper:]' '[:lower:]' <<<"" )
{sql|sync|tar}" echo " sql : Run mySQL backup utility." echo " sync : Run web server backup utility." echo " tar : Run tape backup utility." ;; esac

处理大小写的问题

在上面的例子,我们匹配的是sync,如果用输入的是 Sync将会导致失败。

解决方法1 将模式转换为小写

使用tr命令,可以将shell字符串转换为小写。
例如:

[Ss][Qq][Ll])
...
[Ss][Yy][Nn][Cc])
...
[Tt][Aa][Rr])

解决方法2 在模式中使用正则表达式

将表达式分别改为

#!/bin/bash
# 一个shell脚本,用于备份mysql, webserver和文件到磁带
opt=
# 开启不区分大小写的匹配
shopt -s nocasematch
case $opt in
        sql)
                echo "Running mysql backup using mysqldump tool..."
                ;;
        sync)
                echo "Running backup using rsync tool..."
                ;;
        tar)
                echo "Running tape backup using tar tool..."
                ;;
        *)
        	    echo "Backup shell script utility"
                echo "Usage: ##代码## {sql|sync|tar}"
                echo "	sql  : Run mySQL backup utility."
                echo "	sync : Run web server backup utility."	
                echo "	tar  : Run tape backup utilty."	;;
esac

# 关闭不区分大小写的匹配
shopt -u nocasematch

解决方法3 匹配时不区分大小写

设置nocasematch选项即可

如何启用nocasematch选项?

执行shopt -s nocasematch即可。

如何关闭nocasematch选项?
执行shopt -u nocasematch即可。

所以我们的脚本可以改成:

##代码##