目录
①使用if-then语句
基本语法格式
if-then的高级特性:
②case
基本语法结构:
③test命令
数值比较
字符串比较
文件比较(重点)
>>>在shell脚本中,有一类命令会根据条件进行判断,是脚本去决定要执行哪些命令,跳过哪些命令这样的命令称为结构化命令(structured command),包括:if-then和case语句,for、while和until循环
if command #如果if语句行的命令的退出状态码值为0,then后面的命令都会被执行
then
commands
fi
或者:
if command;then
commands
fi
>>>例子:
[bei@localhost test]$ cat if.sh
#!/bin/bash
val=10
if [ $val -eq 10 ]
then
echo "val is equal 10"
fi
[bei@localhost test]$ bash if.sh
val is equal 10
>>>如果条件不成立时也要执行命令,可以使用if-then-else语句
[bei@localhost test]$ cat if.sh
#!/bin/bash
val=11
if [ $val -eq 10 ]
then
echo "val is equal 10"
else
echo "val is not equal 10"
fi
[bei@localhost test]$ bash if.sh
val is not equal 10
此时if语句行的命令的退出状态码值不为0,bash shell执行else部分的命令
>>>如果有多个条件需要判断可以使用 if-elif-else语句
[bei@localhost test]$ cat if.sh
#!/bin/bash
val=11
if [ $val -eq 10 ]
then
echo "val is equal 10"
elif [ $val -gt 10 ]
then
echo "vla is greater than 10"
else
echo "val is less than 10"
fi
[bei@localhost test]$ bash if.sh
vla is greater than 10
此时elif语句行的命令的退出状态码值为0,bash shell执行elif-then部分的命令
>>>如果需要判断脚本中的多种条件,也可以在then和else后面可以嵌套使用if-then语句
[bei@localhost test]$ cat if.sh
#!/bin/bash
val=11
if [ $val -eq 10 ]
then
echo "val is equal 10"
else
if [ $val -gt 10 ] #else后面嵌套了一个if循环
then
echo "val is greater than 10"
else
echo "val is less than 10"
fi #注意:不能忘记这个fi,因为if和fi是成对出现的
fi
[bei@localhost test]$ bash if.sh
val is greater than 10
bash shell有两个比较常用的扩展,提供了在if-then语句中使用高级特性
>>>用于数学表达式的双圆括号
>>>用于高级字符串处理功能的双方括号
>>>语法格式:((expression))
>>>双圆括号中命令符号汇总
符号 |
描述 |
val++ |
后增 |
val-- |
后减 |
++val |
先增 |
--val |
先减 |
! |
逻辑求反 |
~ |
位求反 |
** |
幂运算 |
<< |
左位移 |
>> |
右位移 |
& |
位布尔与 |
| |
位布尔或 |
&& |
逻辑与 |
|| |
逻辑或 |
举例:
[bei@localhost test]$ cat if.sh
#!/bin/bash
a=1;b=2
if (( a > 0 && b > 0 ))
then
echo "a和b都大于0"
else
echo "a或b至少一个不大于0"
fi
[bei@localhost test]$ bash if.sh
a和b都大于0
区别:&和&&
>>>10&01 ——>00
>>>10&&01——>1
双方括号:用于高级字符串处理功能
>>>使用双方括号实现了模式匹配过程
例子:如果脚本存在多个判断条件,使用if-then语句麻烦,代码冗长
[bei@localhost test]$ cat if.sh
#!/bin/bash
USER="administrator"
if [ $USER = "student" ]
then
echo "学生用户登录"
elif [ $USER = "teacher" ]
then
echo "教师用户登录"
elif [ $USER = "administrator" ]
then
echo "管理员登录"
else
echo "游客登录"
fi
[bei@localhost test]$ bash if.sh
管理员登录
此时,可以使用case语句匹配多个判断条件
case varible in
pattern1) command1;;
pattern2) command2;;
*) comands;;
esac
例子
[bei@localhost test]$ cat case.sh
#!/bin/bash
USER="administrator"
case $USER in
"student") echo "学生用户登录";;
"teacher") echo "教师用户登录";;
"administrator") echo "管理员登录";;
*) echo "游客登录";;
esac
[bei@localhost test]$ bash case.sh
管理员登录
>>>在bash shell中有一个命令 test,这个命令提供了if-then语句中测试不同条件的途径
>>>如果在test命令中列出的条件成立,test命令就会退出并返回退出状态码0
>>>如果在test命令中列出的条件不成立,test命令就会退出并返回退出状态码1
>>>只有当退出状态码为0时,then后面的代码部分才会被执行,否则执行else后面的代码部分
>>>test命令和if-then结合使用情况:
if test condition
then
commands
fi
>>>但是带上test使用方式不够简化,推荐格式 (左右方括号与condition之间各有一个空格,必须有的)
if [ condition ]
then
commands
fi
test命令判断的三种类型:
>>>数值比较
>>>字符串比较
>>>文件比较
>>>可以测试数字和变量
比较 |
描述 |
n1 -eq n2 |
判断是否n1=n2 |
n1 -ge n2 |
判断是否n1≥n2 |
n1 -gt n2 |
判断是否n1>n2 |
n1 -le n2 |
判断是否n1≤n2 |
n1 -lt n2 |
判断是否n1<n2 |
n1 -ne n2 |
判断是否n1≠n2 |
案例:
[bei@localhost test]$ cat test.sh
#!/bin/bash
val=10
if [ $val -eq 0 ]
then
echo "val=0"
elif [ $val -gt 0 ]
then
echo "val>0"
elif [ $val -lt 0 ]
then
echo "val<0"
fi
[bei@localhost test]$ bash test.sh
val>0
比较 |
描述 |
|
str1 = str2 |
判断str1是否与str2相同 |
|
str1 != str2 |
判断str1是否与str2不同 |
|
str1 \< str2 |
判断str1是否比str2小, |
必须进行转义,按照ASCII比较 而sort与ASCII排序不同, sort命令排序时,小写字母小于大写字母 |
str1 \> str2 |
判断str1是否比str2大 |
必须进行转义,按照ASCII比较 |
-n “str1” |
判断str1长度是否不为0 |
如果不是很确定一个变量的内容 |
-z “str1“ |
判断str1长度是否为0 |
|
>>>使用双方括号:实现模式匹配,字符串里的通配符 * 才能生效
例子
[bei@localhost test]$ cat if.sh
#!/bin/bash
USER="administrator"
if [[ $USER == a* ]]
then
echo "用户开头是a"
else
echo "用户开头不是a"
fi
[bei@localhost test]$ bash if.sh
用户开头是a
大于号没有转义的错误案例
[bei@localhost test]$ cat test.sh
#!/bin/bash
val1=a
val2=b
if [ $val1 > $val2 ]
then
echo "val1 is greater than val2"
else
echo "val2 is greater than val1"
fi
[bei@localhost test]$ bash test.sh
val1 is greater than val2
[bei@localhost test]$ ls -al b
-rw-rw-rw-. 1 bei bei 0 Sep 20 19:29 b
>>>此脚本把大于号解释成了输出重定向,因此,创建了一个名为b的文件,由于重定向是成功的,所以test命令返回状态码为0,then后面的命令会被执行,这种用法是错误的, <>必须进行转义
>>>测试Linux系统上文件和目录的状态
比较 |
描述 |
-d file |
检查file是否存在并且是一个目录 |
-e file |
检查file是否存在(文件或目录) |
-f file |
检查file是否存在并且是一个文件 |
-r file |
检查file是否存在并且用户具备可读权限 |
-w file |
检查file是否存在并且用户具备可写权限 |
-x file |
检查file是否存在并且用户具备可执行权限 |
-s file |
检查file是否存在并且是否为空 |
-O file |
检查file的属主是否是当前执行脚本的用户 |
-G file |
检查file的属组是否是当前执行脚本用户的基本组(不考虑附加组) |
file1 -ot file2 file1 -nt file2 |
检查file1与file2文件的新旧 |
案例
>>>检查对象是否存在,并判断是目录还是文件
[bei@localhost test]$ cat test.sh
#!/bin/bash
if [ -e /home ] #判断对象是否存在
then
echo "/home is exist"
if [ -d /home ] #判断对象是否为目录
then
echo "/home is a directory"
elif [ -f /home ] #判断对象是否为文件
then
echo "/home is a file"
fi
else
echo "/home isn't exist"
fi
[bei@localhost test]$ bash test.sh
/home is exist
/home is a directory
>>>检查file是否存在且为文件,并判断是否可读、可写、可执行
[bei@localhost test]$ cat test.sh
#!/bin/bash
file=/etc/passwd
if [ -f $file ] #检查file是否存在且为文件
then
if [ -r $file ] #检查file是否可读
then
echo "You can read $file"
else
echo "You can't read $file"
fi
if [ -w $file ] #检查file是否可写
then
echo "You can write $file"
else
echo "You can't write $file"
fi
if [ -x $file ] #检查file是否可执行
then
echo "You can excute $file"
else
echo "You can't excute $file"
fi
else
echo "the file is not exist"
fi
[bei@localhost test]$ bash test.sh
You can read /etc/passwd
You can't write /etc/passwd
You can't excute /etc/passwd
>>>检查文件所属关系和默认属组关系
[root@localhost test]# cat test.sh
#!/bin/bash
file=/etc/passwd
#使用 -O 测试你是否为文件的属主
if [ -O $file ]
then
echo "You are the owner of $file"
else
echo "You aren't the owner of $file"
fi
#使用 -G 检查你的基本组和用户的基本组是否匹配
if [ -G $file ]
then
echo "You are in the same group as $file"
else
echo "$file is not owned by your group"
fi
[root@localhost test]# bash test.sh
You are the owner of /etc/passwd
You are in the same group as /etc/passwd
>>>检查文件日期
[bei@localhost test]$ cat test.sh
#!/bin/bash
#使用-nt比较两个文件新旧
if [ ./1.txt -nt ./2.txt ]
then
echo "1.txt is newer than 2.txt"
else
echo "1.txt is older than 2.txt"
fi
[bei@localhost test]$ bash test.sh
1.txt is older than 2.txt
>>>使用复合条件测试
有两种布尔运算符:[ condition1 ] && [ condition2 ] 逻辑与:两个条件都满足,才为真,否则为假
[ condition1 ] || [ condition2 ] 逻辑或:其中一个条件满则,为真,否则为假
[bei@localhost test]$ cat test.sh
#!/bin/bash
#使用&&逻辑与复合条件测试
if [ -e ./1.txt ] && [ -e ./2.txt ]
then
echo "1.txt和2.txt都存在"
else
echo "至少1.txt或2.txt其中一个不存在"
fi
[bei@localhost test]$ bash test.sh
1.txt和2.txt都存在
说明:
>>>以上内容是本人学习的总结
>>>如还有错误,请留言,指正
>>>亦可分享自己的想法,互相学习