【shell编程】

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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值