首页 > 系统相关 >Shell条件判断:使用[]还是[[]]

Shell条件判断:使用[]还是[[]]

时间:2024-02-04 09:01:15浏览次数:36  
标签:例如 Shell 判断 num str 条件 字符串 Bash

https://mp.weixin.qq.com/s/Gzv2o90dwUlBIDFcnSWpIA

在编写Bash脚本时,逻辑表达式通常放在方括号[]中,但实际上,还有另一种方括号[[]]可供选择。这两种方括号在用法和功能上存在一些差异。本文将重点介绍[[]]的优势,并揭示如何判断当前环境是否支持Bash。

一、[]与[[]]的区别

  1. 标准与扩展:[]是Bourne Shell标准用法,而[[]]则是Bash的扩展用法。

  2. 功能差异:[]主要用于简单的逻辑比较、基本的模式匹配,并且它们在不同的Shell之间更具可移植性;而[[]]则提供了更丰富的比较操作符、适用于更高级的模式匹配。

二、[[]]的优势

在Bash环境中,[[]]提供了更加方便和灵活的语法,可以简化脚本编写过程,同时避免了一些在[]中需要处理的特殊情况。

  1. 字符串比较

使用[[]]进行字符串比较时,不需要对操作符进行转义,可以直接进行字符串比较,例如:

[[ "abc" < "def" ]]
而使用[]时需要转义操作符,例如:

[ "abc" < "def" ]
2. 变量处理

在[[]]中,不需要考虑空值引起的问题, 例如:

[[ $str == hello ]]
[[ $num -eq 1 ]]
而在[]中,需要确保变量有非空白值,否则会导致语法错误,根据表达式的不同,可能会收到错误“unary operator expected”或者“too many arguments”。对于字符串可以使用双引号将变量括起来,例如:

[ "$str" == hello ]
对于数值,需要额外判断变量非空,例如以下脚本片段:

if [ -n "$num" ]; then
if [ $num -eq 1 ]; then
echo 变量num的值等于1
fi
fi
-n表示检查它后面的字符串是否非空。

  1. 逻辑操作

在[[]]中,可以使用&&和||分别进行逻辑与和逻辑或操作,例如:

[[ $str== hello && $num -eq 1 ]]
而在[]中需要使用-a和-o,例如:

[ "\(str" == hello -o "\)str" == Hello ]
4. 正则表达式匹配

[[]]支持使用=~进行正则表达式匹配,例如:

[[ "abc" =~ ^ab.* ]]
而[]不支持这种操作。可以使用grep命令,根据grep命令的退出状态判断是否匹配,例如以下脚本片段:

echo abc|grep -q ^ab.*
if [ $? -eq 0 ]; then
echo 字符串匹配该模式
fi

三、总结

通常,建议在Bash中使用双括号进行条件判断,因为它提供了更大的灵活性和更好的边缘情况处理。然而,如果需要编写更具可移植性的Shell脚本,建议使用单括号。

标签:例如,Shell,判断,num,str,条件,字符串,Bash
From: https://www.cnblogs.com/titianblog/p/18005552

相关文章

  • JMeter 配置元件之按条件读取CSV Data Set Config
    实践环境win10JMeter5.4.1需求描述需求是这样的,需要压测某个接口(取消分配接口),请求这个接口之前,需要先登录系统(物流WMS系统),并在登录后,选择并进入需要操作的仓库,然后请求接口,接口报文如下:{"orderNos":["OB-20231221-0000025","OB-20231221-0000026"],"warehouseCode......
  • 金蝶云星空表单服务规则设置-基础资料和复选框判断
     一、语法规则基础资料判断:标识=null复选框判断打钩:标识=true 二、业务需求售后单审核时,如果物料启用了序列号管理,明细序列号资料必须选择。 三、开发实现  四、测试记得一定要重新启动环境。 ......
  • Shell 避免无限递归
    在编写Shell脚本时,有时会产生我们不期望的递归。比如说,我曾经写过一个脚本,名为foo.sh。foo.sh的内容如下:functionfoo{#TODO}foo然后我在.zshrc里设置了别名:aliasfoo="source~/foo.sh"现在,当我在终端运行foo时,就会得到如下错误:/Users/undefined443/foo......
  • Shell 脚本实现上下键选择文本
    #!/bin/bash#函数:显示选择列表并返回用户选择的选项#参数:# $1-选项数组#返回值:# 用户选择的选项#定义选择函数select_option(){ choices=("$@") #将选项数组声明为全局变量 selected=0   #初始化选择索引 whiletrue;do  clear......
  • Linux基础47 Ansible之ad-hoc, 命令模块(command, shell, script), 软件管理模块(yum,
    Ansible之ad-hoc一、什么是ad-hoc1.什么是ad-hocad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存2.ad-hoc使用场景可以用作查看远程机器的进程,或者磁盘,或者拷贝文件3.ad-hoc命令使用[root@m01~]#ansibleweb01-mshell-a'free-m'web01|CHANGED|rc=......
  • java - 判断时间范围区间
    JSONObjectrespObj=newJSONObject(s);SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");StringstartTimeStr="2024-01-01";StringendTimeStr="2024-01-31";DatestartTimDate=sdf.parse(startTimeStr);//strin......
  • Shell中set -e和if语句的组合使用
    shell脚本开头加上set-e命令后,在运行过程中如果出现返回值为非零,整个脚本就可以立刻退出。假如脚本中有if判断,很可能if条件的返回值是不为0的。一开始我是把hadoopfs-test-d$hdfs_folder单独写一行的,由于folder不存在,所以脚本直接退出。所以遇到这种情况,需要把有可能是结......
  • 判断C盘下有没有Templets文件夹,没有则新建,然后判断Templets文件夹下有没有TEST.xlt文
    VB.NET判断C盘下有没有Templets文件夹,没有则新建,然后判断Templets文件夹下有没有TEST.xlt文件,如果没有则新建 你可以使用VB.NET中的Directory和File类来实现这个任务。以下是一个示例代码,用于判断C盘下是否存在Templets文件夹,如果不存在则创建,然后判断T......
  • 跟着微软官方学习Powershell-在 PowerShell 中发现命令
    1、说明PowerShell预安装了大量命令。若要有效地使用PowerShell命令,您需要了解它们的工作原理。例如,你需要知道命令所采用的参数,以及可以使用多种方法来调用命令。它还有助于了解命令返回的内容、返回的类型以及命令的属性。通过了解这些事项,你可以配置如何显示帮助。此外,还......
  • 问题:购车分期中,以下客户资质条件中不能够准入的是()
    问题:购车分期中,以下客户资质条件中不能够准入的是()A.保险单的投保人B.职业不明确客户且无法提供稳定收入来源的客户C.经营一个月的个体户D.收入不足以支撑分期额度的的客户E.无法提供资产证明的私营业主参考答案如图所示问题:多媒体控制台的主要功能有()A.红外传感器遥控设备B.实现对投影机、......