文章目录

  • 语法
    • 注意事项
  • [[ ]] 不需要注意某些细枝末节
  • [[ ]]支持逻辑运算符
  • [[ ]]支持正则表达式
  • [[ ]]用法总结

[[ ]]是shell内置关键字,它和test命令类似,也用来检测某个条件是否成立。同时test能做到的,[[ ]]也能做到,而且[[ ]]做的更好。test做不到的,[[ ]]还能做到。可以认为[[ ]]是test的升级版,对细节进行了优化,并且扩展了一些功能

语法

当[[ ]]判断expr成立时,退出状态为0,否则为非0值。这也和shell if语句对应上(true为0,false为非0)

[[ expr ]]

注意事项

  1. [[ ]]和expr之间有两个空格,这两个空格是必须的,否则会导致语法错误
  2. [[ ]]对数字的比较仍然不友好,建议使用if判断条件时,用(())来处理整型数字,用[[ ]]来处理字符串或者文件

[[ ]] 不需要注意某些细枝末节

[[ ]]是shell内置关键字,不是命令,所以不需要注意某些细枝末节。具体包括:

  • 不需要把变量名用双引号""包围起来,即使变量是空值,也不会出错
  • 不需要、也不能对 >、< 进行转义,转义后会出错
#!/bin/bashread -p "input str 1: " str1
read -p "input str 2: " str2if [[ -z $str1 || -z $str2 ]]       #不需要对变量名加双引号
thenecho "str cannot be null"
elif [[ $str1 < $str2 ]]            #不需要也不能对 < 进行转义
thenecho "str1 < str2"
elseecho "str1 >= str2"
fi

[[ ]]支持逻辑运算符

对多个表达式进行逻辑运算时,可以使用逻辑运算符将多个test命令连接起来,例如:

[ -z "$str1" ] || [ -z "$str2" ]

你也可以借助选项把多个表达式写在一个test命令中,例如:

[ -z "$str1" -o -z "$str2" ]

但是,这两种写法都有点“别扭”,完美的写法是在一个命令中使用逻辑运算符将多个表达式连接起来。[[ ]]支持’&&’ ‘||’ '!'三种逻辑运算符。使用 [[ ]]对上面的语句进行改进:

[[ -z $str1 || -z $str2 ]]

[[ ]]剔除了test命令的-o和-a选项,只能使用’||’ ‘&&’。这意味着,不能写成下面的形式:

[[ -z $str1 -o -z $str2 ]]

使用逻辑运算符将多个[[ ]]连接起来依然是可以的,因为这是shell本身提供的功能,跟[[ ]]或者test没有关系,如下所示:

[[ -z $str1 ]] || [[ -z $str2 ]]

[[ ]]支持正则表达式

在[[ ]]中,可以使用’=~'来检测字符串是否符合某个正则表达式

[[ str =~ regex ]]

下面的代码检测一个字符串是否是手机号

#!/bin/bashread -p "input a phone number: " telif [[ $tel =~ ^1[0-9]{10}$ ]]
thenecho "it's a phone number"
elseecho "it's not a phone number"
fi

对^1[0-9]{10}$的说明:

  • ^匹配字符串的开头(一个位置)
  • [0-9]{10}匹配连续的十个数字
  • $匹配字符串的末尾(一个位置)

[[ ]]用法总结

测试内容 [ ] [[ ]]
数字测试 -eq -ne -lt -le -gt -ge 同[ ]
文件测试 -r -l -w -x -f -d -s -nt -ot等 同[ ]
字符测试 = != -n -z \> \<,不可以使用>=和<= 同[ ],<和>不需要转义
逻辑测试 -a -o ! && || !
数字运算 不可以使用 + - * / %

shell - [[ ]]相关推荐

  1. jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理

    准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...

  2. Linux shell 学习笔记(16)— shell 入门总结

    1. Shell 变量 Shell 变量包括自定义变量和环境变量: 自定义变量:脚本中自己命名定义的变量,通常为局部变量,其他 Shell 程序不能访问到: 环境变量,操作系统已定义的变量,如 PAT ...

  3. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

    1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...

  4. Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务

    1. 处理信号 1.1 Linux 信号 常见的 Linux 信号如下表所示: 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 终止进程 3 SIGQUIT 停止进程 9 SIGKILL ...

  5. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  6. Linux shell 学习笔记(10)— 处理用户输入(命令行读取参数、读取用户输入、超时处理)

    1. 命令行参数 向 shell 脚本传递数据的最基本方法是使用命令行参数.命令行参数允许在运行脚本时向命令行添加数据. $ ./addem 10 30 本例向脚本 addem 传递了两个命令行参数( ...

  7. Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符

    1. for 语句 bash shell 中 for 命令的基本格式如以下,$var 变量包含着这次迭代对应的当前列表项中的值. for var in list docommands done 也可以 ...

  8. Linux shell 学习笔记(8)— 使用结构化命令(if-then 语句、数值比较、字符串比较、文件比较、case 语句)

    1. 使用 if-then 语句 最基本的结构化命令就是if-then语句.if-then语句有如下格式. if command then ​ commands fi 或者 if command; t ...

  9. Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)

    1. 使用多个命令 如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. $ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 ...

  10. Linux shell 学习笔记(5)— 文件权限(添加、修改、删除用户及创建、修改群组)

    1. Linux的安全性 Linux 安全系统的核心是用户账户.每个能进入 Linux 系统的用户都会被分配唯一的用户账户.用户对系统中各种对象的访问权限取决于他们登录系统时用的账户. 用户权限是通过 ...

最新文章

  1. 每日一皮:我们最要避开的山寨产品...
  2. python窗口化编程_python程序的窗口化
  3. WKQ学习(后台知识)
  4. Java读取word文件,字体,颜色
  5. Mysql保存是事件驱动吗_【CHRIS RICHARDSON 微服务系列】事件驱动的数据管理-5
  6. 程序员都长得丑?颜值底线是程序员?
  7. Linux环境编译时报错/lib64/libdl.so.2: could not read symbols: Invalid operation
  8. rust和gta5哪个吃配置_晨报:Steam周销量榜 曝次世代GTA5用大镖客2引擎
  9. 【matplotlib笔记】柱形图、直方图、散点图、饼图以及叠加图绘制
  10. 滴滴回应未删道歉微博;阿里 P7 员工租自如病亡;苹果无人车出事故 | 极客头条...
  11. ajax发送html标识,如何在jQuery的.ajax函数中正确转义作为数据发送的html
  12. Tensorflow笔记:搭建神经网络
  13. 16种常用的数据分析方法汇总
  14. 使用HBuilder将web项目打包成app
  15. 统计基础:3.3_假设检验之t检验(Student‘s t test)
  16. Elasticsearch构建全文搜索系统
  17. 基于MATLAB的数字水印系统研究
  18. [转]Cookie详解
  19. 机器人感知与规划笔记 (2) - 传感器(Sensor)类型及其限制
  20. 【实用工具】让文件资源管理器像浏览器一样实现多标签化——QTTabBar

热门文章

  1. 华中之旅--逃离广州(二)
  2. 易知微数字孪生智慧港口|打造智能化调度综合管控“大脑”,实现港口建设“新升级”
  3. 探索Android四大组件之广播
  4. Cloudreve搭建云盘系统,并实现随时访问
  5. Git版本控制(简介、安装、常用命令)
  6. 1306 2249
  7. Python之图片识别
  8. 深度学习 - 第二章 - 机器学习基础
  9. 深入浅出DNS系列(十)- DNSSEC
  10. C语言动态内存分配函数