Bash中各种括号

2023-11-18

Bash中有各种括号,包括单小括号,双小括号,单中括号,双中括号,单大括号。而且它们之间很容易混淆,所以很有必要总结一下它们的用法。

1. ()的用法

单个小括号用来创建一个子shell。例如:

$ pwd
/home/xfeng
$ (cd /tmp; pwd)
/tmp

你可以看到,子shell允许你在不影响当前shell的 环境下去执行操作。
此外,()还有命令替换的功能,result=$(command)与result=`command`有同样的效果。

fengxi@ubuntu:~/bash$ var=$(pwd)
fengxi@ubuntu:~/bash$ echo $var
/home/fengxi/bash

2. (())的用法

两个小括号用来对整数进行算术运算。比如

fengxi@ubuntu:~/bash$ var=$(20+5)
20+5: command not found

是会报错的,报错内容为:20+5: command not found。但是用双小括号就没有问题

fengxi@ubuntu:~/bash$ var=$((20+5))
fengxi@ubuntu:~/bash$ echo $var
25

此外,(())还具有C语言类型变量增减的功能。如:

fengxi@ubuntu:~/bash$ var=2
fengxi@ubuntu:~/bash$ (( var++ ))
fengxi@ubuntu:~/bash$ echo $var
3
fengxi@ubuntu:~/bash$ (( var-- ))
fengxi@ubuntu:~/bash$ echo $var
2

3. []的用法

单个中括号[]通常调用一个名为[的程序,你可以用man查询一下[,它的返回结果和man test的结果是一样的。[和test都是bash的builtin函数。

fengxi@ubuntu:~/bash$ var=123
fengxi@ubuntu:~/bash$ if [ $var == 123 ]; then echo yes; else echo no; fi
yes

在[]中等于==和=的效果是一样的

fengxi@ubuntu:~/bash$ if [ $var = 123 ]; then echo yes; else echo no; fi
yes

4. [[]]的用法

[[比起[来说,它是一个关键字,并不是一个程序,它带来了额外的功能。例如,你可以使用&&或者||而不是-a或者-o,而且还有正则表达式匹配操作符=~。&&和||仅仅能够用在[[中,在[中则会报错。

fengxi@ubuntu:~/bash$ if [[ $var != 4 && $var != 3 ]]; then echo $var; fi
5
fengxi@ubuntu:~/bash$ if [ $var != 4 && $var != 3 ]; then echo $var; fi
bash: [: missing `]'

重点:[和[[对数字的判断仅仅可用于等于还是不等于,如果是涉及到数学运算则需要借助于expr操作来实现,比如我要想得到100以内既能被3整除又能被4整除的所有数,则程序应该这样写:

for i in `seq 100`
do
    if [ `expr $i % 12` = 0 ]
    then
        echo $i
    fi
done

for((i=0;i<100;i++))
do
    if ((i%12==0))
    then
        echo $i
    fi
done

5. {}的用法

{}主要应用在参数展开(parameter expansion)上。

${varname:-word} 如果varname存在且非null,则返回其值;否则,返回word

${varname:=word} 如果varname存在且不是null,则返回它的值;否则,设置它为word,并返回其值

${varname:?message} 如果varname存在且非null,则返回它的值;否则,显示varname:message,并退回当前的命令或脚本。省略message会出现默认信息parameter null or not set。用途:主要是为了捕捉由于变量未定义所导致的错误。

${varname:+word} 如果varname存在且非null,则返回word,否则,返回null。

此外,{}也应用在模式匹配运算符上,假设变量path的值为/home/fengxi/long.file.name如下所示:

${variable#pattern}如果模式匹配与变量值的开头处,则删除匹配的最短部分,并返回剩下的部分。
例:${path#/*/} 结果为:fengxi/long.file.name
${variable##pattern} 如果模式匹配与变量值的开头处,则删除匹配的最长部分,并返回剩下部分。
例:${path##/*/} 结果为:long.file.name
${variable%pattern} 如果匹配模式匹配与变量的结尾处,则删除匹配的最短部分,并返回剩下部分。
例:${path%.*} 结果为:/home/fengxi/long.file
${variable%%pattern} 如果匹配模式匹配与变量的结尾处,则删除匹配的最长部分,并返回剩下的部分。
例:${path%%.*} 结果为:/home/fengxi/long
巧记方法:因为#在键盘上$的左侧,也就是前面,%在键盘上$的右侧,也就是后面。所以#匹配的头部,%匹配的是尾部。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash中各种括号 的相关文章

随机推荐

  • 2021年字节跳动+京东+美团面试总结!内含福利

    开篇 说一下我大概的情况 渣本毕业 工作已经有快3年了 从高中就开始玩小破站 无论是学习还是日常放松都是在b站 大学主学的软件技术专业 所以 入职bilibili是我大学时期给自己定的小目标 在学校 专业学的算中上的水平 课本知识和老师讲的
  • delphi with do和for do语句

    1 with 对象名 do语句只是为了减少输入的字符 不必每次重复名字 直接写变量 procedure TForm1 Button1Click Sender TObject 正常写法beginedit1 text hello edit1 c
  • J1939协议与CAN2.0对应关系

  • python贪吃蛇小游戏,面向对象设计模式,附带源码以及所需素材

    在python中通过面向对象设计模式来实现一个贪吃蛇小游戏 源码在最下方 上传的资源包内也包括代码源文件以及所需素材等 源文件在game文件夹内 exe文件可直接运行 pygame模块需要自行下载 先来看运行效果图 开始界面 点击按钮开始游
  • Leetcode 括号的分数 -- 栈

    题目描述 leetcode 856 括号的分数 给定一个平衡括号字符串 S 按下述规则计算该字符串的分数 得 1 分 AB 得 A B 分 其中 A 和 B 是平衡括号字符串 A 得 2 A 分 其中 A 是平衡括号字符串 示例 1 输入
  • Go语言学习18-基准测试

    基准测试 引言 基准测试 1 编写基准测试函数 2 计时器 3 内存分配统计 4 基准测试的运行 结语 引言 所谓基准测试 Benchmark Test 简称BMT 是指 通过一些科学的手段实现对一类测试对象的某项性能指标进行可测量 可重复
  • 嵌入式 Linux 入门(七、Linux 下的环境变量)

    嵌入式 Linux 入门第七课 学习理解 linux 的环境变量 矜辰所致 前言 学习完 Linux 的 Shell 命令 和 Shell 脚本 我们还需要理解一个东西 环境变量 理解了 Linux 的环境变量 前面的文章中有些细节的东西
  • OpenCASCADE:使用C#演示的实例

    OpenCASCADE 使用C 演示的实例 OpenCASCADE是一个开源的三维几何建模软件库 它支持多种语言接口 其中 OCCT是OpenCASCADE的C 语言封装 而在本文中 我们将介绍如何使用C 语言来调用OCCT的API 在Vi
  • Mac安装SecureCRT

    踩了很多坑 主要过程 第一次 在之前常用的一个mac软件福利网站https xclient info s securecrt html下载之后发现没有破解文件securecrt mac crack pl 第二次 在csdn上模仿下载之后进行
  • SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else

    场景 设计模式 策略模式在Java中的使用示例 设计模式 策略模式在Java中的使用示例 java 策略模式示例 霸道流氓气质的博客 CSDN博客 上面讲了策略模式在Java中的使用示例 下面看一个在SpringBoot中的实际使用示例 业
  • 实时监听EditText内容变化,修改监听软键盘

    主要是addTextChangedListener方法的使用 aswerEdittext addTextChangedListener new TextWatcher 编辑框的内容发生改变之前的回调方法 Override public vo
  • 浅谈设计原则

    1单一职责原则 什么是单一职责原则 在我理解看来就是一个东西如果发生问题那么就有且仅有一个原因导致它发生问题 它的准确解释就是 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于耦合度加大 当变化发生时 设计会受到
  • JAVA-1001. 害死人不偿命的(3n+1)猜想

    卡拉兹 Callatz 猜想 对任何一个自然数n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到n 1 卡拉兹在1950年的世界数学家大会上公布了这个猜想 传说当时耶鲁大学
  • CentOS安装指定版本的Docker(包括卸载)

    一 Docker安装 1 配置指定的yum源 wget P etc yum repos d https mirrors aliyun com docker ce linux centos docker ce repo 2 查看yum源支持的
  • React使用antd里面的Table组件,表格可自由控制列宽

    import React Component from react import Resizable from react resizable import react resizable css styles css 要引入样式 impo
  • 到底学机械好还是学计算机好,大学同学一个选择学机械,另一个学计算机,对比5年后收入蒙了...

    原标题 大学同学一个选择学机械 另一个学计算机 对比5年后收入蒙了 现如今上大学 你所选择的专业对以后的职业规划还是有挺大的影响 而互联网可以说是这些年最热门的专业 所以很多大学生选择学计算机还是挺多的 基本上计算机系的大学生也是最多的 而
  • 腾讯云存储COS

    简介 对象存储 Cloud Object Storage COS 是由腾讯云推出的无目录层次结构 无数据格式限制 可容纳海量数据且支持 HTTP HTTPS 协议访问的分布式存储服务 腾讯云 COS 的存储桶空间无容量上限 无需分区管理 适
  • 低功耗蓝牙(BLE)你入门了吗

    前言 蓝牙低功耗 Bluetooth Low Energy 或称Bluetooth LE BLE 旧商标Bluetooth Smart 用于医疗保健 运动健身 安防 工业控制 家庭娱乐等领域 在如今的物联网时代下大放异彩 扮演者重要一环 是
  • Linux中断处理程序框架

    设备的中断会打断内核进程的正常调度和运行 系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍 但是 这个良好的愿望往往与现实不吻合 在多数真实的系统中 当中断到来时 要完成的工作往往并不是短小的 它可能要进行大量的耗时处理 为了在中断执
  • Bash中各种括号

    Bash中有各种括号 包括单小括号 双小括号 单中括号 双中括号 单大括号 而且它们之间很容易混淆 所以很有必要总结一下它们的用法 1 的用法 单个小括号用来创建一个子shell 例如 pwd home xfeng cd tmp pwd t