bash 脚本编程之二 条件判断

时间:2022-03-31 21:32:13
  1. bash中如何实现条件判断

条件判断类型:

    整数判断(双目判断):

        -eq:等于 、equal,测试两个整数之间是否相等,比如$A -eq $B

        -gt:大于、greater than

        -lt:小于、lesser than

        -ne:不等于、no  equal

            这里也可以用另外一种写法,比如[ 2 -ne 3 ]可以写作[ ! 2 -eq 3 ]

        -le:小于或等于、lesser or equal

        -ge:大于等于、greater or equal

        ...

    字符判断:

    文件判断:单目判断

        -e:exist判断文件是否存在

        -d:directory判断文件是否为目录

        -r:read 判断文件是否可读

        -w:write ...........可写

        -x:Executable...........可执行

        ...

    

条件判断的表达式:

    [ expression ] 

        注意[] 最左和左右需要空格,这里linux把表达式当成命令来判断

    [[ expression ]]

        同样需要注意空格,这里linux把表达式当成关键字来判断,至于两者区别,暂时存疑    

    test  expression 


命令间的逻辑关系:

    逻辑与:&&

        使用逻辑与的时候,当第一个条件判断为假,则后面条件不再判断

    逻辑或:||

        使用逻辑或的时候,当第一个条件判断为真,则后面条件不再判断

    逻辑非:!

        对条件判断结果进行取反

示例:

如果用户user1不存在,则添加user1

[root@logstach ~]# id user1 

id: user1: No such user

[root@logstach ~]# ! id  user1 &> /dev/null &&  useradd user1 &> /dev/null

[root@logstach ~]# id  user1

uid=3001(user1) gid=3001(user1) groups=3001(user1)

或者

id  user1|| useradd user1


如果/etc/inittab文件的行数大于100,就显示'large file'

[ `wc -l  /etc/inittab |cut -d' ' -f1 ` -gt 100 ] && echo  "large file"


变量的命令规则:

    只能用数字、字母和下划线组成

    不能用数字开头

    不应该与系统环境变量重名

    最好做到见名知义


练习:

如果用户存在,就显示已经存在,否则添加此用户

id  user1 && echo 'user exists!' || useradd user1 


如果用户不存在就添加,否则显示已经存在

!id user1&&useradd user1 ||echo 'user1  already exists!' 


如果用户不存在,添加并给其与用户名同名的密码,否则显示其已经存在。

id  user1 && echo 'user already exists!'|| useradd user1 && echo ‘user1'|passwd user1 --stdin


[root@logstach ~]# id  user1 && echo 'user ?already exists!' || useradd user1 && echo 'user1'|passwd user1 --stdin

uid=3001(user1) gid=3001(user1) groups=3001(user1)

user ?already exists!

Changing password for user user1.

passwd: all authentication tokens updated successfully.

[root@logstach ~]# id  user1 && ?echo 'user ?already exists!' ||( useradd user1 && echo 'user1'|passwd user1 --stdin)

uid=3001(user1) gid=3001(user1) groups=3001(user1)

user ?already exists!

[root@logstach ~]# 


注意:这里如果不加()的话,当shell执行到||时不执行useradd user1,但是它会继续往下读,到第二个&&时,把前面 id  user1 && echo 'user ?already exists!' || useradd user1当成一个整体,发现整体结果为真,则继续执行后面的内容passwd user1 --stdin。加()可以告诉shell,

useradd user1 && echo 'user1'|passwd user1 --stdin是一个整体。


练习:写一个脚本,完成以下要求:

    添加3个用户user1、user2、user3,但要先判断用户是否存在,不存在而后再添加

    添加完成后,显示最后添加了哪几个用户,当然,不能包含已经存在而没有添加的

    最后显示系统上有几个用户。

#!/bin/bash

! id  user1 &> /dev/null &&  useradd user1 && echo 'useradd user1'

! id  user2 &> /dev/null &&  useradd user2 && echo 'useradd user2'

! id  user3 &> /dev/null &&  useradd user3 && echo 'useradd user3'

TOTAL=`cat /etc/passwd|wc -l`

echo  "$TOTAL users."


练习:写一个脚本,完成以下要求:

给定一个用户:

    如果uid为0就显示为管理员

    否则,就显示其为普通用户

#!/bin/bash

USER=user1

USERID=`grep $USER /etc/passwd|cut -d: -f3`

[ $USERID -eq 0 ] && echo "administrator!" || echo  "common user."


条件判断,控制结构:

单分支if语句:

if 判断条件;then

    statement1

    statement2

    ..

fi

     then如果另起一行,则;可以省略,否则不行


双分支if语句:

if  判断条件;then

    statement1

    statement2

    ...

else

    statement1

    statement2    

    ...

fi


多分支if语句:

if  判断条件1;then

    statement1

    ...

elif 判断条件2;then

    statement2  

    ...

elif 判断条件3;then

    statement3

    ....

else

    statement4

    ...

fi



if  ls /var ...和if `ls  /var` ...的区别:

    if ls /var 会根据命令的执行状态结果进行判断,0为真,1-255为假,而if `ls  /var`则会报错,因为 `ls  /var`返回的是命令的执行结果,if 不能对其进行判断,但是如果添加条件使其能满足条件判断的条件,则可以进行判断,例如:

    if  [ `ls  /var|wc -l` -gt 20 ];then 

        echo 'large directory'

    fi

     


本文出自 “单季稻” 博客,转载请与作者联系!