Linux shell编程之使用结构化命令 if语句 case语句 test命令 详解

目录

使用结构化命令

①使用if-then语句

基本语法格式

if-then的高级特性:

②case

基本语法结构:

③test命令

数值比较

字符串比较

文件比较(重点)

 


 

前言

>>>在shell脚本中,有一类命令会根据条件进行判断,是脚本去决定要执行哪些命令,跳过哪些命令这样的命令称为结构化命令(structured command),包括:if-then和case语句,for、while和until循环

 


 

①使用if-then语句

 

基本语法格式iffi成对出现)

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部分的命令

 >>>如果需要判断脚本中的多种条件,也可以在thenelse后面可以嵌套使用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

 

if-then的高级特性:

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

 

双方括号:用于高级字符串处理功能

>>>使用双方括号实现了模式匹配过程

 


 

case

例子:如果脚本存在多个判断条件,使用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
管理员登录

 


 

test命令

>>>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命令判断的三种类型:

>>>数值比较

>>>字符串比较

>>>文件比较

 

数值比较(bash shell仅处理整数

>>>可以测试数字和变量

比较

描述

n1 -eq n2

判断是否n1=n2

n1 -ge n2

判断是否n1n2

n1 -gt n2

判断是否n1>n2

n1 -le n2

判断是否n1n2

n1 -lt n2

判断是否n1<n2

n1 -ne n2

判断是否n1n2

案例:

[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比较
ASCII中,大写字母是小于小写字母的

sortASCII排序不同,

sort命令排序时,小写字母小于大写字母

str1 \> str2

判断str1是否比str2

必须进行转义,按照ASCII比较

-n str1

判断str1长度是否不为0

如果不是很确定一个变量的内容
最好在使用之前用
-n-z来测试一下变量是否含有值

-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

检查file1file2文件的新旧

案例

>>>检查对象是否存在,并判断是目录还是文件

[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都存在

 

 


 

说明:

>>>以上内容是本人学习的总结

>>>如还有错误,请留言,指正

>>>亦可分享自己的想法,互相学习

 

你可能感兴趣的:(Linux,shell编程)