Linux学习之shell2

 条件控制语句

if常见的判断逻辑运算符
-f        判断文件是否存在;
-d        判断目录是否存在;
-eq       等于,应用于整型比较 equal;
-ne       不等于,应用于整型比较 not equal;
-lt       小于,应用于整型比较 letter;
-gt       大于,应用于整型比较 greater;
-le       小于或等于,应用于整型比较;
-ge       大于或等于,应用于整型比较;
-a        双方都成立(and) 逻辑表达式 –a 逻辑表达式;
-o        单方成立(or) 逻辑表达式 –o 逻辑表达式;
-z        空字符串;
-x        是否具有可执行权限
||        单方成立;
&&        双方都成立表达式

通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断

单分支语句

    if (条件表达式);then
        语句1
    fi

双分支if 语句

  if (表达式)
        语句1
    else
        语句2
    fi

多分支条件语句

    if  (表达式);then
        语句1
    elif (表达式2);then
        语句2
    elif(表达式3;then
        语句3
    fi  

如果表达式为真,则执行命令表种的命令;否则退出if语句,即执行fi后面的语句,f和fi是条件语句的语句括号,必须成对使用。

 测试

判断文件是否存在

if [ -e $1 ] 
then
	echo "$1 存在" 
fi

[root@VM-12-14-centos ~]# ./test1.sh test.sh
 test.sh 存在

判断目录是否存在

if [ -d $1 ] 
then
	echo "$1 存在"  
else
	echo "$1 不存在"  
fi

[root@VM-12-14-centos ~]# ./test2.sh test
test 不存在

判断是文件还是目录

if  [ -e $1 ]
then
    echo "$1 是文件"
elif [ -d $1 ]
then
    echo "$1 是目录"
else
    echo "$1 都不是"
fi

[root@VM-12-14-centos ~]# ./test2.sh test.sh
test.sh 是文件
[root@VM-12-14-centos ~]# ./test2.sh gawda
gawda 都不是

注意:if和elif后面都要跟then,else不能跟then 

case语句

case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句调用格式如下

case expression in
    pattern1)
        statement1
        ;;
    pattern2)
        statement2
        ;;
    pattern3)
        statement3
        ;;
    #其他pattern情形
    *)
        statementn
esac

1.case、in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式。
2.expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以。
3.pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。有时候相近的内容作为一个pattern时,这些内容以“|”隔开,比如 y|yes|YES)。
4.如果 expression 和某个模式匹配成功,就会执行这模式后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。
5.如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句,直到遇见双分号;;或者esac才结束。最后一个分支可以写;;,也可以不写,因为无论如何,执行到 esac 都会结束整个 case in 语句。
6.最后一个分支*)并不是什么语法规定,它只是一个正则表达式,*表示任意字符串,所以不管 expression 的值是什么,*)总能匹配成功。

测试

read num
case $num in
    1)
        echo "a"
        ;;
    2)
        echo "b"
        ;;
    3)
        echo "c"
        ;;
    *)
        echo "error"
esac

[root@VM-12-14-centos ~]# ./test3.sh
1
a
[root@VM-12-14-centos ~]# ./test3.sh
2
b
[root@VM-12-14-centos ~]# ./test3.sh
666
error

case in 的 pattern 部分支持简单的正则表达式,具体来说,可以使用以下几种格式:

*	    表示任意字符串。
[abc]	表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。
[m-n]	表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。
|	    表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"

测试 

read char
case $char in
    [a-zA-Z])
        printf "\nletter\n"
        ;;
    [0-9])
        printf "\nDigit\n"
        ;;
 
    [,.?!])
        printf "\nPunctuation\n"
        ;;
    *)
        printf "\nerror\n"
esac

[root@VM-12-14-centos ~]# ./test4.sh
a

letter
[root@VM-12-14-centos ~]# ./test4.sh
5

Digit
[root@VM-12-14-centos ~]# ./test4.sh
;

error
[root@VM-12-14-centos ~]# ./test4.sh
?

Punctuation

逻辑运算符

!	非运算,表达式为 true 则返回 false,否则返回 true。

-o	或(或者)运算,有一个表达式为 true 则返回 true。

-a	与(并且)运算,两个表达式都为 true 才返回 true。	

测试 

test.sh

a=10
b=20

if [ ! $a -lt 0 ]
then
   echo "返回 true"
else
   echo "返回 false" 
fi

if [ $a -lt 20 -o $b -gt 100 ]
then
   echo "返回 true"
else
   echo "返回 false"    
fi

if [ $a -lt 20 -a $b -gt 100 ]
then
   echo "返回 true"      
else
   echo "返回 false"
fi

运行结果

[root@VM-12-14-centos ~]# ./test.sh
返回 true
返回 true
返回 false

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值