Shell if和case语法
04/19
本文最后更新于
2024年08月02日,已超过
211天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
在学习完前面Shell退出状态和test命令内容后,再来学习if语句就简单了。
if语法如下
if pipeline
then
statements1
[ elif pipeline #方括号表示可选部分
then
statements2 ]
[ else
statements3 ]
fi
if结构中使用pipeline
,可以是
- 简单的命令组合
- test命令
- 管道命令
根据命令的退出状态决定if执行分支。
示例:
if [ -f oldfile ] # 如果存在文件oldfile
then
mv oldfile newfile
fi
if语句退出状态
整个if/fi结构退出状态是真正执行的语句statements最后一个命令执行退出状态。如果没有命令执行,退出状态为0.
Shell脚本中可以使用:
冒号作为占位命令,实际不做任何事。
case语句
判断一个变量可能是多个值情况时,可以使用if/elif/elif/../fi结构来完成,但也可以使用case语句实现,更加简单明了。
题外话:在C语言中switch case语句一般比if语句效率更高,编译器可能会使用表驱动优化技术。
示例:
- 判断是工作日还是周末
#!/bin/bash
today=${1:-"Mon"}
case $today in
"Mon"|"Tues"|"Wed"|"Thurs"|"Fri")
echo today is weekday
;;
"Sat"|"Sun")
echo today is weekend
;;
*)
echo Wrong input
exit 1
;;
esac
可以使用|
支持组合多个值,相当于“或”。
可以使用*
用于前面条件都不满足情况的处理,相当于"default"。
;;
用于满足该条件的执行命令终止符。
- 下面是一个典型的解析命令行参数的shell脚本示例。
# bash内置命令getopts用于处理命令行参数
# getops optstring name
# 选项后面跟冒号: 表示该选项需要参数,开头加冒号表示允许不支持的参数,脚本仍能正常执行
while getopts ":p:c:y:l:mh" opt; do
case $opt in # opt存放getopts解析的选项,OPTARG存放带冒号选项的参数值
p)
export PREFIX=$OPTARG
;;
c)
config=$OPTARG
;;
y)
yaml=$OPTARG
;;
l)
library=$OPTARG
;;
m)
export MODULES=true
;;
h|\?|:)
usage
;;
esac
done

