• 第三章 shell条件测试


    目录

    1.1. 用途

    1.2. 基本语法

    1.2.1. 格式:

    1.2.2. 示例

    1.3. 文件测试

    1.3.1. 参数:

    1.3.2. 示例

    1.4. 整数测试

    1.4.1. 作用

    1.4.2. 操作符

    1.4.3. 示例

    1.5. 逻辑操作符

    1.5.1. 符号

    1.5.2. 例:

    1.6. 命令分隔符

    1.7. 案例分析


    1.1. 用途

    为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。

    通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。

    条件测试在各种流程控制语句,例如判断语句和循环语句中发挥了重要的作用,所以了解和掌握这些条件测试是非常重要的

    1.2. 基本语法

    1.2.1. 格式:

    1. 格式1: test -参数 条件表达式
    2. 格式2[ 条件表达式 ] # 注意:[]的左右要有空格
    3. 格式3[[ 条件表达式 ]] # 注意:[]的左右要有空格
    4. 格式4: ((条件表达式))

    test单独使用,判断条件为真,echo $?返回0,假返回1

    test[ ]等价

    [[ ]] 是扩展命令,可以使用通配符等进行模式匹配,&& || > < 等操作符可以直接应用于双中括号中,但不能用于单中括号中

    (()) 一般用于if语句里,两端不需要有空格,测试对象为整数

    1.2.2. 示例

    1. # test语法
    2. [root@server ~]# test -f /etc/passwd
    3. [root@server ~]# echo $?
    4. 0
    5. [root@server ~]# test -f /etc/aa
    6. [root@server ~]# echo $?
    7. 1
    8. [root@server ~]#
    9. [root@server ~]# test -f /etc/passwd && echo 1 || echo 0
    10. 1
    11. [root@server ~]# test -f /etc/aa && echo 1 || echo 0
    12. 0
    13. [root@server ~]# test -f /etc/passwd && echo yes || echo no
    14. yes
    15. [root@server ~]# test -f /etc/aa && echo yes || echo no
    16. no
    17. [root@server ~]# if test -f /etc/passwd ; then echo 1 ; else echo no ;fi
    18. 1
    19. [root@server ~]# if test -f /etc/aa ; then echo 1 ; else echo no ;fi
    20. no
    1. # [] 语法
    2. [root@server ~]# [-f /etc/passwd] # 注意:[] 中要有空格
    3. bash: [-f: command not found...
    1. [root@server ~]# [ -f /etc/passwd ]
    2. [root@server ~]# echo $?
    3. 0
    4. [root@server ~]# [ -f /etc/aa ]
    5. [root@server ~]# echo $?
    6. 1
    7. [root@server ~]# [ -f /etc/aa ] && echo y || echo n
    8. n
    9. [root@server ~]# [ -f /etc/passwd ] && echo y || echo n
    10. y
    11. [root@server ~]# if [ -f /etc/passwd ] ; then echo 1 ; else echo no ;fi
    12. 1
    13. [root@server ~]# if [ -f /etc/aa ] ; then echo 1 ; else echo no ;fi
    14. no
    1. # [[]] 语法
    2. [root@server ~]# [[ 3 > 2 || 1 > 2 ]] && echo 1 || echo 0
    3. 1
    4. [root@server ~]# [[ 3 > 2 && 1 > 2 ]] && echo 1 || echo 0
    5. 0
    1. (()) 语法
    2. [root@server ~]# ((9>5)) && echo 1 || echo 0
    3. 1
    4. [root@server ~]# (( 9 > 5 )) && echo 1 || echo 0
    5. 1
    6. [root@server ~]# ((9>5)) && echo 1 || echo 0
    7. 1
    8. [root@server ~]# ((9>13)) && echo 1 || echo 0
    9. 0
    10. [root@server ~]# ((9>13.5)) && echo 1 || echo 0 # 注意:不支持小数运算
    11. -bash: ((: 9>13.5:语法错误: 无效的算术运算符 (错误符号是 ".5")
    12. 0

    1.3. 文件测试

    1.3.1. 参数:

    1.3.2. 示例

    1. [root@server ~]# [ -d /root ] && echo y || echo n
    2. y
    3. [root@server ~]# [ -d /aa ] && echo y || echo n
    4. n
    5. [root@server ~]# [ -b /dev/nvme0n1 ] && echo y || echo n
    6. y
    7. [root@server ~]# [ -L /dev/cdrom ] && echo y || echo n
    8. y
    9. [root@server ~]# ll /dev/cdrom
    10. lrwxrwxrwx 1 root root 3 322 11:31 /dev/cdrom -> sr0
    11. [root@server ~]# [ -e /file1 ] && echo y || echo n
    12. n
    13. [root@server ~]# touch /file1
    14. [root@server ~]# [ -e /file1 ] && echo y || echo n
    15. y
    1. # 编写脚本,测试文件是否存在,不存在则创建
    2. [root@server ~]# vim temp1.sh
    3. #!/bin/bash
    4. FILE=$1
    5. echo FILE
    6. if test -e $FILE
    7. then
    8. echo "$FILE文件已存在"
    9. else
    10. echo "$FILE文件不存在,开始新建..."
    11. touch $FILE
    12. ls -l $FILE
    13. fi
    14. [root@server ~]# bash temp1.sh /etc/passwd
    15. /etc/passwd
    16. /etc/passwd文件已存在
    17. [root@server ~]# bash temp1.sh temp
    18. temp
    19. temp文件不存在,开始新建...
    20. -rw-r--r-- 1 root root 0 617 14:53 temp
    1. # 上例改写
    2. [root@server ~]# vim temp1.sh
    3. #!/bin/bash
    4. read -p "请输入文件名: " FILE
    5. if test -e $FILE
    6. then
    7. echo "$FILE文件已存在"
    8. else
    9. echo "$FILE文件不存在,开始新建..."
    10. touch $FILE
    11. ls -l $FILE
    12. fi
    13. [root@server ~]# bash temp1.sh
    14. 请输入文件名: /etc/sos/sos.conf
    15. /etc/sos/sos.conf文件已存在
    16. [root@server ~]# bash temp1.sh
    17. 请输入文件名: t1
    18. t1文件不存在,开始新建...
    19. -rw-r--r-- 1 root root 0 617 14:56 t1

    1.4. 整数测试

    1.4.1. 作用

    用于比较两个数值的大小关系,操作的对象是数值

    1.4.2. 操作符

    1.4.3. 示例

    1. [root@server ~]# [ 5 -gt 3 ] && echo y || echo n
    2. y
    3. [root@server ~]# test 5 -gt 3 && echo y || echo n
    4. y
    5. [root@server ~]# ((5>3)) && echo y || echo 0
    6. y
    1. # 知识拓展
    2. # 检查左侧内容是否包含右侧的表达式,可以使用 =~ 正则匹配,表示是否包含
    3. [root@server ~]# n=123
    4. [root@server ~]# [[ "$n" =~ ^[0-9]+$ ]] && echo y || echo n
    5. y
    6. [root@server ~]# n=123ttt
    7. [root@server ~]# [[ "$n" =~ ^[0-9]+$ ]] && echo y || echo n
    8. n

    1.5. 逻辑操作符

    1.5.1. 符号

    1.5.2. 例:

    1. [root@server ~]# [ -f /etc/passwd -a -f /etc/services ] && echo 1 || echo 0
    2. 1
    3. [root@server ~]# [ -f /etc/hosts -o -d /etc/services ] && echo 1 || echo 0
    4. 1
    5. [root@server ~]# ((5<10 && 5>2)) && echo y || echo n
    6. y
    7. [root@server ~]# ((2<5<10)) && echo y || echo n
    8. y
    9. [root@server ~]# ((2<5<1)) && echo y || echo n
    10. n
    11. [root@server ~]# ((6<5<10)) && echo y || echo n
    12. y
    13. [root@server ~]# ((2<5<-1)) && echo y || echo n
    14. n

    1.6. 命令分隔符

    1. cmd1;cmd2 以独立的进程依次执行cmd1和cmd2
    2. (cmd1;cmd2) 在同一进程中依次执行cmd1和cmd2
    3. cmd1&cmd2 cmd1和cmd2同时执行,分属于不同的进程
    4. cmd1&&cmd2 当cmd1为真时,则执行cmd2
    5. cmd1||cmd2 当cmd1不为真时,则执行cmd2
    6. cmd& 后台执行
    1. # 若账户fox10不存在,则添加账户
    2. [root@server ~]# id fox10 &> /dev/null && echo "fox10已存在" || useradd
    3. fox10
    4. # &> /dev/null 表示将左侧命令执行的正确和错误输出到“黑洞”即不显示到屏幕

    1.7. 案例分析

    例1:判断当前已登录账户数,若超过5个则输出“Too many”

    1. [root@server ~]# num=$(who | cut -d " " -f1 | sort -u | wc -l)
    2. [root@server ~]# [ $num -gt 5 ] && echo "Too many" || echo "已登录账户数:$num"已登录账户数:1
    3. # who : 查看当前已登录的账户信息
    4. # cut -d " " -f1 :以空格为列向分割符,截取第1部分
    5. # sort -u :去重后排序
    6. # wc -l:计算行数
    7. # 上例改写为:
    8. [root@server ~]# (($num>5)) && echo "Too many" || echo "已登录账户数:$num"

    例2:编写脚本temp2.sh ,程序从键盘读入一个目录名,判断该命令是否存在,若不存在则创建,并显示目录信息

    1. [root@server ~]# vim temp2.sh
    2. #!/bin/bash
    3. cd /
    4. ls
    5. read -p "请输入一个目录名:" dir
    6. test -d $dir && ls -l $dir || (echo "目录不存在,开始新建..." ; mkdir $dir ;
    7. ls -l $dir)

    例3:如果/var/log/messages文件行数大于30行,则显示提示信息

    1. [root@server ~]# (($(cat /var/log/messages | wc -l)>30)) && echo "好大一个文件" ||
    2. echo "还能接受"

    例4:编写脚本temp3.sh,功能:显示root目录下的文件信息,之后建立一个aa目录,在aa目录下新建一 个文件bb.txt,并修改该文件的权限为可执行,最后再次浏览信息

    1. [root@server ~]# vim temp3.sh
    2. #!/bin/bash
    3. ls -l /root
    4. mkdir /root/aa
    5. touch /root/aa/bb.txt
    6. chmod +x /root/aa/bb.txt
    7. ls -l /root

    例5:编写脚本temp4.sh,从键盘读入x,y,计算和值后输出

    1. #!/bin/bash
    2. #从键盘输入2个整数存储到变量x,y中,计算和值后输出
    3. read -p "请输入x的值" x
    4. read -p "请输入y的值" y
    5. if [ -n "$x" -a -n "$y" ]
    6. then
    7. if [[ "$x" =~ ^[0-9]+$ ]] && [[ "$y" =~ [0-9]+$ ]]
    8. then
    9. sum=$[x+y]
    10. echo "$x+$y=$sum"
    11. else
    12. echo "请输入数字"
    13. fi
    14. else
    15. echo "请输入有效内容"
    16. fi

    例6:编写temp5.sh脚本显示所有用户,选择一个用户输入,判断是root账户还是系统账户还是普通账户

    1. #!/bin/bash
    2. #显示所有账户名称,从键盘输入账户名称,判断是系统账户还是普通账户
    3. echo "系统中所有账户名称如下"
    4. cat /etc/passwd | cut -d ":" -f1 | sort
    5. read -p "请输入一个账户名称:" us
    6. [ $(id -u $us) -lt 1000 ] && echo "系统账户" || echo ”普通账户“

    或者

    1. [root@server ~]# vim temp5.sh
    2. #!/bin/bash
    3. cat /etc/passwd | cut -d ":" -f1 | sort -u
    4. read -p "请输入一个账户名:" us
    5. us_num=$(id -u $us)
    6. if (($us_num==0))
    7. then
    8. echo "此用户为管理员账户"
    9. else
    10. if (($us_num>=1 && $us_num<=999))
    11. then
    12. echo "此账户为系统账户"
    13. else
    14. echo "普通账户"
    15. fi
    16. fi

    例7:编写脚本temp6.sh ,给定文件anaconda-ks.cfg,判断是否存在空白行,若存在则显示行数,否则显示“无空白行”提示信息

    1. #!/bin/bash
    2. #检测anaconda-ks.cfg文件中是否有空白行,若有则显示行数
    3. num=$(grep ^$ /root/anaconda-ks.cfg | wc -l)
    4. if [ $num -gt 0 ]
    5. then
    6. echo "该文件含有空白行,行数渭:$num"
    7. grep -n ^$ /root/anaconda-ks.cfg
    8. else
    9. echo"此文件无空白行"
    10. fi

  • 相关阅读:
    vue3 echarts实现k线
    Java开发面试--nacos专区
    Matlab学习笔记
    java+idea+mysql采用医疗AI自然语言处理技术的3D智能导诊导系统源码
    【unity2023打包安卓工程】踩坑记录
    mackdown语法
    Stream
    IEEE 754
    推荐一款M1芯片电脑快速搭建集群的虚拟机软件
    矩阵分析与应用-11-向量子空间的基
  • 原文地址:https://blog.csdn.net/m2282475145/article/details/136194704