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
即可。
所以我们的脚本可以改成:
##代码##