zoukankan      html  css  js  c++  java
  • 《鸟哥的Linux私房菜》学习笔记(9)——条件判断

    一、条件判断表达式                                                         

    条件测试类型:

    • 整数测试
    • 字符测试
    • 文件测试

    条件测试的表达式

      [ expression ](注意expression头和尾部各有一个空格)

      [[ expression ]]

      test expression

    算术运算有三种方法:

    • let 算术运算表达式
    • $[算术运算表达式]
    • $((算术运算表达式))
    • expr 算术运算表达式
    [root@hao ~]# A=3
    [root@hao ~]# B=4
    [root@hao ~]# let C=$A+$B
    [root@hao ~]# echo $C
    7
    [root@hao ~]# D=$[$A+$B]
    [root@hao ~]# echo $D
    7
    [root@hao ~]# E=$(($A+$B))
    [root@hao ~]# echo $E
    7
    [root@hao ~]# F=`expr $A + $B`
    [root@hao ~]# echo $F
    7

    1、整数测试:

      -eq:测试两个整数是否相等 $A -eq $ eB。

    [root@hao ~]# A=3
    [root@hao ~]# B=6
    [root@hao ~]# [ $A -eq $B ]
    [root@hao ~]# echo $?
    1

      -ne:测试两个整数是否不等

      -gt:测试一个数是否大于另一个数

      -lt:小于

      -ge:大于等于

      -le:小于或等于

    语句间的逻辑关系(短路操作)

      逻辑与、逻辑或

    下面代码实现逻辑与,如果用户存在,则第一个语句为TRUE,则执行第二个语句。否则,若用户不存在,即第一个语句为false,则该逻辑与结果必为false,因此第二个语句就不会执行

    [root@hao ~]# id user1 &> /dev/null && echo "hello,test true"
    [root@hao ~]# id hao &> /dev/null && echo "hello,test true"
    hello,test true

    (1)如果用户不存在,则添加用户(用逻辑与、逻辑或两种方法实现)

    [root@hao ~]# id user2
    id: user2: No such user
    [root@hao ~]# id user2 &> /dev/null || useradd user2
    [root@hao ~]# id user2
    uid=5002(user2) gid=5002(user2) groups=5002(user2)
    [root@hao ~]# id user3
    id: user3: No such user
    [root@hao ~]# ! id user3 &> /dev/null && useradd user3
    [root@hao ~]# id user3
    uid=5003(user3) gid=5003(user3) groups=5003(user3)

     (2)如果一个文件的行数大于100,则显示该文件为大文件,否则显示为小文件

    #!/bin/bash
    LINES=$(wc -l /etc/inittab)
    echo $LINES
    FINLINES=`echo $LINES |cut -d' ' -f1`
    echo $FINLINES
    [ $FINLINES -gt 100 ]&& echo "etc/inittab is a big file" || echo "etc/inittab is a small file"

    执行结果为:

    26 /etc/inittab
    26
    etc/inittab is a small file

    (3)如果用户存在,则显示该用户,如果用户不存在,则添加此用户

    [root@hao ~]# id user1 && echo "user1 exits." || useradd user1
    uid=5001(user1) gid=5001(user1) groups=5001(user1)
    user1 exits.

    (4)如果用户不存在,则添加用户并添加密码,如果存在,则显示用户已存在

    [root@hao ~]# ! id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exits"
    uid=5001(user1) gid=5001(user1) groups=5001(user1)
    user1 exits

    (5)给定一个用户,如果其UID为0,则显示为管理员,否则显示为普通用户

    [root@hao ~]# nano third.sh
    [root@hao ~]# cat third.sh
    #!/bin/bash
    NAME=user1
    USERID=`id -u $NAME`
    [ $USERID -eq 0 ] && echo "Admin" || echo "Common user".
    [root@hao ~]# chmod +x third.sh
    [root@hao ~]# ./third.sh
    Common user.

     2、文件测试

      -e file :测试文件是否存在

      -f file :测试文件是否为普通文件

      -d file:测试指定路径是否为目录

      -r file:测试指定文件对当前用户是否可读

      -w file:测试指定文件对当前用户是否可写

      -x file:测试指定文件对当前用户是否可执行

    (1)判断一个文件是否存在

    #!bin /bash
    FILE=/etc/inittab
    if [ ! -e $FILE ]
    then
        echo "no file"
        exit 8
    fi

    (2)给定一个文件,如果不存在,则退出脚本,如果存在且该文件为普通文件或者目录就显示之,否则,

    #!/bin/bash
    FILE=/etc/rc.d/rc.sysinit
    
    if [ ! -e $FILE ]
    then
        echo "no file"
        exit 6
    fi
    
    if [ -f $FILE  ]
    then
        echo "common file"
    elif [ -d $FILE ]
    then
        echo "directory"
    else
        echo "unknown"
    fi

    二、条件判断控制结构                                                    

    1、单分支if语句:

    if 判断条件

    then

      statement1

      statement2

      ...

    fi

    2、双分支的if语句

    if 判断语句

    then

      statement1

      statement2

    else

      statement3

      statement4

    fi

    3、多分支的if语句

    if 判断条件1

    then

      statement1

      ...

    elif 判断条件2

    then

      statement2

      ...

    elif 判断条件3

    then

      statement3

      ...

    else

      statement4

      ...

    fi

    4、测试

    (1)如果用户存在,输出用户存在,否则创建用户名和密码为用户名的密码。

    [root@hao ~]# nano fourth.sh
    [root@hao ~]# cat fourth.sh 
    #!/bin/bash
    NAME=user4
    if id $NAME &> /dev/null
     then
        echo "$NAME exists"
    else
        useradd $NAME
        echo $NAME | passwd --stdin $NAME &> /dev/null
        echo "add user successful"
    fi
    [root@hao ~]# chmod +x fourth.sh 
    [root@hao ~]# ./fourth.sh 
    add user successful
    [root@hao ~]# ./fourth.sh 
    user4 exists

    (2)判断一个用户是否是管理员

    [root@hao ~]# nano fifth.sh
    [root@hao ~]# cat fifth.sh 
    #!/bin/bash
    NAME=user1
    if [ `id -u $NAME ` -eq 0 ]
    then
        echo "Admin"
    else
        echo "Common"
    fi
    [root@hao ~]# chmod +x fifth.sh 
    [root@hao ~]# ./fifth.sh 
    Common

    (3)判断当前系统上是否有用户的默认shell为bash,如果有,就显示有多少个这类用户,否则,就显示没有这类用户

    [root@hao ~]# nano sixth.sh
    [root@hao ~]# cat sixth.sh 
    #!/bin/bash
    grep "<bash$" /etc/passwd &> /dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ]
    then 
        USERS=`grep "<bash$" /etc/passwd | wc -l`
        echo "$USERS users has shell of bash"
    else 
        echo "no such users"
    fi
    [root@hao ~]# chmod +x sixth.sh 
    [root@hao ~]# ./sixth.sh 
    12 users has shell of bash

    (4)上题基础上,如果存在上述用户,显示其中一个的用户名,否则显示没有此类用户

    [root@hao ~]# nano seventh.sh
    [root@hao ~]# cat seventh.sh 
    #!/bin/bash
    grep "<bash$" /etc/passwd &> /dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ]
    then 
        AUSER=`grep "<bash$" /etc/passwd | head -1 | cut -d: -f1`
        USERS=`grep "<bash$" /etc/passwd | wc -l`
        echo "One of the $USERS is $AUSER"
        
    else 
        echo "no such users"
    fi
    [root@hao ~]# chmod +x seventh.sh 
    [root@hao ~]# ./seventh.sh 
    One of the 12 is root

    (5)给定一个用户,判断其UID与GID是否一样,如果一样,就显示此用户为“good guy”;否则,就显示此用户为“bad guy”

    #!/bin/bash
    USERNAME=user1
    USERID=`id -u $USERNAME`
    GROUPID=`id -g $USERNAME `
    if [ $USERID-eq $GROUPID]
    then 
        echo "good guy"
        
    else 
        echo "bad guy"
    fi

     三、测试脚本                                                              

    测试脚本是否有语法错误

    bash -n file.sh

    单步执行脚本

    bash -x file.sh

    四、定义退出状态码                                                       

    exit:退出脚本

    exit #

    如果脚本没有明确定义退出状态吗,那么最后执行的一条命令的退出码即为脚本的退出码

      

  • 相关阅读:
    如何设置范围,使透视数据源记录可以自适应地改变
    Atitit..文件上传组件选择and最佳实践的总结(2)----HTTP
    AIDL(1)
    最好的年龄减肥
    2012在数据库技术会议上的讲话PPT打包
    左右 Java 于 finally 深度分析语句块
    R0-R37它是Arm 寄存器,那是,CPU内部。和GPIO注册所有外设。换句话说,要是arm的cpu,它包含了其他芯片公司将有R0-R37,和GPIO寄存器只有一个特定的芯片。
    使用方便 正则表达式grep,sed,awk(一)
    经验36--C#无名(大事,物...)
    IOS 图片压缩
  • 原文地址:https://www.cnblogs.com/mingcaoyouxin/p/4080162.html
Copyright © 2011-2022 走看看