zoukankan      html  css  js  c++  java
  • shell中[ ]和[[ ]]命令的区别

    首先要清楚的是在shell中[]和[[]]都是命令,和我们熟悉的ls、cd地位一样shell把它们都认做命令,就是说在命令输入[]和[[]]是不会报错(输入时[]和[[]]中间要空格哦),并且有命令返回状态码的。

    在shell手册中,[]出现在內建命令章节,[[]]出现在条件结构章节。

    http://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-Builtins

    http://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs

    下面简单说下它们的异同。

    相同点:主要应用场景都是用来执行条件表达式的判断。

    不同点:

    1.在[[ ]]中不会进行word splitting和filename expansion,而在[ ]中会进行。

    word splitting和filename expansion是shell的两个特性,直译就是分词和文件名展开,分词一般在参数展开后进行,分词即将一个单元分解成几个单元,文件名展开即将星号展开为当前工作目录下所有的文件。

    当变量a为空时,[ -n $a ]和[ -z $a ]都会返回0,这不是我们期望的结果,原因在于进行参数展开($a)后,会进行word splitting,而a为空,word splitting会移除空值,所以[ -n $a ]和[ -z $a ]实际是执行[ -n ]和[ -z ],而[ ]中仅一个参数时且非空都是返回0的,所以 使用[ ]进行条件判断时,最好加上引号

    2.[[ ]]中使用==,!=,~=时可以进行正则匹配

    buddy@buddy-PC:~$ a="1 2"
    buddy@buddy-PC:~$ [ -n $a ]
    bash: [: 1: 需要二元表达式
    buddy@buddy-PC:~$ [[ -n $a ]]
    buddy@buddy-PC:~$ [ -n "$a" ]
    buddy@buddy-PC:~$ a=
    buddy@buddy-PC:~$ 
    buddy@buddy-PC:~$ [ -n $a ]
    buddy@buddy-PC:~$ echo $?
    0
    buddy@buddy-PC:~$ [ -z $a ]
    buddy@buddy-PC:~$ echo $?
    0
    buddy@buddy-PC:~$ [[ -n $a ]]
    buddy@buddy-PC:~$ echo $?
    1
    buddy@buddy-PC:~$ [[ -z $a ]]
    buddy@buddy-PC:~$ echo $?
    0
    buddy@buddy-PC:~$ 

    buddy@buddy-PC:~$ [[ -n ]]
    bash: 一元条件运算符使用了未预期的参数 `]]'
    bash: `]]' 附近有语法错误
    buddy@buddy-PC:~$

    今天不自律,明天不自由
  • 相关阅读:
    groovy 执行shell
    expect 用法
    shebang解释
    docker 安装
    centos7 lvm添加硬盘后扩展磁盘空间
    scoped的原理和deep深度选择器的妙用
    swagger3
    帮评网
    反射工具
    网络只能传输二进制
  • 原文地址:https://www.cnblogs.com/buddy916/p/10526273.html
Copyright © 2011-2022 走看看