什么';Bash中[and[]的区别是什么?
我查看了bash手册页,其中什么';Bash中[and[]的区别是什么?,bash,Bash,我查看了bash手册页,其中[说明它使用了条件表达式。然后我查看了条件表达式部分,它列出了与test(和[)相同的运算符 所以我想知道,Bash中的[和[有什么区别?在Bash中,与[相反,[防止了变量值的分词。[是Bash对的改进[命令。它有几个增强功能,如果您编写的脚本以bash为目标,它将是一个更好的选择。我最喜欢的是: 它是shell的一个语法特性,因此它有一些特殊的行为,[没有。你不再需要像疯狂一样引用变量,因为[更直观地处理空字符串和带空格的字符串。例如,对于[,你必须编写 if [
[
说明它使用了条件表达式。然后我查看了条件表达式部分,它列出了与test
(和[
)相同的运算符
所以我想知道,Bash中的
[
和[
有什么区别?在Bash中,与[
相反,[
防止了变量值的分词。[
是Bash对的改进[
命令。它有几个增强功能,如果您编写的脚本以bash为目标,它将是一个更好的选择。我最喜欢的是:
[
没有。你不再需要像疯狂一样引用变量,因为[
更直观地处理空字符串和带空格的字符串。例如,对于[
,你必须编写
if [ -f "$file" ]
正确处理空字符串或带有空格的文件名。对于[[
不需要引号:
if [[ -f $file ]]
&&
和|
运算符进行布尔测试,并使用
进行字符串比较。[
无法执行此操作,因为它是常规命令,&&
,|
,
不会作为命令行参数传递给常规命令=~
操作符,用于进行正则表达式匹配
if [ "$answer" = y -o "$answer" = yes ]
使用[[
您可以将其编写为
if [[ $answer =~ ^y(es)?$ ]]
它甚至允许您访问存储在BASH\u REMATCH
中的捕获组。例如,${BASH\u REMATCH[1]}
如果您在上面键入完整的“yes”,则将是“es”if [[ $ANSWER = y* ]]
[
。如果使用双括号,请确保您的脚本有#!/bin/bash
shebang行
另见
与[
内置相同,工作原理类似于测试
二进制(人工测试)测试
- 在许多类似UNIX的环境中,在所有其他基于sh的shell中的工作原理与
大致相同[
- 仅支持单个条件。使用bash
和&&
运算符的多个测试必须放在单独的括号中|
- 本机不支持“not”运算符。若要反转条件,请在第一个括号外使用
以使用shell的工具反转命令返回值!
和=
是文本字符串比较!=
- 在许多类似UNIX的环境中,在所有其他基于sh的shell中的工作原理与
是一个bash[[
- 是特定于bash的,尽管其他shell可能已经实现了类似的构造
和=
应用bash模式匹配规则,请参阅!=
man bash中的“模式匹配”
- 具有
正则表达式匹配运算符=~
- 允许使用括号和括号内的
、!
和&&
逻辑运算符组合子表达式|
除此之外,它们非常相似——大多数单独的测试在它们之间工作相同,只有当您需要将不同的测试与逻辑AND/OR/NOT操作相结合时,事情才会变得有趣。最重要的区别在于代码的清晰性。是的,是的,上面所说的是正确的,但是[]]使您的代码符合您在高级语言中的期望,特别是关于AND(&&),或(|),而不是(!)操作员。因此,当您在系统和语言之间移动时,您将能够更快地解释脚本,从而使您的生活更轻松。从一个好的UNIX/Linux参考资料中获取细节。您可能会发现某些细节在某些情况下很有用,但您将始终欣赏清晰的代码!您更喜欢哪个脚本片段阅读?即使脱离上下文,第一个选择也更容易阅读和理解
或
很好,除了[[在ksh和最近的POSIX sh specifications.FWIW中也存在]之外,可以进入
[
或[
中的条件表达式集(如-f
,-z
等)的引用位于@Darron,我在特定服务器中使用Ubuntu,我的sh(实际上是dash版本0.5.8)不支持[[测试支持使用-a和-o的多个条件。此外,它还具有not运算符,例如if[!-z x];然后是回音Y;fi@AnthonyRutledge你能更具体地说明你的意思吗?为什么?对于那些登陆这里想知道键入什么来查看-n
、-z
、-ge
、-eq
、-d
等手册页的人来说,答案是人测
。尽管其他答案在技术上是正确的,但这是唯一的答案只有一个是完全正确的。“最重要的区别在于代码的清晰性。”:不,区别在于[
是一个命令,而[
是一个语法元素(“保留字”)。因此不同的解析。不?我只是说实际的区别。[[]]如果我没有弄错的话,
是通往的捷径。说到底,确实存在语法上的差异,但对于外行来说,最重要的是阅读的方便性和可维护性。因此,这就是为什么我说“最重要”,而不是“仅”或“根据具体书籍”的差异。
if [[ -d $newDir && -n $(echo $newDir | grep "^${webRootParent}") && -n $(echo $newDir | grep '/$') ]]; then ...
if [ -d "$newDir" -a -n "$(echo "$newDir" | grep "^${webRootParent}")" -a -n "$(echo "$newDir" | grep '/$')" ]; then ...