在写脚本的时候,总是搞不懂[] [[]]的区别,这次写一个总结,把它掌握牢固 []和test 两者是一样的,在命令行里test expr和[ expr ]的效果相同。 test的三个基本作用是判断文件、判断字符串、判断整数。支持使用 ”与或非“ 将表达式连接起来。 test中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq, -gt这种形式。 无论是字符串比较还是整数比较都千万不要使用大于号小于号。当然,如果你实在想用也是可以的,对于字符串比较可以使用尖括号的转义形式, 如果比较”ab”和”bc”:[ ab \< bc ],结果为真,也就是返回 在编写Shell脚本时,了解`[]`和`[[ ]]`的区别至关重要,因为它们在条件判断和表达式处理上有着不同的特性和用法。本文将深入解析这两种结构以及相关的`-n`和`-z`选项。 `[]`(也称为`test`)是一个命令,用于执行各种条件测试,例如检查文件属性、字符串和数字的比较。`test`与`[ expr ]`是等价的,它们在命令行中都可以使用。在`test`中,字符串比较仅限于`==`和`!=`运算符,而整数比较则需要使用如`-eq`, `-gt`这样的特殊运算符。值得注意的是,不应在`test`或`[]`中直接使用大于号`>`和小于号`<`进行比较,除非在字符串比较时使用转义形式,例如`[ ab \< bc ]`。 另一方面,`[[ ]]`是bash shell中的一个内置关键字,它提供了更丰富的功能和更灵活的语法。`[[ ]]`支持字符串模式匹配,包括正则表达式(使用`=~`操作符)。在`[[ ]]`中,逻辑运算符`&&`和`||`可以直接使用,而不需要像`-a`和`-o`这样的选项。此外,`[[ ]]`在字符串比较时可以将右侧视为模式,例如`[[ hello == hell? ]]`将返回真。然而,要注意的是,在`[[ ]]`中,比较操作的两侧应留有空格,否则可能会导致意外的结果,例如`[[ 1==2 ]]`会被解释为一个整数而非比较操作。 `(( ))`结构则是用于执行算术扩展,它计算表达式的值,并根据结果返回退出状态码。如果表达式为0,则返回1(假),非零值返回0(真)。 在使用`[]`时,字符串比较中的`>`和`<`需要转义,以防止被解释为输入/输出重定向。而在`[[ ]]`中,这些符号不需要转义,因为它不进行命令扩展。`[[ ]]`还允许更严格的语法,例如,它不允许在操作符周围使用引号,而`[ ... ]`则可以。 在实际应用中,`-z`和`-n`选项用于检查变量是否为空。`-z`用于测试变量的长度是否为零,即变量是否为空。如果变量为空,`-z`返回真(0),否则返回假(1)。`-n`则相反,它检查变量是否有非零长度,即变量是否非空。如果变量有内容,`-n`返回真(0),否则返回假(1)。 在多个条件判断时,`[[ ]]`支持使用`&&`和`||`进行逻辑连接,而不需要`-a`和`-o`。例如,`[[ 5 -lt 3 || 3 -gt 6 ]]`表示5小于3或3大于6,只要满足其中一个条件,整个表达式就为真。相比之下,`[ ... -a ... -a ... ]`要求所有条件都必须满足才为真,这类似于`&&`的逻辑。 理解`[]`和`[[ ]]`的区别以及它们在条件判断中的用法是编写高效、健壮的Shell脚本的基础。正确使用这些结构和选项可以避免潜在的逻辑错误,提高脚本的可读性和可靠性。
- 粉丝: 6
- 资源: 976
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助