Bash : test 命令
在 Bash 脚本中我们一般会使用 test 命令来进行条件检查。test 命令的返回值为 0 或 1。0 表示 true, 1 表示 false。简单起见,我们可以直接认为 test 的结果为 true 或 false。
还可以使用中括号代替 test,需要注意的是括号和表达式之间一定要留有空格,所以下面的两种写法是等同的:
test "$1" = "$name"
或
[ "$1" = "$name" ]
test 命令的主要用途是检查字符串、比较整数和检查文件的属性。本文将通过简单的示例介绍 test 命令的常见用法。
检查字符串
判断字符串是否为空
test 检查字符串时,非空的字符串返回 true,空字符串或者没有参数都返回 false。
if test "$abc"; then
echo "It's not an empty string."
else
echo "It's an empty string."
fi
运行上面代码的输出结果为:
It's an empty string.
这是因为我们没有定义变量 abc ,所以 "$abc" 被解释成了空字符串。
其实使用检查空字符串的运算符 -n 会让代码具有更清晰的含义:
if test -n "$abc"; then
echo "It's not an empty string."
else
echo "It's an empty string."
fi
-n 的含义为:字符串的长度不为 0 时返回 true。所以这段代码的输出结果和上面一样。
如果我们需要判断一个空的字符串可以直接使用运算符 -z:
if test -z "$abc"; then
echo "It's an empty string."
fi
这段代码输出的结果仍然是:
It's an empty string.
判断字符串相等
test 支持两个运算符来判断字符串相等:= 和 ==。
abc="hello"
if test "hello" == "$abc"; then
echo "You got same string."
fi
运行上面代码的输出结果为:
You got same string.
因为 = 看起来更像是在赋值,所以我更倾向于使用 ==。但是当你的脚本需要跨平台时,最好还是使用 =(test 中的 = 是 POSIX 标准定义的!)。
如果要判断两个字符串不相等,可以使用 != 运算符:
abc="helloo"
if test "hello" != "$abc"; then
echo "Your word is not 'hello'."
fi
运行上面代码的输出结果为:
Your word is not 'hello'.
为什么用双引号把变量包起来?
如果你留意前面的代码会发现我们在引用变量时都用双引号包起来了,这是写 shell 脚本中的一个小技巧。尝试运行下面的代码:
abc="hello xx"
if test "hello" != $abc; then
echo "Your word is not 'hello'."
fi
会提示语法错误:

因为变量 abc 的值为 "hello xx",在字符串中间有个空格。所以在 Bash 进行命令解释的时候,上面的 test 命令变成了:
test "hello" != hello xx
这不是一个合法的 test 命令,所以脚本执行时就报错了!
其实不光是空格,包含在 $IFS 中的其它字符,还有变量为空时,都会造成语法错误。所以使用双引号包裹变量是一种保护机制,可以提高脚本的健壮性。
比较数字(整数)
test 支持整数间的比较操作,可用的运算符有 '-eq','-ne','-lt','-le','-gt','-ge'。
比如判断两个整数相等可以使用 -eq 运算符:
num=
if test "$num" -eq ; then
echo "num is 3."
fi
运行上面代码的输出结果为:
num is .
常见数字运算符的含义分别为:
n1 -eq n2 : 整数 n1 等于 n2
n1 -ne n2 : 整数 n1 不等于 n2
n1 -lt n2 : n1 小于 n2
n1 -gt n2 : n1 大于 n2
n1 -le n2 : n1 小于或等于 n2
n1 -ge n2 : n1 大于或等于 n2
检查文件属性
检查文件的属性也是 test 常见用法。比如要检查一个文件的类型是不是普通文件,可以使用 -f 选项:
touch test.sh
filename="test.sh"
if test -f "$filename"; then
echo "It's a regular file."
fi
运行上面代码的输出结果为:
It's a regular file.
另一个重要的选项是 -d,它用来检查一个路径是不是目录:
dirname="/bin"
if test -d "$dirname"; then
echo "It's a directory."
fi
运行上面代码的输出结果为:
It's a directory.
如果是仅仅判断一个路径是否存在,可以使用 -e 运算符。它仅检查文件是否存在而不关心文件的具体类型。
下面是其它一些常用的文件检查运算符:
-b file : 文件存在并且是块设备文件。
-c file : 文件存在并且是字符设备文件。
-d file : 文件存在并且是一个目录。
-e file : 文件存在。
-f file : 文件存在并且是一般文件。
-g file : 文件存在并且设置了 setgid 位。
-h file : 文件存在并且是一个链接文件。
-p file : 文件存在并且是一个命名管道(FIFO)。
-r file : 文件存在并且是可读的。
-s file : 文件存在并且有内容。
-u file : 文件存在并且设置了 setuid。
-w file : 文件存在并且是可写的。
-x file : 文件存在并且是可执行的。
-S file : 文件存在并且是一个 socket。
总结
个人感觉 test 是 Bash 中很重要的命令。在你掌握了基本的脚本编写技能后,通过 test 命令并结合 if 等流程语句你可以控制程序的执行流程,从而开启脚本编程的大门。
Bash : test 命令的更多相关文章
- bash shell命令(2)
在上篇<bash shell命令(1)>中,介绍了几种简单的linux shell命令,今天继续介绍bash shell命令 本文地址:http://www.cnblogs.com/arc ...
- ipython, 一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数
一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数. 若用的是fish s ...
- 第四章:更多的bash shell命令
第四章:更多的bash shell命令 监测程序 ps (其他ps内容见#1 ) Unix风格的ps命令参数 参数 描述 -A 显示所有进程 -N 显示与指定参数不符的所有进程 -a 显示除控制进程( ...
- cmd 与 bash 基础命令入门
身为一个程序员会用命令行来进行一些简单的操作,不是显得很装逼嘛!?嘿嘿~ ヾ(>∀<) cmd 与 bash 基础命令入门 简介 CMD 基础命令 ...
- 《Linux命令行与shell脚本编程大全》- 读书笔记2 - 更多的bash shell命令
更多的bash shell命令 想检测进程,需要熟悉ps命令的用法.ps命令好比工具中的瑞士军刀,它能输出运行在系统上的所有程序的许多信息.默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户 ...
- bash 基础命令
bash的基础特性(): () 命令历史 history 环境变量: HISTSIZE:命令历史记录的条数: HISTFILE:~/.bash_history: HISTFILESIZE:命令历史文件 ...
- 基本bash shell命令
以下列举一些常用的bash shell命令,在使用时方便查找. 访问Linux系统上的手册:man 命令.例:man ps 手册是由分页程序来显示的,可以通过点击 空格,回车,向上和向下箭头 ...
- bash shell命令与监测的那点事(三)
bash shell命令与监测的那点事之df与du 前两篇介绍了bash shell的进程监控指令,但是有时候你需要知道在某个设备上还有多少磁盘空间.首先介绍df命令: df命令 df命令就是用来轻松 ...
- bash shell命令与监测的那点事(二)
bash shell命令与监测的那点事之top 上次我们说到了ps命令,ps命令虽然在收集运行在系统上的进程信息很有用,但是也有不足之处,ps命令只能显示某个特定时间点的信息,如果你想观察频繁换进换出 ...
随机推荐
- Python3 多线程的两种实现方式
最近学习 Python3 ,希望能掌握多线程的使用,在此做个笔记.同时也希望Python 牛人指点错误.关于线程的概念,前面简单总结了一下 java 的多线程,传送门:java 多线程概念,三种创建多 ...
- PHP中如何调试?
比如有个数组: $arr = array('A' => 'bobi','B' => 'hehe'); echo $arr; //Array 只打印出了变量 ...
- 201521123084 《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
- 【Beta】Daily Scrum Meeting——Day5
站立式会议照片 1.本次会议为第五次Meeting会议: 2.本次会议在早上9:35,在陆大2楼机房召开,本次会议为25分钟讨论今天要完成的任务以及接下来的任务安排. 燃尽图 每个人的工作分配 成 员 ...
- 201521123122 《java程序设计》 第六周实验总结
201521123122 <java程序设计>第六周实验总结 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想 ...
- 201521123025<java程序设计>第五周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...
- 201521123036 《Java程序设计》第2周学习总结
本周学习总结 java数据类型: 基本类型:整数,浮点,boolean类 引用类型:数组,类,接口,null类型 String类:String类的对象不可变,字符串API,大量修改字符串使用Strin ...
- 201521123117 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 再起航,我的学习笔记之JavaScript设计模式22(访问者模式)
访问者模式 概念介绍 访问者模式(Visitor): 针对于对象结构中的元素,定义在不改变该对象的前提下访问结构中元素的新方法 解决低版本IE兼容性 我们来看下面这段代码,这段代码,我们封装了一个绑定 ...
- Java:print、printf、println的区别
printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和print基本没什么差别,就是最后会换行 System.out.p ...