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

发布者:上海IT外包来源:http://www.lanmon.net点击数:1112

让我们继续看看方括号的使用,它甚至可以用作Bash中的命令。
欢迎回到方括号主题。在上一篇文章中,我们介绍了方括号可用于命令行上的通配符操作。如果您已阅读上一篇文章,可以从此处继续。
方括号也可以以命令的形式使用,如下所示:
['a'='a']
上述形式可视为可执行命令。请注意,方括号'a'='a'和方括号[]内的内容用空格分隔。因为此处的方括号被视为单个命令,所以将命令与带有空格的参数分开。
上述命令的含义是“判断字符串'a'和字符串'a'是否相同”。如果判断结果为真,则[...]将以状态代码状态代码0退出,否则状态代码1将退出。在上一篇文章中,我们还介绍了一个状态代码的概念,它可以从$?获得。变量到最近命令的状态代码。
单独执行
['a'='a']
回声$?
以及
['a'='b']
回声$?
在这两个命令中,前者输出0(判断结果为真),后者输出1(判断结果为假)。在Bash中,如果命令的状态代码为0,则表示该命令正常执行并退出,并且没有错误,对应于布尔值true;如果在执行命令期间发生错误,它将返回非零状态。代码,对应于布尔值false。 [...]也遵循这些规则。
因此,[...]非常适合用于if ... then,while,或者直到有必要确定在代码块结束之前是否达到条件结构。
相应的逻辑判断运算符也非常直观:
[STRING1=STRING2]=>
检查字符串是否相等
[STRING1!=STRING2]=>检查字符串是否不相等
[INTEGER1 -eq INTEGER2]=>
检查整数INTEGER1是否等于INTEGER2
[INTEGER1 -ge INTEGER2]=>
检查整数INTEGER1是否大于或等于INTEGER2
[INTEGER1 -gt INTEGER2]=>
检查整数INTEGER1是否大于INTEGER2
[INTEGER1 -le INTEGER2]=>
检查整数INTEGER1是否小于或等于INTEGER2
[INTEGER1 -lt INTEGER2]=>
检查整数INTEGER1是否小于INTEGER2
[INTEGER1 -ne INTEGER2]=>
检查整数INTEGER1是否不等于INTEGER2
还有很多……
方括号的这种用法也可以是非常shell样式的,例如通过使用-f参数来确定文件是否存在:
我在{000..099}; \
做\
如果[-f file $ i]; \
然后 \
回声文件$ i存在; \
其他
触摸文件$ i; \
Echo我发了$ i文件; \
网络连接;
完成
如果在上一篇文章中使用的测试目录中运行上述命令,则第三行将确定是否存在数十个文件中的一个。如果文件存在,将输出一条消息;如果文件不存在,将创建相应的文件。最终,此目录中将有一个完整的文件从file000到file099。
上面的命令也可以更简洁地编写:
我在{000..099}; \
做\
如果[! -f file $ i]; \
然后\
触摸文件$ i; \
Echo我发了$ i文件; \
网络连接; \
完成
的!运算符表示判断结果被否定,因此第三行的含义是“如果文件文件$ i不存在”。
您可以尝试删除测试目录中的几十个文件中的一些,然后运行上面的命令,您可以看到它如何重新创建已删除的文件。
除了-f之外,还有许多有用的参数。 -d参数可以确定目录是否存在,-h参数可以确定文件是否是符号链接。您可以使用-G参数来确定文件是否属于用户组,使用-ot参数来确定文件的上次更新时间是否早于其他文件,甚至可以确定文件是否为空。您可以通过运行以下命令将内容写入多个文件:
回声'Hello World'>
>
File023
Echo'这是一条消息'>
>
File065
回应'致人性'>
>
File010
然后运行:
我在{000..099}; \
做\
如果[! -s file $ i]; \
然后\
Rm文件$ i; \
Echo我删除了文件$ i; \
网络连接; \
完成
您会发现所有空文件都已删除,只留下一些非空文件。
如果您想了解有关其他参数的更多信息,可以运行man test以查看test命令的man手册(test是[...]的命令别名)。
有时您也会以括号的形式看到[[...]],与单括号没有太大区别。但是,括号支持的比较运算符更丰富:例如,您可以使用==来确定字符串是否符合模式模式,或者您可以使用它来确定两个字符串出现的顺序。
您可以在Bash表达式文档中了解有关括号支持的运算符的更多信息。
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部