文章目录
shell条件测试和if语句语法
一、条件测试
1、test命令
测试表达式是否成立,若不成立返回0,否则返回其他数值,通过使用echo $?查看返回值来判断对错。
格式1: test 条件表达式
格式2: [条件表达式] //表达式需要与括号分隔
这两个格式作用是完全一样的,但是格式2更常用,条件测试的条件类型有很多,所以条件表达式根据不同类型也不同格式。常用的条件操作包括有文件测试、整数值比较、字符串比较、以及多条件的逻辑测试。
2、文件测试
文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件的权限等。
文件测试的操作选项如下:
选项 | 作用 |
---|---|
-d | 测试是否为目录(directory) |
-e | 测试目录或文件是否存在(exit) |
-f | 测试是否为文件(file) |
-r | 测试当前用户是否有读取权限(read) |
-w | 测试当前用户是否有写入权限(write) |
-x | 测试当前用户是否有可执行权限(excute) |
- b | 测试是否为设备文件 |
-c | 测试是否为字符设备文件 |
-s | 测试存在且文件大小为空 |
-L | 测试是否为链接文件 |
3、整数比较
整数值比较格式
[ 整数1 操作符 整数2 ]
注:括号需要与整数使用空格分隔
整数值比较操作符如下:
操作符 | 含义 |
---|---|
-eq | 等于(equal) |
-ne | 不等于(not equal) |
-lt | 小于(leser than) |
-gt | 大于(greater than) |
-le | 小于等于(lesser or equal) |
-ge | 大于等于(greater or equal) |
4、字符串比较
格式1 [ 字符串1 操作符 字符串2 ]
格式2 [ 选项 字符串 ]
常用的字符串比较操作符和选项
操作符/选项 | 作用 |
---|---|
= | 字符串内容是否相同 |
!= | 字符串内容是否不同 |
-z | 字符串是否为空 |
5、逻辑测试
格式1: [ 表达式 ] 操作符 [ 表达式2 ]
格式2: 表达式1 操作符 表达式2
测试命令返回值为0表示为真,1为假
操作符 | 作用 |
---|---|
-a或&& | 逻辑与 |
-o或|| | 逻辑或 |
! | 逻辑非 |
二、shell的if语句
1、单分支结构
if 条件测试 //用于判断是否执行如下操作
then 命令合集 // 多条命令组成的集合
fi // 一个if结构结束的标志
2、双分支结构
如果条件不成立,则执行else后的命令
if 条件测试 //用于判断是否执行then后的命令
then 命令集合1
else //如果上面的测试不成立,则执行else后面的命令
命令集合2
fi //结束
3、多分支结构
if 条件测试1 //如果条件1成立执行集合1,否者继续向下执行
then
命令集合1
elif 条件测试2 //如果条件1不成立,判断条件2是否成立,成立执行集合2,否则向下继续
then
命令集合2
else //如果以上条件1和条件2都不成立,则执行集合3
命令集合3
fi
4、if嵌套
if 条件测试1 //用于判断是否执行then后的命令
then
if 条件测试1-1 //用于判断是否执行如下操作
then 命令合集1
fi
else //如果上面的测试不成立,则执行else后面的命令
命令集合2
fi //结束
例题:判断是否有用户 判断一个用户是否有家目录,有打印正常,没有询问是否需要删除,如果是就删除
#!/bin/bash
# 输入用户名
read -p "请输入正确的用户名:" usr
# 判断用户是否存在
id $usr >/dev/null
if [ $? = 0 ] ; then
#从passwd中提取用户的家目录
home=$( grep "^$usr:" /etc/passwd | awk -F: '{ print $6 }' )
#查看用户的家目录是否存在
if [ -d $home ] ; then
echo "$usr正常"
else
#询问是否需要删除无家目录的用户
echo "$usr没有家目录!"
read -p "请问是否需要删除$usr?(yes or no)" f
#判断是否用户是否需要删除
if [ $f = yes ] ; then
userdel $usr
echo $usr已经被删除
fi
fi
else
#用户不存在提示
echo "$usr用户不存在,请输入已有用户!"
fi
三、case语句的结构
case多分支结构
case 变量值 in
模式1)
命令集合1
;;
模式2)
命令集合2
;;
*)
命令集合3
esac
case语句注意事项
①case行首必须以单词“in”,每一模式必须以单个右括号")"结束
②双分号";;"表示命令序列的结束
③模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以使用竖杠|表示或,比如a|b
最后的”*“)表示默认模式,其中的“*”相当于通配符
例题:使用case 定义一个shell
要求:现学校举行运动会,100米5s-6s的为超人,100米 12-15s为优秀,100米 30s以上的为不及格,其他为意外
#!/bin/bash
read -p "请输入一个成绩:" s
read -p "请输入该学生性别:" x
case "$x" in
男) //如果性别是男,则进行男生的匹配
case "$s" in
[1][0-5])
echo 优秀
;;
*)
if [ $s -gt 30 ] ; then
echo 不及格
elif [ $s -lt 10 ] ; then
echo 运动员
else
echo 意外
fi
esac
;;
女) //如果性别是女,则进行女生的规则匹配
case "$s" in
[1][1-6] )
echo 优秀
;;
*)
if [ $s -gt 30 ] ; then
echo 不及格
elif [ $s -lt 11 ] ; then
echo 运动员
else
echo 意外
fi
esac
;;
*) //如果以上都不成立,则表示性别输入错误
echo 性别不对
esac //case结构结束的标志