Linux Bash单方括号与双方括号 [和[[的区别

本文参考 Burak Gökmen 的文章 Differences Between Single and Double Brackets in Bash

  1. 单括号 [ 是 shell builtin,即 test 内置命令:
$ type [
[ is a shell builtin
$ [ 3 -eq 3 ] && echo “Numbers are equal”
Numbers are equal
$ test 3 -eq 3 && echo “Numbers are equal”
Numbers are equal

[] 和 test 之间没有任何区别。[ 对于任何 Unix / Linux 系统的 Shell 都可用,因为它是 POSIX 兼容的。
双括号 [[ 是 shell keyword 关键字:

$ type [[
[[ is a shell keyword

[[ 对于绝大多数 Shell 如 Bash、Zsh 等都可用,但是它并非 POSIX 兼容的。

  1. 比较运算符(大于号 > 和小于号 <)在 [[]] 内可以直接使用,但在 [] 内需要转义:
$ [[ 1 < 2 ]] && echo “1 is less than 2”
1 is less than 2
$ [ 1 < 2 ] && echo “1 is less than 2”
bash: 2: No such file or directory
$ [ 1 \< 2 ] && echo “1 is less than 2”
1 is less than 2

这是因为 [] 内将 < 和 > 默认当作是文件重定向符号。

  1. 布尔运算符(且 && 和或 ||)在 [[]] 内可以直接使用,但在 [] 内只能用 -a-o
$ [[ 3 -eq 3 && 4 -eq 4 ]] && echo “Numbers are equal”
Numbers are equal
$ [ 3 -eq 3 -a 4 -eq 4 ] && echo “Numbers are equal”
Numbers are equal
  1. 表达式分组:在 [[]] 内可以直接用圆括号 () 分组,但在 [] 内需要转义:
$ [[ 3 -eq 3 && (2 -eq 2 && 1 -eq 1) ]] && echo “Parentheses can be used”
Parentheses can be used
$ [ 3 -eq 3 -a (2 -eq 2 -a 1 -eq 1) ] && echo “Parentheses can be used”
bash: syntax error near unexpected token ‘(‘
$ [ 3 -eq 3 -a \( 2 -eq 2 -a 1 -eq 1 \) ] && echo “Parentheses can be used”
Parentheses can be used

并且 [] 内的圆括号前后都需要加空格。

  1. 模式匹配仅在 [[]] 内有效,在 [] 内无效:
$ name=”Alice”
$ [[ $name = *c* ]] && echo “Name includes c”
Name includes c
$ echo $?
0
$ [ $name = *c* ] && echo “Name includes c”
$ echo $?
1
  1. 正则表达式仅在 [[]] 内有效,在 [] 内无效:
$ name=”Alice”
$ [[ $name =~ ^Ali ]] && echo ”Regular expressions can be used”
Regular expressions can be used
$ [ $name =~ ^Ali ] && echo ”Regular expressions can be used”
bash: [: =~: binary operator expected

其中,=~ 内置运算符表示正则表达式匹配。

  1. 词分割:如果一个变量是一个包含空格的字符串,那么在 [[]] 内字符串不会被分割成多个词,但是在 [] 内会被分割成多个词:
$ filename=”nonexistent file”
$ [[ ! -e $filename ]] && echo ”File doesn’t exist”
File doesn’t exist
$ [ ! -e $filename ] && echo ”File doesn’t exist”
bash: [: nonexistent: binary operator expected

如果想在 [] 内避免这种情况,需要将变量用双引号包裹:

$ filename=”nonexistent file”
$ [ ! -e “$filename” ] && echo ”File doesn’t exist”
File doesn’t exist

总结而言,[[ 是增强版的 [。如果追求绝对的兼容性,那么应使用 [,但是一般而言追求方便,使用 [[ 即可。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Linux Bash和tcsh是两种常见的Unix/Linux命令行shell。它们有以下几点区别。 1. 历史:Linux Bash是Bourne Again SHell的缩写,是Bourne Shell(sh)的升级版,最初由GNU开发。而tcsh是C Shell(csh)的增强版本,也有小部分来自Bourne Shell(sh)。 2. 语法:Bash和tcsh的语法有一些区别Bash更接近传统的命令行shell,语法更灵活,包括条件语句、循环和函数等。而tcsh更适合作为交互式shell使用,语法更像C语言,并且具有更丰富的命令补全和历史命令功能。 3. 默认设置:Bash和tcsh在默认设置方面也有一些区别Bash更适合作为系统默认shell,因为它支持更广泛的Unix系统,并且可以更好地与系统工具集成。而tcsh通常用于交互式登录shell,因为它提供了更好的用户友好性和用户交互性。 4. 变量和环境:Bash和tcsh在处理变量和环境方面也有一些差异。Bash使用$符号来引用变量,而tcsh使用美元符号和花括号,例如$var或${var}。此外,它们对于环境变量的设置和使用方式也稍有不同。 5. 自定义:Bash和tcsh都支持自定义配置文件。Bash使用.bashrc和.bash_profile文件,而tcsh使用.tcshrc和.login文件。这些文件可以用来配置环境变量、命令别名、函数和运行时设置等。 总之,Linux Bash和tcsh都是功能强大的命令行shell,但适用于不同的使用场景和偏好。选择哪个取决于你对shell的需求和个人喜好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ayka

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值