10 shell test命令
- 0.test命令的用法
- 1.与数值比较相关的test选项
- 2.与字符串判断相关的 test 选项
- 3.与文件检测相关的test选项
- 4.与逻辑运算相关的test选项
- 5.注意点与总结
- 1.test中变量用双引号包围起来
- 2.总结
test 是 Shell 内置命令,用来检测某个条件是否成立。test 通常和 if 语句一起使用,并且大部分 if 语句都依赖 test。
test 命令有很多选项,可以进行数值、字符串和文件三个方面的检测。
0.test命令的用法
| 用法 | 注意点 | |
|---|---|---|
| 用法1 test expression | 两种用法是等价的,当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值。 | |
| 用法2 [ expression ] | 注意[]和expression之间的空格,这两个空格是必须的,否则会导致语法错误 |
1.与数值比较相关的test选项
注意,test 只能用来比较整数,小数相关的比较还得依赖 bc 命令。
|
选 项
|
作 用
|
|---|---|
| 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。 |
|
使用(())命令的脚本
|
使用test命令的脚本
|
运行结果
|
注意点
|
|---|---|---|---|
|
|
第一次执行
第二次执行
|
1.test 命令中的变量还是需要加$ 2.(())中的变量可以加也可以不加$ 3.test中的比较两数值的大小用的是-eq/-gt/-lt等,(())中用的是符号>/</==等 4.[]命令中表达式前后的空格不要忘记!! |
2.与字符串判断相关的 test 选项
|
选 项
|
作 用
|
|---|---|
| -z str | 判断字符串 str 是否为空。 |
| -n str | 判断宇符串 str 是否为非空。 |
| str1 = str2 str1 == str2 |
=和==是等价的,都用来判断 str1 是否和 str2 相等。 |
| str1 != str2 | 判断 str1 是否和 str2 不相等。 |
| str1 \> str2 | 判断 str1 是否大于 str2。\>是>的转义字符,这样写是为了防止>被误认为成重定向运算符。 |
| str1 \< str2 | 判断 str1 是否小于 str2。同样,\<也是转义字符。 |
注意,==、>、< 在大部分编程语言中都用来比较数字,而在 Shell 中,它们只能用来比较字符串,不能比较数字,这是非常奇葩的。
其次,不管是比较数字还是字符串,Shell 都不支持 >= 和 <= 运算符,切记。
Shell test 字符串比较举例:
|
脚本
|
结果
|
注意点
|
|---|---|---|
|
|
1.判断字符串为空时将变量 $str1 和 $str2 都被双引号包围起来,这样做是为了防止 $str1 或者 $str2 是空字符串时出现错误 2.比较两个字符串时,除了[]中表达式的前后需要空格还要注意str1=str2时,=前后也需要空格!! |
3.与文件检测相关的test选项
| 文件类型判断 | |
|---|---|
| 选 项 | 作 用 |
| -b filename | 判断文件是否存在,并且是否为块设备文件。 |
| -c filename | 判断文件是否存在,并且是否为字符设备文件。 |
| -d filename | 判断文件是否存在,并且是否为目录文件。 |
| -e filename | 判断文件是否存在。 |
| -f filename | 判断文件是否存在,井且是否为普通文件。 |
| -L filename | 判断文件是否存在,并且是否为符号链接文件。 |
| -p filename | 判断文件是否存在,并且是否为管道文件。 |
| -s filename | 判断文件是否存在,并且是否为非空。 |
| -S filename | 判断该文件是否存在,并且是否为套接字文件。 |
| 文件权限判断 | |
| 选 项 | 作 用 |
| -r filename | 判断文件是否存在,并且是否拥有读权限。 |
| -w filename | 判断文件是否存在,并且是否拥有写权限。 |
| -x filename | 判断文件是否存在,并且是否拥有执行权限。 |
| -u filename | 判断文件是否存在,并且是否拥有 SUID 权限。 |
| -g filename | 判断文件是否存在,并且是否拥有 SGID 权限。 |
| -k filename | 判断该文件是否存在,并且是否拥有 SBIT 权限。 |
| 文件比较 | |
| 选 项 | 作 用 |
| filename1 -nt filename2 | 判断 filename1 的修改时间是否比 filename2 的新。 |
| filename -ot filename2 | 判断 filename1 的修改时间是否比 filename2 的旧。 |
| filename1 -ef filename2 | 判断 filename1 是否和 filename2 的 inode 号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法 |
|
脚本
|
结果
|
注意点
|
|---|---|---|
|
|
1.空格 2.逻辑非要放在表达式前边,例如 [ ! -e "$filename1" ] -e "$filename1"代表的是文件存在的情况 ! -e "$filename1"代表的是文件不存在时的情况 |
4.与逻辑运算相关的test选项
|
选 项
|
作 用
|
|---|---|
| expression1 -a expression | 逻辑与,表达式 expression1 和 expression2 都成立,最终的结果才是成立的。 |
| expression1 -o expression2 | 逻辑或,表达式 expression1 和 expression2 有一个成立,最终的结果就成立。 |
| !expression | 逻辑非,对 expression 进行取反。 |
改写上面的代码,使用逻辑运算选项:
|
脚本
|
结果
|
注意点
|
|---|---|---|
|
|
1.逻辑非!与-o混用时,注意!只起作用于当前表达式,不是-o链接起来的整个表达式 2.使用-o,将两个[]合为1个 |
5.注意点与总结
1.test中变量用双引号包围起来
假设 test 命令对应的函数是 func(),使用test -z $str1命令时,会先将变量 $str1 替换成字符串:
- 如果 $str1 是一个正常的字符串,比如 abc123,那么替换后的效果就是
test -z abc123,调用 func() 函数的形式就是func("-z abc123")。test 命令后面附带的所有选项和参数会被看成一个整体,并作为实参传递进函数。 - 如果 $str1 是一个空字符串,那么替换后的效果就是
test -z,调用 func() 函数的形式就是func("-z "),这就比较奇怪了,因为-z选项没有和参数成对出现,func() 在分析时就会出错。
如果我们给 $str1 变量加上双引号,当 $str1 是空字符串时,test -z "$str1"就会被替换为test -z "",调用 func() 函数的形式就是func("-z \"\""),很显然,-z选项后面跟的是一个空字符串(\"表示转义字符),这样 func() 在分析时就不会出错了。
所以,当在 test 命令中使用变量时,强烈建议将变量用双引号""包围起来,这样能避免变量为空值时导致的很多奇葩问题。
2.总结
test 命令比较奇葩,>、<、== 只能用来比较字符串,不能用来比较数字,比较数字需要使用 -eq、-gt 等选项;不管是比较字符串还是数字,test 都不支持 >= 和 <=。
对于整型数字的比较,建议使用 (()),(()) 支持各种运算符,写法也符合数学规则,用起来更加方便
10 shell test命令的更多相关文章
- Linux编程 10 (shell外部命令与内建命令,alias ,type命令)
一. 内部命令 Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别.内部命令不需要使用子进程来执行,它们已经和shell编译成一体,作为shell工 ...
- Windows 10 Shell命令
可以在[win+R] run 窗口 和 explorer窗口中使用 在command prompt中使用: C:\Users\a>explorer shell:sendto “ shell:Ac ...
- linux 学习10 shell 基础
10.1 Shell概述 .Shell是什么 Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动.挂起.停止甚至是编写一 ...
- linux 基础 shell脚本命令
#########shell脚本命令#### 1.diff diff file file1 ####比较两个文件的不同 -c ####显示周围的行 -u ####按照一格式统一输出生成补丁 -r ## ...
- Linux基本命令(10)其他命令
其他命令 命令 功能 命令 功能 echo 显示一字串 passwd 修改密码 clear 清除显示器 lpr 打印 lpq 查看在打印队列中等待的作业 lprm 取消打印队列中的作业 10.1 ec ...
- Shell printf 命令
Shell printf 命令 printf 命令模仿 C 程序库(library)里的 printf() 程序. 标准所定义,因此使用printf的脚本比使用echo移植性好. printf 使用引 ...
- Linux从入门到进阶全集——【第十四集:Shell基础命令】
1,Shell就是命令行执行器 2,作用:将外层引用程序的例如ls ll等命令进行解释成01表示的二进制代码给内核,从而让硬件执行:硬件的执行结果返回给shell,shell解释成我们能看得懂的代码返 ...
- shell重定向命令执行顺序
重定向内容介绍 一条shell命令的执行包含三个文件描述符:标准输入(键盘等) stdin 0,标准正确输出(屏幕等) stdout 1,标准错误输出(屏幕等)stderr 2 通过重定向可以指定 ...
- Shell 常用命令总结
Shell常用命令总结 1 ls命令:列出文件 ls -la 列出当前目录下的所有文件和文件夹 ls a* 列出当前目录下所有以a字母开头的文件 ls -l *.txt 列出当前目录下所有后缀名 ...
随机推荐
- linux进阶之子网划分
一.定义 当我们对一个网络进行子网划分时,基本上就是将它分成小的网络.比如,当一组IP地址指定给一个公司时,公司可能将该网络"分割成"小的网络,每个部门一个.这样,技术部门和管理部 ...
- git OpenSSL SSL_connect问题
遇到这个问题,查找别人也遇到,省时间不写了直接复制 在使用Git来克隆仓库报了错误,如下: fatal: unable to access 'https://github.com/xingbuxing ...
- 云原生ASP.NET Core程序的可监测性和可观察性
分布式应用程序很复杂,给开发人员调试和修复生产问题带来了一系列挑战.尽管微服务架构可帮助维持一支规模较小,可以自主工作并专注于独立业务团队,但由于其分布式性质,它带来了新的挑战.例如,在业务交易过程中 ...
- oepncv实现——图像去水印
功能简介:通过拖动鼠标实现指定区域水印或是斑点的去除. 实现原理:利用opencv鼠标操作setMouseCallback函数框选(左上到右下)需要处理的区域,按下鼠标开始选中,松开鼠标结束,对选中区 ...
- Jmeter(四十九) - 从入门到精通高级篇 - jmeter使用监视器结果监控tomcat性能(详解教程)
1.简介 上一篇宏哥讲解了利用jmeter的插件来监控服务器资源,这一篇讲解分享如何使用jmeter的监视器结果监控tomcat性能. 2.准备工作 文章标题中提到jmeter和tomcat,那么只需 ...
- javascript数组排序之冒泡排序
冒泡排序 作为一名程序员数组的排序算法是必须要掌握的,今天来说最简单的一种数组排序----冒泡排序 冒泡排序原理 冒泡排序算法是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如 ...
- TinyML-TVM如何驯服TinyML
TinyML-TVM如何驯服TinyML 低成本,以人工智能为动力的消费类设备的激增,导致机器学习研究人员和从业人员对"裸机"(低功耗,通常没有操作系统)设备产生了广泛的兴趣.尽管 ...
- python小知识,列表推导式
使用列表推导式可以快速生成一个列表,或者根据某个列表生成满足指定需求的列表. 1.生成指定范围的数值列表,语法格式如下: list=[Expression for var in range if co ...
- python_request的安装及模拟json的post请求及带参数的get请求
一.Requests模块安装 安装方式一:执行 pip install -U requests 联网安装requests 安装方式二:进入https://pypi.org/project/reques ...
- 小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!
大家好,我是冰河~~ 由于在更新其他专题的文章,Spring系列文章有很长一段时间没有更新了,很多小伙伴都在公众号后台留言或者直接私信我微信催更Spring系列文章. 看来是要继续更新Spring文章 ...