当前位置: 首页 > 科技观察

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

时间:2023-03-15 16:14:52 科技观察

让我们继续看方括号的用法,它们甚至可以在Bash中用作命令。欢迎回到我们关于方括号的主题。在上一篇文章中,我们介绍了方括号可以用于命令行的通配符操作。如果您已阅读上一篇文章,则可以从此处继续。方括号也可以用在命令的形式中,像这样:["a"="a"]以上形式的[...]可以看作是一个可执行的命令。需要注意的是,方括号“a”=“a”和方括号[,]里面的内容是用空格隔开的。因为这里的方括号是作为命令来处理的,所以应该用一个空格来分隔命令和它的参数。上面命令的意思是“判断字符串“a”和字符串“a”是否相同”,如果判断结果为真,则[...]退出,状态码为0,否则退出状态码1退出。在上一篇文章中,我们也介绍了状态码的概念。可以通过$?获取最新命令的状态码。多变的。执行["a"="a"]echo$?和["a"="b"]echo$?分别前者输出0(判断结果为真),后者输出1(判断结果为假)。在Bash中,如果一条命令的状态码为0,则表示该命令正常执行并退出,没有错误,对应布尔值true;如果命令执行过程中出现错误,将返回一个非零状态的Code,对应布尔值false。而[...]也遵循这个规则。因此,[...]非常适合用在if...then、while或until等需要在代码块结束前判断是否达到某个条件的结构。对应的逻辑判断运算符也比较直观:[STRING1=STRING2]=>检查字符串是否相等[STRING1!=STRING2]=>检查字符串是否不相等[INTEGER1-eqINTEGER2]=>检查整数是否INTEGER1等于INTEGER2[INTEGER1-geINTEGER2]=>检查整数INTEGER1是否大于或等于INTEGER2[INTEGER1-gtINTEGER2]=>检查整数INTEGER1是否大于INTEGER2[INTEGER1-leINTEGER2]=>检查整数是否INTEGER1小于或等于INTEGER2[INTEGER1-ltINTEGER2]=>检查整数INTEGER1是否小于INTEGER2[INTEGER1-neINTEGER2]=>检查整数INTEGER1是否不等于INTEGER2,等等...这个用法方括号的也可以很shell风格,比如可以通过加-f参数来判断文件是否存在:foriin{000..099};\做\如果[-f文件$i];\然后\echofile$i存在;\其他\触摸文件$i;\echo我制作了文件$i;\fi;\done如果在上一篇中使用的test目录下运行上面这串命令,其中第三行会判断这几十个文件中是否存在一个文件。如果文件存在,则输出提示信息;如果该文件不存在,将创建相应的文件。最终,该目录下会出现从file000到file099的一百个文件。上面的命令也可以写得更简洁:foriin{000..099};\do\if[!-ffile$i];\then\touchfile$i;\echo我做了file$i;\fi;\done其中,!运算符的意思是将判断结果取反,所以第3行的意思是“如果文件file$i不存在”。你可以尝试随意删除test目录下的几十个文件中的几个,然后运行上面的命令,你可以看到它是如何重新创建被删除的文件的。除了-f,还有很多有用的参数。-d参数可以判断一个目录是否存在,-h参数可以判断一个文件是否是符号链接。可以使用-G参数判断一个文件是否属于某个用户组,使用-ot参数判断一个文件的最新更新时间是否早于另一个文件,甚至可以判断一个文件是否为空文件.运行以下命令将一些内容写入多个文件:echo"HelloWorld">>file023echo"Thisisamessage">>file065echo"Tohumanity">>file010然后运行:foriin{000..099};\做\如果[!-sfile$i];\then\rmfile$i;\echo我删除了file$i;\fi;\done你会发现所有的空文件都被删除了,只剩下几个非空文件。如果想进一步了解其他参数,可以执行mantest查看test命令的man手册(test是[...]的命令别名)。有时你还会看到双方括号形式的[[...]],这在使用上与单方括号没有太大区别。但是,方括号支持的比较运算符更加丰富:比如可以用==判断一个字符串是否匹配某个pattern模式,或者用<、>判断两个字符串出现的先后顺序。您可以在Bash表达式文档中阅读更多方括号支持的运算符。