分支语句,用于根据条件进行分支处理。是shell脚本常用的语句,如根据配置选项开启或者关闭某些功能执行,根据用户的输入控制脚本执行流程等。常见的分支语句有if、case两种,下面进行详细说明。分支语句if
1. if语句格式
if可以用于根据条件进行分支处理,如检测某个脚本,库或目录不存在,执行其它分支。
对于if的格式如下所示。
#if语句格式
if [ command ]; then
statement
elif [ command ]; then # elif可多个,也可以不存在
statement
else
statement
fi
其中command主要包含如下部分.
# 文件或者目录判断
[ -a FILE ] 如果文件存在则为真
[ -b FILE ] 文件存在,且为块设备文件
[ -c FILE ] 文件存在,且为字符设备文件
[ -d FILE ] 如果文件存在且是一个目录则返回为真
[ -e FILE ] 如果指定的文件或目录存在时返回为真
[ -f FILE ] 如果文件存在且是一个普通文件则返回为真
[ -L FILE ] 判断文件存在且为软链接设备
[ -p FILE ] 判断文件存在且为命名管道
[ -r FILE ] 如果文件存在且是可读的则返回
[ -s FILE ] 文件存在且大小非空
[ -w FILE ] 如果文件存在且是可写的则返回为真
[ -x FILE ] 如果文件存在且是可执行的则返回为真
[ file1 -ef file2 ] 文件使用相同设备,inode编号则为真
[ file1 -nt file2 ] file1比file2更新,或仅file2不存在时为真
[ file1 -ot file2 ] file1比file2更旧,或仅file2不存在时为真
# 字符串判断
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ] 如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真
# 数值判断
[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真
[ INT1 -gt INT2 ] INT1大于INT2返回为真
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真
[ INT1 -lt INT2 ] INT1小于INT2返回为真
[ INT1 -le INT2 ] INT1小于等于INT2返回为真
# 逻辑判断
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ EXPR ] || [ EXPR ] 用OR来合并两个条件
[ EXPR ] && [ EXPR ] 用AND来合并两个条件
2. if语句应用
基于上述命令配合,下面展示一些常用的命令组合。
# 检测目录是否在PATH中
echo $PATH
if [ -d "$1" ] && echo $PATH | grep -E -q "(^|:)$1($|:)"; then
echo "directory $1 in PATH"
else
echo "directory $1 not in PATH"
fi
# 可以使用iftest condition, 等同于 if [ condition ]
if test -f "file.c"; then
echo "file exist!"
fi
# 使用if...elif..else结构
read -p "timeofday" timeofday
if [ "$timeofday" == "0" ]; then
echo "morning"
elif [ "$timeofday" == "1" ]; then
echo "afternoon"
else
echo "sorry"
exit 1
fi
exit 0
分支语句case
1. case语句格式
case则主要用于分支判断语句,和switch...case语句类似,case分支分支语句根据不同的内容执行不同的分支,格式如下。
# 分支语句格式
case variable in
pattern1)
command1
;;
pattern2)
command2
;;
#......
esac
关于上述语句中的变量说明。
variable: 分支语句判断的输入变量。
pattern1: 具体判断分支相等适配的参数。
commandx: 执行的命令。
2. case语句应用
基于上述格式,下面展示case的应用。
# 执行不同的分支处理
case "$BUILD_OPT" in
"u-boot")
compile_uboot
;;
"kernel")
compile_kernel
;;
"rootfs")
compile_kernel
create_rootfs
;;
"image")
compile_uboot
compile_kernel
create_rootfs
do_pack
;;
*)
echo "sorry, input not valid"
;;
esac