if…else…分支语句
if…else分支语句的语法格式
if和then分别占独立的一行
1. if语句
if ((条件表达式))
then
shell语句
fi
2. if...else语句
if ((条件表达式))
then
shell语句
else
shell语句
fi
3. if ... elif...else语句
if ((条件表达式))
then
shell语句
elif ((条件表达式))
then
shell语句
elif ((条件表达式))
then
shell语句
......
else
shell语句
fi
if和then分别可以写到一行,之间需要添加一个;
1. if语句
if ((条件表达式)) ; then
shell语句
fi
2. if...else语句
if ((条件表达式)) ; then
shell语句
else
shell语句
fi
3. if ... elif...else语句
if ((条件表达式)) ; then
shell语句
elif ((条件表达式))
then
shell语句
elif ((条件表达式)) ; then
shell语句
......
else
shell语句
fi
测试代码
成功终端输入一个成绩,对输入的成绩按照A,B,C,D,E进行分类。
#!/bin/bash
# your code
read -p "请从终端输入你的成绩 > " score
if (( $score > 100 || $score < 0)) ; then
echo "输入的成绩不合理,请重新输入新的成绩"
exit
fi
if (($score >= 90))
then
echo "$score 分为A等级"
elif (($score >= 80))
then
echo "$score 分为B等级"
elif (($score >= 70))
then
echo "$score 分为C等级"
elif (($score >= 60))
then
echo "$score 分为D等级"
else
echo "$score 分为E等级"
fi
test命令的使用
test命令的介绍
1. test是一个shell命令,可以使用man test查看test命令的帮助手册。
2. test命令也可以用于字符串的判断和比较,整数的判断,文件类型的判断,
test命令将此和if语句配合使用。
test命令也可以写成"[]", 中括号最终表示的就是test命令。
3. test命令的使用格式
if test 表达式 <=等价=> if [ 表达式 ]
then then
shell语句 shell语句
fi fi
if test 表达式 <=等价=> if [ 表达式 ]
then then
shell语句 shell语句
else else
shell语句 shell语句
fi fi
if test 表达式 <=等价=> if [ 表达式 ]
then then
shell语句 shell语句
elif test 表达式 elif [ 表达式 ]
then then
shell语句 shell语句
else else
shell语句 shell语句
fi fi
注意事项:
1. 表达式如何书写要根据test命令的man手册要求进行书写
2. 在test命令或者[]使用的运算符或者变量或者参数前后必须添加空格。
3. 在test命令或者[]中使用其他变量时,必须使用$符引用变量
4. 在test命令或者[]中部分运算符需要进行转义,\( \) \> \< ....
5. teset命令经常和if语句配合使用,进行字符串,整数,文件类型的判断。
表达式成立返回真,不成立返回假。
字符串对象的比较
字符串对象(⼀定要注意在进⾏字符串的判断的时候都需要加上“”,“$a” "hello")
-z 判断字符串是否为空 ----> 为空返回真,非空返回假
-n 判断字符串是否为⾮空 ---> 非空为真,空为假
=或== 都是⽤来判读字符串是否相等 ---> 成立返回真,不成立返回假
!= 不等于 ---> 成立返回真,不成立返回假
\> ⼤于 (防⽌误认为重定向) ---> 成立返回真,不成立返回假
\< ⼩于 ---> 成立返回真,不成立返回假
表达式的格式:
[ -z STRING ] <====> test -z STRING
[ STRING1 = STRING2] <====> test STRING1 = STRING2
逻辑运算
-a ---> 逻辑与运算(&&)
-o ---> 逻辑或运算(||)
! ---> 逻辑非运算(!)
案例:通过终端输入两个字符串,判断两个字符串是否相等,大于,小于?
#!/bin/bash
# your code
read -p "请输入第一个字符串" str1
read -p "请输入第二个字符串" str2
# 判断两个字符串是否为空,如果为空退出
if [ -n "$str1" -a -n "$str2" ]
then
echo "str1 和 str2 字符串为非空"
else
echo "str1 和 str2 字符串至少有一个为空"
exit
fi
# 对str1和str2字符串进行判断
if [ "$str1" == "$str2" ] ; then
echo "str1 和 str2 字符串相等"
elif [ "$str1" \> "$str2" ] ; then
echo "str1 大于 str2 字符串"
elif [ "$str1" \< "$str2" ] ; then
echo "str1 小于 str2 字符串"
fi
练习题:修改以上代码,将[]替换为test命令, 使用-z判断字符串是否为空。
#!/bin/bash
# your code
read -p "请输入第一个字符串" str1
read -p "请输入第二个字符串" str2
# 判断两个字符串是否为空,如果为空退出
if test -z "$str1" -o -z "$str2"
then
echo "str1 和 str2 字符串至少有一个为空"
exit
else
echo "str1 和 str2 字符串为非空"
fi
# 对str1和str2字符串进行判断
if test "$str1" == "$str2" ; then
echo "str1 和 str2 字符串相等"
elif test "$str1" \> "$str2" ; then
echo "str1 大于 str2 字符串"
elif test "$str1" \< "$str2" ; then
echo "str1 小于 str2 字符串"
fi
#!/bin/bash
# your code
read -p "请输入第一个字符串" str1
read -p "请输入第二个字符串" str2
# 判断两个字符串是否为空,如果为空退出
# 如果两个表达式在使用一个test([])命令进行逻辑判断使用-a或-o
if [ -n "$str1" -a -n "$str2" ]
then
echo "str1 和 str2 字符串为非空"
else
echo "str1 和 str2 字符串至少有一个为空"
exit
fi
# 如果两个test([])命令进行逻辑判断使用&&或||
if [ -n "$str1" ] && [ -n "$str2" ]
then
echo "str1 和 str2 字符串为非空"
else
echo "str1 和 str2 字符串至少有一个为空"
exit
fi
# 对str1和str2字符串进行判断
if [ "$str1" == "$str2" ] ; then
echo "str1 和 str2 字符串相等"
elif [ "$str1" \> "$str2" ] ; then
echo "str1 大于 str2 字符串"
elif [ "$str1" \< "$str2" ] ; then
echo "str1 小于 str2 字符串"
fi
整数对象的比较
-eq : 相等
-ne : 不相等
-gt : 大于
-ge : 大于等于
-lt : 小于
-le : 小于等于
表达式的格式:
[ INTEGER1 -eq INTEGER2 ] <=等价于=> test INTEGER1 -eq INTEGER2
案例:
从终端输⼊⼀个学⽣的成绩,判断它是A,B,C,D,E
[90-100] A
[80-89] B
[70-79] C
[60-69] D
<60 E
#!/bin/bash
# your code
read -p "请输入你的成绩 > " score
if [ \( $score -gt 100 \) -o \( $score -lt 0 \) ] ; then
echo "你输入的成绩不合法,请重新输入"
exit
fi
if [ $score -ge 90 ] ; then
echo "A"
elif [ $score -ge 80 ] ; then
echo "B"
elif [ $score -ge 70 ] ; then
echo "C"
elif [ $score -ge 60 ] ; then
echo "D"
else
echo "E"
fi
文件类型的判断
-b filename 判断⽂件是否存在,是否是块设备
-c filename 判断⽂件是否存在,是否是字符设备
-d filename 判断⽂件是否存在,是否是⽬录
-f filename 判断⽂件是否存在,是否是普通⽂件
-p filename 判断⽂件是否存在,是否是管道⽂件
-L filename 判断⽂件是否存在,是否是链接⽂件 (经测试链接⽂件也是普通⽂件)
-S filename 判断⽂件是否存在,是否是套接字⽂件
-e filename 判断⽂件是否存在
-s filename 判断⽂件是否存在,判断⽂件是否为空
表达式的格式:
[ -b FILENAME ] <===> test -b FILENAME
案例:执行脚本文件名时,传递判断文件的名字,判断文件是普通文件还是目录?
#!/bin/bash
# your code
if [ $# -ne 1 ] ; then
echo "执行脚本文件时,传递的参数不合法,请重新执行脚本文件,并给脚本文件传递参数"
echo "usage : $0 判断文件的名字及对应的路径"
exit
fi
if [ -e $1 ] ; then
echo "$1 文件存在"
if [ -f $1 ] ; then
echo "$1 是一个普通的文件"
elif [ -d $1 ] ; then
echo "$1 是一个目录"
else
echo "$1既不是普通文件也不是目录"
fi
else
echo "$1 文件不存在"
fi
文件权限的判断
-r filename 判断⽂件是否存在,是否有可读权限
-w filename 判断⽂件是否存在,是否有可写权限
-x filename 判断⽂件是否存在,是否有可执⾏权限
表达式的格式:
[ -r FILENAME ] <====> teset -r FILENAME
案例:
执行脚本文件时,传递一个脚本文件名字的参数,如果脚本文件没有可执行的权限,
添加对应的可执行的权限。
#!/bin/bash
# your code
if [ $# -ne 1 ] ; then
echo "执行脚本文件时,传递的参数不合法,请重新执行脚本文件,并给脚本文件传递参数"
echo "usage : $0 判断脚本文件的名字及对应的路径"
exit
fi
if [ -x $1 ] ; then
echo "$1 具有可执行的权限"
else
echo "$1 不具有可执行的权限"
chmod a+x $1
echo "$1 添加可执行权限完成"
fi
文件时间戳判断
filename1 -nt filename2 : 判断filename1文件比filename2文件的时间新
filename1 -ot filename2 : 判断filename1文件比filename2文件的时间旧
filename1 -ef filename2 : 判断filename1文件比filename2文件的inode是否⼀致
表达式的格式:
[ filename1 -nt filename2 ] <====> test filename1 -nt filename2
案例:执行脚本文件时,传递两个文件的名字,判断两个文件的时间戳。
#!/bin/bash
# your code
if [ $# -ne 2 ] ; then
echo "执行脚本文件时,传递的参数不合法,请重新执行脚本文件,并给脚本文件传递参数"
echo "usage : $0 判断文件的名字及对应的路径 判断文件的名字及对应的路径"
exit
fi
if [ $1 -nt $2 ] ; then
echo "$1 文件的时间戳比 $2 文件的时间戳新"
elif [ $1 -ot $2 ] ; then
echo "$1 文件的时间戳比 $2 文件的时间戳旧"
fi
综合案例
练习:
1.执行脚本文件时,给脚本文件传递一个文件的名字,
判断⽂件是否是普通⽂件,判断文件是否为脚本文件,
如果为脚本文件,判断脚本文件是否具有可执行的权限,
如果没有可执行的权限则添加可执行的权限。
如何判断文件是否为脚本文件,使用file命令查看文件的属性,
linux@ubuntu:~/shell/day04$ file 01test.sh
01test.sh: Bourne-Again shell script, UTF-8 Unicode text executable
然后再使用cut命令将shell字符串截取出来,和“shell”字符串进行比较。以空格为分隔符
#!/bin/bash
# your code
if [ $# -ne 1 ] ; then
echo "执行脚本文件时,传递的参数不合法,请重新执行脚本文件,并给脚本文件传递参数"
echo "usage : $0 判断脚本文件的名字及对应的路径"
exit
fi
if [ $1 == "help" ] ; then
echo "usage : $0 判断脚本文件的名字及对应的路径"
exit
else
if [ -f $1 ] ; then
echo "$1 文件存在并且为普通文件"
fileType=`file $1 | cut -d " " -f 3`
if [ $fileType == "shell" ] ; then
echo "$1 文件是一个脚本文件"
if [ -x $1 ] ; then
echo "$1 文件具有可执行的权限"
else
echo "$1 文件不具有可执行的权限"
chmod a+x $1
echo "$1 文件添加可执行权限完成"
echo `ls $1 -l`
fi
else
echo "$1 文件不是一个脚本文件"
fi
else
echo "$1 不是普通的文件"
fi
fi