Shell ❀ 条件测试语句

2023-05-16

文章目录

  • 三、条件测试
    • 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell ❀ 条件测试语句 的相关文章

  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • sed 错误“未终止的 's' 命令”故障排除

    我正在构建一个script https stackoverflow com questions 4036832 replacing a specific term in an xml file其中 它将用文件夹路径替换 XML 文件中的模式
  • 在 iOS 模拟器中安装应用程序的脚本

    我正在尝试自动化构建应用程序 运行单元测试以及最终运行 UI 测试的过程 我正在通过命令行 xcodebuild sdk iphonesimulator6 0 在某个目录中构建应用程序 如何通过命令行 在 Library Applicati
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • 通过 sed 使用 unix 变量将数据附加到每行末尾[重复]

    这个问题在这里已经有答案了 我有一个文件 我想使用 SED 将值附加到每行末尾的 unix 变量中 我已经通过 AWK 实现了这一点 但我想在 SED 中实现 像这样的东西 我已经尝试过以下命令 但它不起作用 sed i s BATCH R
  • sh / Bash shell 脚本中 !# (bang-pound) 的含义是什么?

    我想了解这个 Scala 脚本是如何工作的 usr bin env bash exec scala 0 object HelloWorld def main args Array String println Hello world arg
  • Bash 脚本监听按键以继续

    因此 我想编写一个由一系列步骤组成的 bash 脚本 并将其标识为 task 然而 每个步骤都只能完成并且可以根据用户的需要运行 Do task1 if keypressed stop task1 and move on this is t
  • GNU 并行与 rsync

    我正在尝试运行一些实例rsync并行使用ssh with GNU parallel 我正在运行的命令是这样的 find tmp tempfolder type f name chunck sort parallel gnu j 4 v ss
  • 调用 cat 时 shell 脚本挂起

    我有一个 shell 脚本 它通过电子邮件向我发送通过 crontasks 遇到的错误 如下所示 exec gt output cat shopt s nocasematch if output error output warning t
  • 无需 root 访问权限即可安装 zsh? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有可能 以及如何 我确实需要在几台具有 ssh 访问权限 但没有 root 访问权限 的远程计算机上使用此功能 下载 zsh wget O zsh t
  • 使用运算符 j 操作 zsh 数组

    以下代码摘自here http eseth org 2010 git in zsh html function vi git st local ahead behind remote local a gitstatus Are we on
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • exec()、shell_exec()、curl_exec() 的安全漏洞

    有时 我会使用 exec shell exec 和curl exec 以下是典型用途 假设其中有 PHP 变量 即第一个变量中的 html 用户有可能修改其内容 从安全漏洞的角度来看 我应该关注什么 escapeshellcmd 和 esc
  • 在 bash 中,如何除以两个变量并输出四舍五入到小数点后 5 位的答案? [复制]

    这个问题在这里已经有答案了 我将两个变量作为输入 将它们相除后 我希望将输出四舍五入到小数点后 5 位 我已经尝试过这种方法 gt sum 12 n 7 output scale 5 sum n bc echo output 我的代码没有显
  • 在 Shell 中提取匹配模式后的字符串

    如何提取 Shell 脚本中匹配模式后面的任何字符串 我知道 Perl 脚本中的此功能 但不知道 Shell 脚本中的功能 以下是示例 subject 01 这是一个示例主题 可能会有所不同 我必须提取 Subject 01 后面的任何字符
  • 如何使用 nohup 获取正在运行的程序列表

    我正在通过 SSH 连接访问运行 CentOS linux 发行版 的服务器 由于我无法始终保持登录状态 因此我使用 nohup command 来运行我的程序 我找不到如何获取我开始使用 nohup 的所有程序的列表 工作 只有在我注销之
  • 无法从 bash 脚本使用 nvm

    我正在尝试编写一个 shell 脚本来自动设置我的开发环境 安装 python nvm node mongo 等 我正在使用 nvm 来安装 Node js 它告诉您关闭并重新打开终端以开始使用 nmv 命令 我尝试获取 bashrc 和
  • HBase Shell 日志记录

    使用 HBase shell 时 我收到大量日志记录 包括 INFO 和 DEBUG 消息 虽然这对于学习 HBase 内部结构来说很有趣 但它非常冗长并且可能会掩盖输出 我尝试过以多种不同的方式更改日志记录级别 包括所描述的here ht

随机推荐

  • ROS学习 catkin CMakeList.txt详细介绍

    ROS中catkin CMakeLists txt的内容 CMakeList txt文件是CMake编译系统编译软件包过程的输入文件 任何CMake兼容包都包含一个或多个CMakeLists txt文件 xff0c 这些文件描述了如何编译代
  • ROS Catkin 教程之 CMakeLists.txt

    1 概览 CMakeLists txt 是用 CMake 构建系统构建 ROS 程序包的输入文件 任何兼容 CMake 的包都包含一个或多个 CMakeLists txt 文件 xff0c 用以描述怎样构建和安装代码 catkin 项目采用
  • ROS在roslaunch时,提示“is neither a launch file in package”或TAB时没有补全

    描述 已经设置了source devel setup bash xff0c 在同一终端用roslaunch可以 xff0c 但我在这个终端起的是roscore xff0c 新终端再用roslaunch就不行了 分析 报错是因为没找到对应的p
  • ros绑定串口

    本文主要介绍ros绑定串口设备的一种方法 1 检查有多少个设备 span class token function ls span dev ttyUSB 2 查看对应串口 查看KERNELS后面的设备的硬件端口号 udevadm info
  • Spring Boot 配置文件配置自动提示 Configuration Processor

    效果 在使用Idea等开发工具时 xff0c 配置文件中输入前缀就有对应的补全提示 xff0c 使开发者可以很方便配置相应属性 xff0c 效果截图如下 xff1a 元数据说明 这些提示来自于 spring 自动配置规范中的源数据文件 sp
  • ubuntu20.4安装python3.8

    ubuntu20 4中安装python3 8 注 ubuntu20 4自带python3 10 软连接python3与pip3指向的为python3 10本文意在安装python3 8 并将软连接python与pip指向python3 8
  • C/C++多线程、线程同步(互斥锁与信号量)

    参考链接2 中写的非常好 xff0c 简单易懂 xff0c 上手快 xff0c 非常好的博文 使用多线程及互斥锁样例 xff1a include lt iostream gt include lt windows h gt using na
  • Python ❀ 初学者学习笔记与知识点梳理

    软件安装与环境部署变量与数据类型列表与元组条件判断语句字典while循环函数类文件与异常 推荐代码练习地址 xff1a https www runoob com python python 100 examples html 点击此处直接跳
  • Shell ❀ Linux系统自动挂载本地yum源并安装rpm依赖包

    文章目录 1 脚本代码详解2 代码执行结果3 脚本参数调整 1 脚本代码详解 span class token comment bin bash span span class token builtin class name echo s
  • Windows ❀ Windows系统下端口连通性常见的验证方法

    文章目录 1 telnet1 1 telnet服务开启方法1 2 端口连通性验证 2 tcping2 1 tcping下载与安装2 2 端口连通性验证 3 netstat ano findstr3 1 findstr使用语法3 2 端口连通
  • Security ❀ 安全设备学习规范(第二版)

    文章目录 安全设备学习规范1 设备部署环境1 1 部署方式1 2 配置IP地址与路由1 3 设备冗余机制1 4 会话同步机制1 5 设备账户管理1 6 设备故障诊断 2 产品授权方式2 1 序列号2 2 Hash值 3 相关设备联动3 1
  • Windows ❀ 解决Google浏览器无法访问网页问题

    文章目录 问题 xff1a Google浏览器无法访问网页解决方法 问题 xff1a Google浏览器无法访问网页 使用Google浏览器打开某个已知安全网页时 xff0c 弹出如下信息 xff0c 错误内容如下 xff1a NET ER
  • Security ❀ CSP Bypass 内容安全策略绕过

    文章目录 内容安全策略绕过 CSP Bypass1 Low Level2 Medium Level3 High Level4 Impossible Level 内容安全策略绕过 CSP Bypass CSP 内容安全策略 xff1a 为了缓
  • Security ❀ JavaScript Attacks 前端攻击

    文章目录 JavaScript Attacks 前端攻击1 Low Level2 Medium Level3 High Level4 Impossible Level JavaScript Attacks 前端攻击 JavaScript是一
  • MiddleWare ❀ Zookeeper基础概述

    文章目录 1 认识Zookeeper1 1 数据类型1 2 监听器1 3 基本功能1 3 1 统一配置管理1 3 2 统一命名服务1 3 3 分布式锁1 3 4 集群状态 2 下载安装包3 安装服务3 1 服务端命令3 2 客户端命令 3
  • Java文件内容变更及内容追加监听方案

    简介 对于文件内容变动的监听处理 xff0c 一般分为两种主要应用场景 1 只关心文件内容是否发生变更 文件的内容发生变动的场景是全量修改模式 xff0c 不是内容追加模式 例如某xml文件内容发生变动 这种情况 xff0c 我们一般只需要
  • MiddleWare ❀ MySQL基础概述

    文章目录 MySQL基础1 SQL语法与分类1 1 DDL 数据定义语言1 1 1 库操作1 1 1 1 查询1 1 1 2 创建1 1 1 3 删除1 1 1 4 使用 1 1 2 表 43 字段操作1 1 2 1 查询1 1 2 2 创
  • Shell ❀ 基础知识概述

    文章目录 一 基本概念1 脚本文件命名方式2 解释器分类3 基本基本组成内容4 脚本编写规范与格式说明5 自动生成脚本的注释与配置信息 一 基本概念 shell又称为命令解释器 xff0c 它能识别用户输入的各种命令 xff0c 并传递给操
  • Shell ❀ 基础变量类别与引用

    文章目录 二 变量与引用1 变量命名2 变量类型3 变量定义4 常用变量4 1 内置通配符4 2 内置变量4 3 自定义变量4 4 环境变量4 5 变量的作用域4 5 1 全局变量4 5 2 局部变量 4 6 位置变量4 5 1 位置变量的
  • Shell ❀ 条件测试语句

    文章目录 三 条件测试1 基本语法2 表达式2 1 条件判断表达式2 2 字符串判断表达式2 3 数字判断表达式2 4 文件判断表达式2 5 表达式中 与 的区别2 5 1 的逻辑判断表达式2 5 2 的逻辑判断表达式 三 条件测试 1 基