在 Bash 脚本中我们一般会使用 test 命令来进行条件检查。test 命令的返回值为 0 或 1。0 表示 true, 1 表示 false。简单起见,我们可以直接认为 test 的结果为 true 或 false。

还可以使用中括号代替 test,需要注意的是括号和表达式之间一定要留有空格,所以下面的两种写法是等同的:

  1. test "$1" = "$name"

  2. [ "$1" = "$name" ]

test 命令的主要用途是检查字符串、比较整数和检查文件的属性。本文将通过简单的示例介绍 test 命令的常见用法。

检查字符串

判断字符串是否为空

test 检查字符串时,非空的字符串返回 true,空字符串或者没有参数都返回 false。

  1. if test "$abc"; then
  2. echo "It's not an empty string."
  3. else
  4. echo "It's an empty string."
  5. fi

运行上面代码的输出结果为:

  1. It's an empty string.

这是因为我们没有定义变量 abc ,所以 "$abc" 被解释成了空字符串。

其实使用检查空字符串的运算符 -n 会让代码具有更清晰的含义:

  1. if test -n "$abc"; then
  2. echo "It's not an empty string."
  3. else
  4. echo "It's an empty string."
  5. fi

-n 的含义为:字符串的长度不为 0 时返回 true。所以这段代码的输出结果和上面一样。

如果我们需要判断一个空的字符串可以直接使用运算符 -z:

  1. if test -z "$abc"; then
  2. echo "It's an empty string."
  3. fi

这段代码输出的结果仍然是:

  1. It's an empty string.

判断字符串相等

test 支持两个运算符来判断字符串相等:= 和 ==。

  1. abc="hello"
  2. if test "hello" == "$abc"; then
  3. echo "You got same string."
  4. fi

运行上面代码的输出结果为:

  1. You got same string.

因为 = 看起来更像是在赋值,所以我更倾向于使用 ==。但是当你的脚本需要跨平台时,最好还是使用 =(test 中的 = 是 POSIX 标准定义的!)。

如果要判断两个字符串不相等,可以使用 != 运算符:

  1. abc="helloo"
  2. if test "hello" != "$abc"; then
  3. echo "Your word is not 'hello'."
  4. fi

运行上面代码的输出结果为:

  1. Your word is not 'hello'.

为什么用双引号把变量包起来?

如果你留意前面的代码会发现我们在引用变量时都用双引号包起来了,这是写 shell 脚本中的一个小技巧。尝试运行下面的代码:

  1. abc="hello xx"
  2. if test "hello" != $abc; then
  3. echo "Your word is not 'hello'."
  4. fi

会提示语法错误:

因为变量 abc 的值为 "hello xx",在字符串中间有个空格。所以在 Bash 进行命令解释的时候,上面的 test 命令变成了:

  1. test "hello" != hello xx

这不是一个合法的 test 命令,所以脚本执行时就报错了!

其实不光是空格,包含在 $IFS 中的其它字符,还有变量为空时,都会造成语法错误。所以使用双引号包裹变量是一种保护机制,可以提高脚本的健壮性。

比较数字(整数)

test 支持整数间的比较操作,可用的运算符有 '-eq','-ne','-lt','-le','-gt','-ge'。
比如判断两个整数相等可以使用 -eq 运算符:

  1. num=
  2. if test "$num" -eq ; then
  3. echo "num is 3."
  4. fi

运行上面代码的输出结果为:

  1. num is .

常见数字运算符的含义分别为:

  1. n1 -eq n2 : 整数 n1 等于 n2
  2. n1 -ne n2 : 整数 n1 不等于 n2
  3. n1 -lt n2 : n1 小于 n2
  4. n1 -gt n2 : n1 大于 n2
  5. n1 -le n2 : n1 小于或等于 n2
  6. n1 -ge n2 : n1 大于或等于 n2

检查文件属性

检查文件的属性也是 test 常见用法。比如要检查一个文件的类型是不是普通文件,可以使用 -f 选项:

  1. touch test.sh
  2. filename="test.sh"
  3. if test -f "$filename"; then
  4. echo "It's a regular file."
  5. fi

运行上面代码的输出结果为:

  1. It's a regular file.

另一个重要的选项是 -d,它用来检查一个路径是不是目录:

  1. dirname="/bin"
  2. if test -d "$dirname"; then
  3. echo "It's a directory."
  4. fi

运行上面代码的输出结果为:

  1. It's a directory.

如果是仅仅判断一个路径是否存在,可以使用 -e 运算符。它仅检查文件是否存在而不关心文件的具体类型。

下面是其它一些常用的文件检查运算符:

  1. -b file : 文件存在并且是块设备文件。
  2. -c file : 文件存在并且是字符设备文件。
  3. -d file : 文件存在并且是一个目录。
  4. -e file : 文件存在。
  5. -f file : 文件存在并且是一般文件。
  6. -g file : 文件存在并且设置了 setgid 位。
  7. -h file : 文件存在并且是一个链接文件。
  8. -p file : 文件存在并且是一个命名管道(FIFO)。
  9. -r file : 文件存在并且是可读的。
  10. -s file : 文件存在并且有内容。
  11. -u file : 文件存在并且设置了 setuid
  12. -w file : 文件存在并且是可写的。
  13. -x file : 文件存在并且是可执行的。
  14. -S file : 文件存在并且是一个 socket

总结

个人感觉 test 是 Bash 中很重要的命令。在你掌握了基本的脚本编写技能后,通过 test 命令并结合 if 等流程语句你可以控制程序的执行流程,从而开启脚本编程的大门。

Bash : test 命令的更多相关文章

  1. bash shell命令(2)

    在上篇<bash shell命令(1)>中,介绍了几种简单的linux shell命令,今天继续介绍bash shell命令 本文地址:http://www.cnblogs.com/arc ...

  2. ipython, 一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数

    一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数. 若用的是fish s ...

  3. 第四章:更多的bash shell命令

    第四章:更多的bash shell命令 监测程序 ps (其他ps内容见#1 ) Unix风格的ps命令参数 参数 描述 -A 显示所有进程 -N 显示与指定参数不符的所有进程 -a 显示除控制进程( ...

  4. cmd 与 bash 基础命令入门

    身为一个程序员会用命令行来进行一些简单的操作,不是显得很装逼嘛!?嘿嘿~ ヾ(>∀<) cmd 与 bash 基础命令入门       简介       CMD 基础命令          ...

  5. 《Linux命令行与shell脚本编程大全》- 读书笔记2 - 更多的bash shell命令

    更多的bash shell命令 想检测进程,需要熟悉ps命令的用法.ps命令好比工具中的瑞士军刀,它能输出运行在系统上的所有程序的许多信息.默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户 ...

  6. bash 基础命令

    bash的基础特性(): () 命令历史 history 环境变量: HISTSIZE:命令历史记录的条数: HISTFILE:~/.bash_history: HISTFILESIZE:命令历史文件 ...

  7. 基本bash shell命令

    以下列举一些常用的bash shell命令,在使用时方便查找. 访问Linux系统上的手册:man 命令.例:man ps      手册是由分页程序来显示的,可以通过点击 空格,回车,向上和向下箭头 ...

  8. bash shell命令与监测的那点事(三)

    bash shell命令与监测的那点事之df与du 前两篇介绍了bash shell的进程监控指令,但是有时候你需要知道在某个设备上还有多少磁盘空间.首先介绍df命令: df命令 df命令就是用来轻松 ...

  9. bash shell命令与监测的那点事(二)

    bash shell命令与监测的那点事之top 上次我们说到了ps命令,ps命令虽然在收集运行在系统上的进程信息很有用,但是也有不足之处,ps命令只能显示某个特定时间点的信息,如果你想观察频繁换进换出 ...

随机推荐

  1. C# 文件的上传和下载

    本文主要介绍一下,在APS.NET中文件的简单上传于下载,上传是将文件上传到服务器的指定目录下,下载是从存入数据库中的路径,从服务器上下载. 1.上传文件 (1)页面代码 <table alig ...

  2. 自制ACL+DHCP实验(初版)

    (实验用gns模拟器) ACL 实验拓扑: 实验要求: 1.1.1.1→3.3.3.3 不通 11.11.11.11→3.3.3.3 通 2.2.2.2→3.3.3.3 通 实验步骤: 步骤一:基本配 ...

  3. Vue项目搭建基础之Vue-cli模版测试

    第一步安装node,nodejs.org下载node稳定版安装包.node -v   (查看node版本)npm install -g vue-cli(安装Vue脚手架环境)vuevue listvu ...

  4. 三种计算c#程序运行时间的方法

    三种计算c#程序运行时间的方法 第一种: 利用 System.DateTime.Now // example1: System.DateTime.Now method DateTime dt1 = S ...

  5. Java学习6——基本数据类型及其转换

    Java常量: Java的常量值用字符串表示,区分不同的数据类型 整型常量123.浮点型常量3.14.字符常量'a'.逻辑常量true.字符串常量"helloworld". ps: ...

  6. 201521123045 《Java程序设计》第4周学习总结

    第4周作业-面向对象设计与继承 1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 2. 书面作业 Q1.注释的应用使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclip ...

  7. JAVA课设--五子棋--团队博客

    1 团队名称.团队成员介绍 徐璐琳 网络1511班 201521123010 祁泽文 网络1511班 201521123011 张晨晨 网络1511班 201521123009 2 项目git地址 团 ...

  8. EntityFramework 6.x多个上下文迁移实现分布式事务

    前言 自从项目上了.NET Core平台用上了EntityFramework Core就再没碰过EntityFramework 6.x版本,目前而言EntityFramework 6.x是用的最多,无 ...

  9. CSS3 animation-timing-function steps()

    animation-timging-function 主要是控制css动画从开始到结束的速度. linear:线性过渡.等同于贝塞尔曲线(0.0, 0.0, 1.0, 1.0) ease:平滑过渡.等 ...

  10. Codeforces 845 A. Chess Tourney 思路:简单逻辑题

    题目: 题意:输入一个整数n,接着输入2*n个数字,代表2*n个选手的实力.    实力值大的选手可以赢实力值小的选手,实力值相同则都有可能赢.    叫你把这2*n个选手分成2个有n个选手的队伍. ...