在Bash中使用[方括号](二)

系统 Linux
我们继续来看方括号的用法,它们甚至还可以在 Bash 当中作为一个命令使用。在前一篇文章当中,我们介绍了方括号在命令行中可以用于通配操作,如果你已经读过前一篇文章,就可以从这里继续了。

[[263170]]

我们继续来看方括号的用法,它们甚至还可以在 Bash 当中作为一个命令使用。

欢迎回到我们的方括号专题。在前一篇文章当中,我们介绍了方括号在命令行中可以用于通配操作,如果你已经读过前一篇文章,就可以从这里继续了。

方括号还可以以一个命令的形式使用,就像这样:

  1. [ "a" = "a" ]

上面这种 [ ... ] 的形式就可以看成是一个可执行的命令。要注意,方括号内部的内容 "a" = "a" 和方括号 [] 之间是有空格隔开的。因为这里的方括号被视作一个命令,因此要用空格将命令和它的参数隔开。

上面这个命令的含义是“判断字符串 "a" 和字符串 "a" 是否相同”,如果判断结果为真,那么 [ ... ] 就会以状态码status code 0 退出,否则以状态码 1 退出。在之前的文章中,我们也有介绍过状态码的概念,可以通过 $? 变量获取到最近一个命令的状态码。

分别执行

  1. [ "a" = "a" ]
  2. echo $?

以及

  1. [ "a" = "b" ]
  2. echo $?

这两段命令中,前者会输出 0(判断结果为真),后者则会输出 1(判断结果为假)。在 Bash 当中,如果一个命令的状态码是 0,表示这个命令正常执行完成并退出,而且其中没有出现错误,对应布尔值 true;如果在命令执行过程中出现错误,就会返回一个非零的状态码,对应布尔值 false。而 [ ... ] 也同样遵循这样的规则。

因此,[ ... ] 很适合在 if ... thenwhileuntil 这种在代码块结束前需要判断是否达到某个条件结构中使用。

对应使用的逻辑判断运算符也相当直观:

  1. [ STRING1 = STRING2 ] => 检查字符串是否相等
  2. [ STRING1 != STRING2 ] => 检查字符串是否不相等
  3. [ INTEGER1 -eq INTEGER2 ] => 检查整数 INTEGER1 是否等于 INTEGER2
  4. [ INTEGER1 -ge INTEGER2 ] => 检查整数 INTEGER1 是否大于等于 INTEGER2
  5. [ INTEGER1 -gt INTEGER2 ] => 检查整数 INTEGER1 是否大于 INTEGER2
  6. [ INTEGER1 -le INTEGER2 ] => 检查整数 INTEGER1 是否小于等于 INTEGER2
  7. [ INTEGER1 -lt INTEGER2 ] => 检查整数 INTEGER1 是否小于 INTEGER2
  8. [ INTEGER1 -ne INTEGER2 ] => 检查整数 INTEGER1 是否不等于 INTEGER2
  9. 等等……

方括号的这种用法也可以很有 shell 风格,例如通过带上 -f 参数可以判断某个文件是否存在:

  1. for i in {000..099}; \
  2. do \
  3. if [ -f file$i ]; \
  4. then \
  5. echo file$i exists; \
  6. else \
  7. touch file$i; \
  8. echo I made file$i; \
  9. fi; \
  10. done

如果你在上一篇文章使用到的测试目录中运行以上这串命令,其中的第 3 行会判断那几十个文件当中的某个文件是否存在。如果文件存在,会输出一条提示信息;如果文件不存在,就会把对应的文件创建出来。最终,这个目录中会完整存在从 file000file099 这一百个文件。

上面这段命令还可以写得更加简洁:

  1. for i in {000..099};\
  2. do\
  3. if [ ! -f file$i ];\
  4. then\
  5. touch file$i;\
  6. echo I made file$i;\
  7. fi;\
  8. done

其中 ! 运算符表示将判断结果取反,因此第 3 行的含义就是“如果文件 file$i 不存在”。

可以尝试一下将测试目录中那几十个文件随意删除几个,然后运行上面的命令,你就可以看到它是如何把被删除的文件重新创建出来的。

除了 -f 之外,还有很多有用的参数。-d 参数可以判断某个目录是否存在,-h 参数可以判断某个文件是不是一个符号链接。可以用 -G 参数判断某个文件是否属于某个用户组,用 -ot 参数判断某个文件的***更新时间是否早于另一个文件,甚至还可以判断某个文件是否为空文件。

运行下面的几条命令,可以向几个文件中写入一些内容:

  1. echo "Hello World" >> file023
  2. echo "This is a message" >> file065
  3. echo "To humanity" >> file010

然后运行:

  1. for i in {000..099};\
  2. do\
  3. if [ ! -s file$i ];\
  4. then\
  5. rm file$i;\
  6. echo I removed file$i;\
  7. fi;\
  8. done

你就会发现所有空文件都被删除了,只剩下少数几个非空的文件。

如果你还想了解更多别的参数,可以执行 man test 来查看 test 命令的 man 手册(test[ ... ] 的命令别名)。

有时候你还会看到 [[ ... ]] 这种双方括号的形式,使用起来和单方括号差别不大。但双方括号支持的比较运算符更加丰富:例如可以使用 == 来判断某个字符串是否符合某个模式pattern,也可以使用 <> 来判断两个字符串的出现顺序。

可以在 Bash 表达式文档中了解到双方括号支持的更多运算符。

责任编辑:庞桂玉 来源: Linux中国
相关推荐

2019-04-15 11:10:34

Bash方括号命令行

2023-01-13 12:37:43

Bashshell花括号

2020-10-13 19:04:58

Bash信号捕获Shell脚本

2023-07-20 15:37:50

Bash数组

2022-12-02 14:30:24

Bash脚本数组

2023-07-12 14:13:03

BashLinux

2022-12-14 10:08:00

BashLinux

2022-01-16 07:48:33

脚本Bash 工具

2023-03-14 08:17:40

Bash编程语言

2020-04-09 10:18:51

Bash循环Linux

2022-11-23 08:14:42

bash 脚本test 命令

2020-02-05 14:17:48

Python数据结构JavaScript

2020-02-05 16:37:06

方括号Python方法

2019-02-12 15:47:42

Bash尖括号命令

2019-03-18 15:53:11

BashLinux花括号

2018-12-14 10:00:16

BashLinux命令

2019-10-22 17:33:57

LinuxBash脚本

2009-06-25 16:49:24

Hibernate

2023-11-17 12:04:39

GORM并发

2023-04-12 15:25:09

Bytrace鸿蒙
点赞
收藏

51CTO技术栈公众号