首页 > 系统相关 >Shell脚本--test/[]和[[]]

Shell脚本--test/[]和[[]]

时间:2023-04-18 15:34:25浏览次数:27  
标签:Shell num1 num2 -- 是否 filename 判断 test

0. 序言

test([]) 和 [[]] 在 Shell 中都是用来检测某个条件是否成立。通过附带选项,可以进行数值、字符串和文件三个方面的检测。

0.1. 与数值比较相关的选项

num1 -eq num2    判断 num1 是否和 num2 相等
num1 -ne num2    判断 num1 是否和 num2 不相等
num1 -gt num2    判断 num1 是否大于 num2
num1 -lt num2    判断 num1 是否小于 num2
num1 -ge num2    判断 num1 是否大于等于 num2
num1 -le num2    判断 num1 是否小于等于 num2

注意:只能用来比较整数。

0.2. 与字符串判断相关的选项

-z str          判断字符串 str 是否为空
-n str          判断宇符串 str 是否为非空
str1 = str2
str1 == str2    =和==是等价的,都用来判断 str1 是否和 str2 相等
str1 != str2    判断 str1 是否和 str2 不相等
str1 > str2     判断 str1 是否大于 str2
str1 < str2     判断 str1 是否小于 str2

注意:>(<) 在 test 中使用时需要加上转义,即:\>(\<)。这样写是为了防止被误认为重定向运算符。而在 [[]] 中则不需要转义。

0.3. 与文件检测相关的选项

文件类型判断
-b filename    判断文件是否存在,并且是否为块设备文件
-c filename    判断文件是否存在,并且是否为字符设备文件
-d filename    判断文件是否存在,并且是否为目录文件
-e filename    判断文件是否存在
-f filename    判断文件是否存在,井且是否为普通文件
-s filename    判断文件是否存在,并且是否为非空
-L filename    判断文件是否存在,并且是否为符号链接文件
-p filename    判断文件是否存在,并且是否为管道文件
-S filename    判断该文件是否存在,并且是否为套接字文件
文件权限判断
-r filename    判断文件是否存在,并且是否拥有读权限
-w filename    判断文件是否存在,并且是否拥有写权限
-x filename    判断文件是否存在,并且是否拥有执行权限
文件比较
filename1 -nt filename2    判断 filename1 的修改时间是否比 filename2 的新
filename -ot filename2    判断 filename1 的修改时间是否比 filename2 的旧

0.4. 与逻辑运算相关的选项

expression1 -a expression     逻辑与,表达式 expression1 和 expression2 都成立,最终的结果才成立
expression1 -o expression2    逻辑或,表达式 expression1 和 expression2 有一个成立,最终的结果就成立
!expression                   逻辑非,对 expression 进行取反。

注意:[[ ]] 不能使用 -o 和 -a 选项,只能只用 || 和 &&。

1. test/[]

test 是 Shell 内置命令,其用法为:

test expression

test 命令也可以简写为 [],它的用法为:

[ expression ]

当  expression 成立时,退出状态为 0,否则为非 0 值。

注意 [] 和 expression 之间的空格,这两个空格是必须的,否则会导致语法错误。

使用一个命令其实就是调用一个函数,命令后面附带的选项和参数最终都会作为实参传递给函数。

假设 test 命令对应的函数是 func(), 使用如下:

test -z $str
会被替换成
func("-z $str")

如果 str 为空字符串时,那么会被替换成:

func("-z ")

会认为 -z 参数没有选项,分析出错。如果给 $str 加上双引号,则会被替换成:

func("-z \"\"")

很显然, -z 选项后面跟的是一个空字符串(\"表示转义字符),就不会出错。因此,在 test 中使用变量建议用双引号包围起来。

 

2. [[]]

[[]] 是 Shell 内置关键字,其用法为:

[[ expression ]]

当 expression 成立时,退出状态为 0,否则为非 0 值。

注意 [[ ]] 判断 expression 之间的空格,这两个空格是必须的,否则会导致语法错误。

2.1. 特殊点

[[ ]] 在使用时没有给函数传递参数的过程,所以 test 命令的某些注意事项在 [[ ]] 中就不存在了,具体包括:

  • 不需要把变量名用双引号包围起来,即使变量是空值,也不会出错。
  • 不需要对 >、< 进行转义,转义后会出错。

[[ ]]  支持 &&、|| 和 ! 三种逻辑运算符

对多个表达式进行逻辑运算时,可以使用逻辑运算符将多个 test 命令连接起来,例如:

[ -z "$str1" ] || [ -z "$str2" ]

也可以借助选项把多个表达式写在一个 test 命令中,例如:

[ -z "$str1" -o -z "$str2" ]

使用 [[ ]] 对上面的语句进行改进:

[[ -z $str1 || -z $str2 ]]

2.2. 支持正则表达式

可以使用 =~ 来检测字符串是否符合某个正则表达式,它的用法为:

[[ str =~ regex ]]

 

标签:Shell,num1,num2,--,是否,filename,判断,test
From: https://www.cnblogs.com/chien/p/17329748.html

相关文章

  • 大数据的安全防护,带来了哪些全新的挑战,建设数据防护体系的思路是什么?
    大数据时代,数据的产生、流通和应用更加普遍和密集。然而,新的技术、新的需求和新的应用场景给数据安全防护带来了全新的挑战。一是新技术带来的挑战。分布式计算存储架构、数据深度发掘及可视化等新型技术能够大大提升数据资源的存储规模和处理能力,但也为数据安全保护带来......
  • 假阳性与假阴性
    假阳性(falsepositive)指的是在实验或测试中,被错误地判断为“有某种物质”、“某种情况存在”等,而事实上并不存在该物质或情况的情况。例如,在进行病毒检测时,病毒检测呈现了阳性结果,但事实上患者并未感染病毒。假阴性(falsenegative)指的是在实验或测试中,被错误地判断为“没有某种物......
  • 对于数据分析的初学者,还是看些比较入行的实用书籍好
    本人学习数据分析有一两年了,现在在职于一家外资行业,看到很多小白涌入数据分析行业,我就给大家推荐几本有用的书籍,供大家参考,合适的话你们可以看看,或者决定是否踏入数据分析这一个行业:1.《深入浅出数据分析》:讲了数据分析到底是干什么的?数据分析都包含什么内容?对新人们还是有一定的作......
  • 华为云新一代iPaaS全域融合集成平台全新升级
    摘要:基于华为十多年的数字化转型实践,华为云通过组装式交付、数智驱动、DevOps、服务化架构、安全可信、韧性6大关键技术助力客户实现应用现代化和高质量增长,华为云新一代iPaaS全域融合集成平台ROMAConnect也应运而生。本文分享自华为云社区《华为云新一代iPaaS全域融合集成平台......
  • 数据创造价值,数据分析主要为哪几步?
    数据是市场营销行为的记录,市场及消费者综合因素的结果。分析数据可以发现规律,找到问题的原因,做好规划,更好地达成目标,主要能找到以下六条问题:指标异常的原因。1)没有增长2)不健康增长3)异常增长没有达成指标的原因,包括5项指标没有达成的原因品类、包装、趋势变化消费行为趋势及变化解决......
  • shell编程-位置参数的理解
    Linux——$1、$#、$@、$0、$1、$2探岳精神于 2018-07-1921:59:45 发布29675 收藏 66分类专栏: 测试开发 测试开发专栏收录该内容70篇文章5订阅订阅专栏$1在shell中称为“位置参数”,表示传入的第1个参数(第1个入参)。test-z$1是一个判断表达......
  • 什么是数据科学,如何才能成为一名数据科学家?
    数据科学家的年薪是多少,这都不是我们的目标,也不是成功的标志,这是一种价值的标志。怎么样才能有价值?我们要有能力,谁都想要你,不是因为你是他的亲戚或者学生,他想要你这才是价值,我们要的是价值,而不是所谓的成功。什么是数据科学?数据科学有很多很多定义,最基本的定义就是computerscience,......
  • 一个Java线程的线生(线生 vs 人生)
    java线程的使用1.Java多线程概述下面我们看下Java的多线程作者:博学谷狂野架构师GitHub:GitHub地址(有我精心准备的130本电子书PDF)只分享干货、不吹水,让我们一起加油!......
  • 基于UDS的DoIp实现(二) -- DCM实现
    一、平台环境二、代码实现 一、平台环境VirtualBox7.0Ubuntu18.04cmakeversion3.10.2gcc(Ubuntu7.5.0-3ubuntu1~18.04)7.5.0  二、代码实现DCM的功能,主要是接收Tcp/IP传入的数据,从中提取服务ID,然后处理对应的服务,这里以0x19服务为例进行说明,sub-funct......
  • 对于数据分析的方法,具体包含哪几种?
    对于数据的解读,每个人都有不同的方式。如果我们要简单的总结,数据分析的方法,具体有以下几种:1)确定数据的准确性这里包含了选择数据维度的合理性、数据统计的准确性。如果数据维度选择不合理、数据统计结果不精确,我们可能是无法得出正确的分析结果的。这是基础。2)明确影响数据的因素一......