语法
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
处理大小写的问题
在上面的例子,我们匹配的是sync,如果用输入的是 Sync将会导致失败。
解决方法1 将模式转换为小写
使用tr命令,可以将shell字符串转换为小写。
例如:
echo "TeSt" | tr '[:upper:]' '[:lower:]' var="TesT" tr '[:upper:]' '[:lower:]' <<<"$var" # 所以将 opt= 改成: opt=$( tr '[:upper:]' '[:lower:]' <<<"" )
解决方法2 在模式中使用正则表达式
将表达式分别改为
[Ss][Qq][Ll]) ... [Ss][Yy][Nn][Cc]) ... [Tt][Aa][Rr])
解决方法3 匹配时不区分大小写
设置nocasematch选项即可
如何启用nocasematch选项?
执行shopt -s nocasematch即可。
如何关闭nocasematch选项?
执行shopt -u nocasematch即可。
所以我们的脚本可以改成:
#!/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: #!/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
{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
示例
#!/bin/bash NOW=$(date +"%a") case $NOW in Mon) echo "全备";; Tue|Wed|Thu|Fri) echo "增量备份";; Sat|Sun) echo "不做备份";; *) ;; esac
在case中使用多个模式
#!/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: ##代码## {sql|sync|tar}"
echo " sql : Run mySQL backup utility."
echo " sync : Run web server backup utility."
echo " tar : Run tape backup utility." ;;
esac
如果我们要使用shell写备份脚本,就可以这样写,很直观
##代码##case语句可以用于多级if-then-else-fi语句。它也能够将一个变量和多个值进行比较。
日期:2019-04-16 23:59:05 来源:oir作者:oir
