本文索引:
- shell脚本中的逻辑判断
- 文件目录属性判断
- if特殊用法
- case判断
Shell脚本中的逻辑判断
if条件语句的三种格式
- 格式1
# if 语句; then 语句; fi
if 条件
then
语句
fi
# if [ 3 -gt 2 ];then echo "ok"; fi
# []内需要保持空格
- 格式2
if 条件
then
语句
else
语句
fi
# if [ 3 -gt 2 ]; then echo ok; else echo "not ok"; fi
- 格式3
if 条件
then
语句
elif
语句
else
语句
fi
使用sh -x 脚本,可以查看执行到哪一步
shell中逻辑判断表达式
# shell中的判断表达式需要使用-gt等代替>等
> --> -gt
< --> -lt
>= --> -ge
<= --> -le
== --> -eq
!= --> -ne
多条件
- 与 &&
if [ $a -gt 4 ] && [ $a -lt 10 ]
then
echo True
else
echo False
fi
- 或 ||
if [ $a -gt 10 ] && [ $a -lt 5 ]
then
echo True
else
echo False
fi
文件目录属性判断
在shell中,常常需要对文件、目录的权限、是否存在做出判断。
- 是否是普通文件,且存在 [ -f file ]
- 是否是目录,且存在 [ -d dir ]
- 文件或目录是否存在 [ -e file/dir ]
- 是否可读 [ -r file/dir ]
- 是否可写 [ -w file/dir ]
- 是否可执行 [ -x file/dir ]
在上面的-d等前面加上!表示取反,如[ ! -f file ]表示匹配文件不存在
配合&&和||实现代码精简
- && 在前一个语句执行正确后才会执行后面的操作
[ -f file ] && touch file
- || 在前一个语句执行失败后才会执行后面的操作
[ -d dir ] || mkdir dir
if特殊用法
- 判断变量的值是否为空 [ -z "$var" ]
[root@castiel-Lu shell]# var=
[root@castiel-Lu shell]# [ -z $var ] && echo empty
empty
- 判断变量的值是否非空 [ -n "$var" ]
[root@castiel-Lu shell]# [ -n $var ] && echo not empty
not empty
[root@castiel-Lu shell]# if [ -n file1 ]; then echo "file1 is not empty."; fi
file1 is not empty.
-z参数无法作用在文件上,只能作用于变量。如果要判断文件是否为空,可以对文件进行行数计算并赋值给新变量:n=`wc -l file`,再对n进行判断即可。
- 将命令作为判断条件
# grep -q选项可以将过滤结果不进行输出
[root@castiel-Lu shell]# if grep -wq 'root' /etc/passwd; then echo "User root exist."; fi
User root exist.
# 配合!取反实现另外条件的判断
- (()) 等同于 []
# shell中可以在(())中进行关系判断,与[]不同的是,(())中使用>等正常表达式,[]中使用不能使用>等,只能使用-gt等替代。
[root@castiel-Lu shell]# if (( 3 > 2 )); then echo True; fi
True
[root@castiel-Lu shell]# if [ 3 -gt 2 ]; then echo True; fi
True
case判断
- 格式
case 变量名 in
value1)
command
;;
value2|value3|value4) //可以多个值执行一种命令
command
;;
*)
command
;;
esac
- case实例
# 用户输入一个分数,判断分数是否及格/优秀
#!/bin/bash
read -p "Please input a number: " n // 获取用户输入
if [ -z "$n" ] // 判断是否为空
then
echo "Please input a number."
exit 1 // 退出脚本,退出码为1
fi
n1=`echo $n|sed 's/[0-9]//g'` // 判断是否输入的为全数字
if [ -n "$n1" ]
then
echo "Please input a number."
exit 1
fi
// 判断分数位于什么段位
if [ $n -lt 60 ] && [ $n -ge 0 ] // 分数需要大于等于0
then
tag=1 //tag变量用于后续的case判断
elif [ $n -ge 60 ] && [ $n -lt 80 ]
then
tag=2
elif [ $n -ge 80 ] && [ $n -lt 90 ]
then
tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ] //分数需要小于等于100
then
tag=4
else
tag=0
fi
# 通过对分数进行判断进行输出
case $tag in
1)
echo "not good" // 分数在60分以下,打印not good勉励下
;;
2)
echo "it's ok" // 分数及格了,打印还不错
;;
3)
echo "good" // 优秀
;;
4)
echo "great" // 十分优秀
;;
*)
echo "The number range is 0-100." // 超出分数范围
;;
esac
执行echo $?可以返回上一步执行的退出状态码;使用sh -x命令显示代码运行过程,便于shell的改进。