当前位置: 首页 > news >正文

Shell ❀ 条件测试语句

文章目录

  • 三、条件测试
    • 1、基本语法
    • 2、表达式
      • 2.1 条件判断表达式
      • 2.2 字符串判断表达式
      • 2.3 数字判断表达式
      • 2.4 文件判断表达式
      • 2.5 表达式中[ ]与[[ ]]的区别
        • 2.5.1 [ ]的逻辑判断表达式
        • 2.5.2 [[ ]]的逻辑判断表达式

三、条件测试

1、基本语法

在shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或假,当指定的条件为真时,整个条件测试的返回值为0;反之如果为假,则条件测试语句的返回值为非0值。

命令格式1:test 条件表达式
命令格式2:[ 条件表达式 ]
命令格式3:[[ 条件表达式 ]]
# [  ]的两边需要存在空格

2、表达式

命令格式:

[ 操作符 文件或目录 ]

2.1 条件判断表达式

  • [ -a file ]:如果file文件存在则为真;
  • [ -b file ]:如果file文件存在且是一个特殊文件则为真(文件类型分为七种,分别是:-bcdlps- 为普通文件类型,l 为链接文件,需要注意其链接目标文件类型是否为普通文件类型,其他类型均属于特殊类型);
  • [ -c file ]:如果file文件存在且是一个特殊文件则为真;
  • [ -d file ]:如果file文件为目录则为真;
  • [ -e file ]:如果file文件存在则为真;
  • [ -f file ]:如果file文件存在且是一个普通文件则为真;
  • [ -g file ]:如果file文件存在且已经设置了SGID则为真;
  • [ -h file ]:如果file文件存在且是一个符号连接则为真;
  • [ -k file ]:如果file文件存在且已经设置了粘制位则为真;
  • [ -r file ]:如果file文件存在且可读则为真;
  • [ -s file ]:如果file文件存在且大小不为0则为真;
  • [ -t file ]:如果文件描述FD打开且指向一个终端则为真;
  • [ -u file ]:如果file文件存在且设置了SUID(set user ID)则为真;
  • [ -w file ]:如果file文件存在且可写则为真;
  • [ -x file ]:如果file文件存在且可执行则为真;
  • [ -O file ]:如果file存在且属有效用户ID则为真;
  • [ -G file ]:如果file存在且属有效用户组则为真;
  • [ -L file ]:如果file存在且是一个符号连接则为真;
  • [ -N file ]:如果file存在 and has been mod如果ied since it was last read则为真;
  • [ -S file ]:如果file存在且是一个套接字则为真;
  • [ -z string ]string 的长度为零则为真;

操作案例

# 如果test1为目录返回yes,否则为no
[root@localhost shell]# [ -d test1 ] && echo yes || echo no
yes
# 如果test2.txt为普通文件类型返回yes,否则为no
[root@localhost shell]# [ -f test2.txt ] && echo yes || echo no
yes
# 如果test2.txt文件存在且可读返回yes,否则为no
[root@localhost shell]# [ -r test2.txt ] && echo yes || echo no
yes
# 如果test2.txt文件存在且可执行返回yes,否则为no
[root@localhost shell]# [ -x test2.txt ] && echo yes || echo no
no
# 如果test2.txt文件存在且大小不为0返回yes,否则为no
[root@localhost shell]# [ -s test2.txt ] && echo yes || echo no
no

2.2 字符串判断表达式

  • str1 = str2:两个字符串完全相等为真;
  • str1 != str2:两个字符串不完全相等为真;
  • -n str1:当串的长度大于0时为真(非空为真);
  • -z str1:当串的长度为0时为真(空为真);
  • str1:当串str1为非空时为真;

操作案例

# 字符串长度不为0返回yes,否则为no
[root@localhost shell]# [ -n "hello" ] && echo yes || echo no
yes
# 字符串长度为0返回yes,否则为no
[root@localhost shell]# [ -z "" ] && echo yes || echo no
yes
# 字符串完全相同返回yes,否则为no
[root@localhost shell]# [ "Hello"="hello" ] && echo yes || echo no
yes

2.3 数字判断表达式

  • eq:等于;
  • ne:不等于;
  • gt:大于;
  • lt:小于;
  • ge:大于等于;
  • le:小于等于;

操作案例

# 若5大于3返回yes,否则为no
[root@localhost ~]# [ 5 -gt 3 ] && echo yes || echo no
yes
# 若id -u返回等于0返回admin,否则返回other
[root@localhost ~]# [ `id -u` -eq 0 ] && echo admin || echo other
admin

2.4 文件判断表达式

  • -r file:用户可读为真;
  • -w file:用户可写为真;
  • -f file:文件为普通文件为真;
  • -x file:用户可执行为真;
  • -d file:文件为目录为真;
  • -c file:文件为特殊字符文件为真;
  • -s file:文件大小非0为真;
  • -b file:文件为块特殊文件为真;
  • -t file:文件描述符(默认1)指定的设备为终端时为真;

操作案例

# /etc/hosts为普通文件且/etc/services为普通文件返回yes,否则为no
[root@localhost ~]# [ -f /etc/hosts -a -f /etc/services ] && echo yes || echo no
yes

[root@localhost ~]# ll /etc/hosts
-rw-r--r--. 1 root root 158 Sep 10  2018 /etc/hosts
[root@localhost ~]# ll /etc/services
-rw-r--r--. 1 root root 692252 Oct 30  2019 /etc/services

2.5 表达式中[ ]与[[ ]]的区别

  • [ ]是bash里test的同义词,如[ -d filename ]test -d filename的返回结果是一样的,[ ] 可用的字符串比较运算符只有 == != ;整数比较运算符只能使用 -eq-ne-le-ge-lt-gt 六种;对于字符串的比较可以使用转义字符进行转义大于小于号,如 [ ab \< bc ] ,结果为真,返回为0
  • [[ ]] 是shell中的一个内置命令,比 [ ] 通用并强大;逻辑测试使用 && || ;使用 =~ 操作符支持正则表达式;在[[ ]]内可以使用-eq等操作符进行非整数比较, [[ ]] 将非整数的字符串转换成为 0( ),不会检查报错内容;
  • [ ][[ ]]都不支持+ - * /数学运算符;

2.5.1 [ ]的逻辑判断表达式

  • -a :与;
  • -o :或;
  • ! :非;
  • !=:不等;

操作案例

read -p "Enter a number: " aaa
# -o 为或关系
if [ ${aaa} -lt 1 -o ${aaa} -gt 99 ]; then
    echo "小于1或大于99"
else
	echo "大于1小于99"

2.5.2 [[ ]]的逻辑判断表达式

  • && :前面命令执行失败,后面命令不执行;
  • || :前面命令执行成功,后面命令不执行;前面执行失败后面命令执行;
  • =~:匹配(正则表达式);
# 若文件/etc/passwd存在则返回1否则返回2
[root@localhost shell]# cat /etc/passwd > /dev/null && echo "1" || echo "2"
1

相关文章:

  • Istio:微服务网格的强大工具,Istio介绍
  • 《沈阳体育学院学报》
  • cad2015以上默认设置
  • 人工智能与机器学习原理精解【19】
  • Apache Cordova开发教程-入门基础
  • 8.Bug流程管理,禅道的使用(包含笔试/面试题)
  • 代码库管理工具Git介绍
  • 你知道什么是物联网MQTT么?
  • 论文阅读-CheckFreq:频繁、精细的DNN检查点操作。
  • Easy-Jmeter: 性能测试平台
  • CSS轻松学:简单易懂的CSS基础指南
  • Springboot企业级开发--开发入门01
  • Transforming the Latent Space of StyleGAN for Real Face Editing翻译
  • 导入shp数据到postgis库
  • plotly parallel_coordinates平行坐标可视化
  • 前端使用dockerfile生成镜像
  • pandas对于文件数据基本操作,数据处理常用
  • WebSocketSSE实时动态数据展示
  • 数字三渔冲:打造美丽乡村新范式
  • 【爬虫】JS逆向解决反爬问题系列3—sign破解
  • 算法day55|392,115
  • 1 安装部署
  • 提交 bug 的内容书写规范
  • 16含风光水的虚拟电厂与配电公司协调调度模型(场景削减MATLAB程序)
  • Linux中find用法示例
  • 能源监控管理系统|瑜岿科技
  • RV1126笔记五:人脸识别方案<三>
  • 基于Python的Flask WEB框架实现后台权限管理系统(含数据库),内容包含:用户管理、角色管理、资源管理和机构管理
  • MySQL面试常问问题(锁 + 事务) —— 赶快收藏
  • Java进阶—JUC编程
  • 机器学习之模型调优
  • 为行业赋能 助力行业客户业务大放异彩