首页 > 其他分享 >bash:双中括号和单中括号

bash:双中括号和单中括号

时间:2024-11-17 15:30:11浏览次数:1  
标签:file 引号 cmd 语法 中括号 测试 bash

bash:双中括号和单中括号

内容

在 Bash 中,if 语句可以使用单个中括号([)或者双中括号([[)进行条件测试。这里的 [[ 是一种更强大且推荐的语法,与单中括号相比,具有以下优点和特点:

为什么使用双中括号 [[ ]]

  1. 更强的条件测试功能

    • [[ 支持更复杂的条件测试,比如逻辑运算符(&&||)、模式匹配(== 支持通配符)和正则表达式(=~)。
    • 在你的例子中,|| 是逻辑运算符,用于判断两个文件是否都不存在。[[ 是更适合处理逻辑运算的工具。

    示例:

    if [[ ! -f file1 || ! -f file2 ]]; then
        echo "至少有一个文件不存在"
    fi
    
  2. 无需引用避免问题

    • 使用 [[ 时,不需要给变量加引号来避免单词拆分或路径名扩展(globbing)。例如:
      file="my file with spaces"
      [[ -f $file ]]  # 不需要加引号,也不会报错
      
      如果使用单中括号([),就需要加引号:
      file="my file with spaces"
      [ -f "$file" ]  # 必须加引号,否则会报错
      
  3. 语法更直观

    • [[ 提供了更加直观的语法,用于区分字符串比较和数字比较。比如:
      num=5
      [[ $num -lt 10 ]]  # 数值比较
      [[ $str == "hello" ]]  # 字符串比较
      

    而在单中括号中,字符串比较需要额外注意语法的正确性。

  4. 防止意外的命令执行

    • 单中括号内部会解析命令,这可能导致一些不必要的副作用。而 [[ 则不会执行命令,而是只进行条件测试。

    示例:

    cmd="rm -rf /"
    [ $cmd ]  # 如果 cmd 未加引号,可能会误执行!
    

    使用双中括号则完全避免这个问题:

    [[ $cmd ]]  # 不会执行命令,只做字符串测试
    

为什么不是单中括号 [

单中括号 [ 是 POSIX 标准的一部分,适用于更基础的条件测试,例如文件存在性检查或简单的字符串比较。它在功能和安全性上稍弱于双中括号。

例如:

if [ ! -f $failed_tests_file ] || [ ! -f $all_tests_file ]; then
    echo "至少有一个文件不存在"
fi

虽然功能相同,但由于需要明确分开两次测试,且变量需要引号,这种写法更容易出错。


总结

[[ 提供更安全、更灵活的条件测试语法,推荐在现代 Bash 脚本中优先使用。特别是在涉及逻辑运算符(如 ||&&)时,[[ 的语法显得更加简洁和可靠。

标签:file,引号,cmd,语法,中括号,测试,bash
From: https://www.cnblogs.com/smartljy/p/18550619

相关文章

  • bash sort 命令的用法
    给定一个test.txtbanana,2,8apple,2,7cherry,2,9banana,3,4cherry,3,5apple,3,10sort命令默认按照字典从左到右逐个字符依次从小到大排序,空格和制表符是默认域分隔符字典顺序就是基于Unicode字符编码的值来排序的默认排序:$cattest.txt|sortapple,2,7apple,3,10b......
  • 2024 同一个网段,反弹shell四种方法【linux版本】bash、python、nc、villian反弹shell
    实验环境准备(同一个网段下,我是桥接的虚拟机)一、bash反弹shell二、python反弹shell三、nc反弹shell四、villain反弹shell实验环境准备(同一个网段下,我是桥接的虚拟机)      一台kali的linux(攻击者)        一台centos7/debian[另一个linux](受害者)一、b......
  • 一个实用的脚本 [Bash 数组基础]
     ###Bash数组基础在Bash中,数组是一种可以存储多个值的数据结构。数组的每个元素都有一个索引,从0开始。例如,假设我们有一个数组:```bashtask_ids=("task1""task2""task3")```###获取数组的所有索引`${!task_ids[@]}`语法用于获取数组`task_ids`的所有索引。具体......
  • Bash脚本当中获取当前脚本绝对路径位置
    Bash脚本当中获取当前脚本绝对路径位置在Bash脚本中,一般使用命令获取当前目录,而不是直接依赖相对路径,这是因为相对路径的基础是脚本的运行位置,相对路径可能会因为脚本的运行位置不同而发生变化,导致脚本找不到指定文件或目录。获取脚本所在的目录可以使脚本更具通用性和可靠性,不......
  • https脚本python和bash版本
    以下是一个使用 `curl` 的 Bash 脚本,可以发送 HTTPS 的 GET 和 POST 请求,同时支持 cookies 和gzip 压缩: ```bash#!/bin/bash # 默认配置COOKIE_FILE="cookies.txt" # 存储cookies的文件USER_AGENT="Mozilla/5.0(X11;Ubuntu;Linuxx86_64)AppleWe......
  • 【问题排查】-bash: fork: retry: Resource temporarily unavailable 记录一下
    ●最初现象,ssh端口异常,登录机器出现如下,执行每一个命令都会有这个错,最终就是关闭终端后无法在连接,只能重启释放资源●查看kernel.threads-max(每个进程中最多创建的的线程数目)●top-H查看每个线程的资源使用情况,发现达到了当前系统限制30938●修改threads-max,sy......
  • 超详细介绍bash脚本相关细节
            Bash(BourneAgainSHell)是一种广泛使用的Unixshell和命令语言,它提供了一套强大的功能用于脚本编写和自动化任务。1.编写脚本方式和运行脚本方式sudovi名称.sh例如编写一个名称为a的脚本:运行方式1:先给权限再运行sudochmod+x文件名./文件名例......
  • 安全: 校验rpm软件包(rpm -Va)的一个bash脚本
    一,bash脚本#!/bin/bash#===================backupbase========================#rpmvalogbackup的路径back_base=/storage/logs/rpmvalogsif[!-d${back_base}];thenmkdir-p${back_base}fi#===================backuppath=====================......
  • 【bypass】bash绕过waf 的小技巧
    原创良辰红队笔记录无意中看到推特上面有个老外分享的一条命令$0<<<$\'\\$(($((1<<1))#10011010))\\$(($((1<<1))#10100011))\'其实这个命令就是ls搜了一下原来是这个意思$((1<<1))将1左移1位,得到2。2#10011010将二进制数10011010转换为十进制数154。同理2#1......
  • Bash数组与字典使用
    需求编写bash脚本希望用到更加灵活的数据格式。数组使用index索引,直接调用返回第一个元素,支持-1检索,不存在的index返回空。举例:将十进制数转换为十六进制。declare-aHEX#可以省略HEX=(0123456789ABCDEF)echo${HEX[15]}#F字典使用key索引,直接调用......