当前位置: 首页 > news >正文

shell变量扩展你知道多少?

1. shell变量扩展

我们知道,${var}的形式可以获取变量var的值,但其实还可以有更多花式玩法。其中~表示用户根目录其实属于 波浪线扩展,这比较常见,不展开介绍了。
下面的每种情况中,word 都要经过波浪线扩展,参数扩展,命令替换和 算术扩展。如果不进行子字符串扩展,bash 测试一个没有定义或值为空的 参数;忽略冒号的结果是只测试未定义的参数。
大致描述下变量扩展的功能:

扩展功能
${var}获取变量值
${!var}取变量var的值做新的变量名,再次获取新变量名的值
${!prefix*获取prefix开头的变量名
${#parameter}获取变量长度
${parameter:-word}parameter为空时,使用wrod返回
${parameter:+word}parameter非空时,使用word返回
${parameter:=word}parameter为空时,使用word返回,同时把word赋值给parameter变量
${parameter:?word}parameter为空时,打印错误信息word
${parameter:offset}从offset位置截取字符串
${parameter:offset:length从offset位置截取length长度的字符串
${parameter#word}从头开始删除最短匹配word模式的内容后返回
${parameter##word}从头开始删除最长匹配word模式的内容后返回
${parameter%word}从尾开始删除最短匹配word模式的内容后返回
${parameter%%word}从尾开始删除最长匹配word模式的内容后返回
${parameter/pattern/string}最长匹配pattern的内容替换为string
${parameter//pattern/string}所有匹配pattern的内容替换为string

1.1 什么是${!var}

${!var}是间接扩展。bash 使用以 var 的其余部分为名的变量的值作为变量的名称; 接下来新的变量被扩展,它的值用在随后的替换当中,而不是使用var自身的值。
有点拗口,举个例子就懂了

$ var_name=val
$ val="Bash expansion"
$ echo ${!var_name}
Bash expansion

所以,${!var_name}等效于${val},就是取val_name的值作为变量名,再获取新变量名的值。

!有一种例外情况,那就是${!prefix*},下面再介绍。

1.2 什么是 ${!prefix*}#

${!prefix*}实现扩展为名称以 prefix 开始的变量名,以特殊变量 IFS 的第一个字符分隔。换句话说,这种用法就是用于获取变量名的。例如:

# 创建3个以VAR开头的变量
$ VAR_A=a
$ VAR_B=b
$ VAR_C=c
# 寻找以VAR开头的变量名
$ echo ${!VAR*}
VAR_A VAR_B VAR_C

1.3 什么是 ${parameter:-word}

${parameter:-word}表示使用默认值。如果 parameter 未定义或值为空,将替换为 word 的扩展。否则,将替换为 parameter 的值。

1.4 什么是${parameter:=word}

${parameter:=word}赋默认值。如果 parameter 未定义或值为空, word 的扩展将赋予 parameter。parameter 的值将被替换。位置参数和特殊参数不能用这种方式赋值。

${parameter:=word}和${parameter:-word}有什么差别?

举个例子:

# 删除var变量
$ unset var
# 确认var变量为空
$ echo ${var}# 当var为空时,把test赋值给var,同时返回test
$ echo ${var:=test}
test
# 可以看到,此时var已经被赋值
$ echo ${var}
test
# 再次删除var变量,继续实验
$ unset var
# 当var为空时,返回test
$ echo ${var:-test}
test
# 对比验证,此时var并没有赋值
$ echo ${var}

所以,差别在于,当parameter为空时,${parameter:=word}会比${parameter:-word}多做一步,就是把word的值赋给parameter。

1.6什么是${parameter:?word}

${parameter:?word}主要用于当parameter为空时,显示错误信息word。shell 如果不是交互的,则将退出。

1.7 什么是${parameter:+word}

如果 parameter 未定义或非空,不会进行替换;否则将替换为 word 扩展后的值。这与${parameter:-word}完全相反。简单来说,就是当parameter非空时,才使用word。

1.8 什么是${parameter:offset}

同 ${parameter:offset:length}
${parameter:offset:length}可以实现字符串的截取,从offset开始,截取length个字符。如果 offset 求值结果小于 0, 值将当作从 parameter 的值的末尾算起的偏移量。如果parameter 是 @,结果是 length 个位置参数,从 offset 开始。 如果 parameter 是一个数组名,以 @ 或 * 索引,结果是数组的 length 个成员,从 ${parameter[offset]} 开始。 子字符串的下标是从 0 开始的,除非使用位置参数时,下标从 1 开始。

1.9 什么是${parameter#word}#

参考 ${parameter##word}

${parameter##word}
word支持模式匹配,从parameter的开始位置寻找匹配,一个#的是寻找最短匹配,两个#的是寻找最长匹配,把匹配的内容删除后,把剩下的返回。例如:

$ str="we are testing, we are testing"
$ echo ${str#*are}
testing, we are testing
$ echo ${str##*are}
testing

这必须是从头开始删的,如果要删除中间的某一些字符串,可以用${parameter/pattern/string}。
如果 parameter是一个数组变量,下标是@或者是*,模式删除将依次施用于数组中的每个成员,最后扩展为结果的列表。

1.10 什么是${parameter%word}

参考${parameter%%word}

${parameter%%word}
这也是在parameter中删除匹配的内容后返回。%与#非常类似,前者是从头开始匹配,后者是从尾部开始匹配。同样的,一个%是寻找最短匹配,两个%%是寻找最长匹配。例如:

$ str="we are testing, we are testing"
$ echo ${str%are*}
we are testing, we
$ echo ${str%%are*}
we

这必须是从末端开始删的,如果要删除中间的某一些字符串,可以用${parameter/pattern/string}。
如果 parameter是一个数组变量,下标是@或者是*,模式删除将依次施用于数组中的每个成员,最后扩展为结果的列表。

1.11 什么是${parameter/pattern/string}

参考${parameter//pattern/string}

${parameter//pattern/string}和${parameter/pattern/string},主要实现了字符串替换,当然,如果要替换的结果是空,就等效于删除。一个/,表示只有第一个匹配的被替换,两个/表示所有匹配的都替换。例如:

$ str="we are testing, we are testing"
# 替换首次匹配
$ echo ${str/we are/I am}
I am testing, we are testing
# 替换所有匹配
$ echo ${str//we are/I am}
I am testing, I am testing
# 删除首次匹配
$ echo ${str/are/}
we testing, we are testing
# 删除所有匹配
$ echo ${str//are/}
we testing, we testing

如果patten以#开始,例如KaTeX parse error: Expected '}', got '#' at position 6: {str/#̲we are/},则必须从头开…{str/%are testing/},必须从末端就要完全匹配。
如果 parameter是一个数组变量,下标是@或者是*,模式删除将依次施用于数组中的每个成员,最后扩展为结果的列表。

相关文章:

shell变量扩展你知道多少?

1. shell变量扩展 我们知道,${var}的形式可以获取变量var的值,但其实还可以有更多花式玩法。其中~表示用户根目录其实属于 波浪线扩展,这比较常见,不展开介绍了。 下面的每种情况中,word 都要经过波浪线扩…...

Compose中对于KeyEvent的处理

在开发Android TV时,遇到了一个需求,需要对遥控器发出的上下左右按键点击事件做处理。此处我们可以在Modifier.onKeyEvent中对按键事件做处理。此处我写了一个按钮的modifier模板如下。 private val buttonModifier Modifier.onKeyEvent {when {KeyEve…...

OpenXR Monado compositor处理应用layers(cheduled->delivered)

OpenXR Monado compositor处理应用的layer,scheduled->delivered @src/xrt/targets/common/target_instance.c t_instance_create_system @src/xrt/compositor/main/comp_compositor.ccomp_main_create_system_compositor@src/xrt/compositor/multi/comp_multi_system…...

leetcode:1137 Tribonacci 数列

1137 Tribonacci 数列 题目链接https://leetcode.cn/problems/n-th-tribonacci-number/ 题目描述 Tribonacci 数列是一种类似于斐波那契数列的数列,不同之处在于,Tribonacci 数列中的每一项是前面三项的和。给定整数 n,求出 Tribonacci 数…...

简单讲一下API的作用以及介绍

API全称Application Programming Interface,即应用程序编程接口,是一些预先定义的函数,或指软件系统不同组成部分衔接的约定,用于传输数据和指令,使应用程序之间可以集成和共享数据资源。 API 接口简介 一、基本概念…...

猎板道出PCB免费打样真相:制造成本究竟给了谁?

猎板PCB作为电路板特殊定制的厂家,曾经推出了PCB免费打样活动以吸引新客户。从经营的角度来看,免费打样的成本实际上最终由稳定客户承担。免费打样的客户往往仅在有免费机会时下单,而稳定的合作客户则为这些促销活动买单。这种模式长期下来可…...

Linux 竞争与并发(学习总结)

在Linux驱动开发中,“并发”和“竞争”是两个重要的概念,它们涉及到多任务环境下资源的管理和使用。 并发 (Concurrency) 并发指的是在同一时间段内,多个任务看似同时运行的现象。实际上,在单核处理器上,这通常是通过…...

SaaS初创企业需求建模指南

所以你已经准备好进入市场,你有宏大的目标,并且充满激情。 但等等。 你要如何 实现 这些目标呢? 你设置了 正确的 目标吗? 而且你的目标是 可实现的吗? 那么,如何回答这些问题呢? 进入需求…...

MySQL最左匹配原则

MySQL索引的加左原则,也被称为最左匹配原则(Leftmost Prefix Rule)或最左前缀规则(Leftmost Prefixes),是指在创建复合索引时,应将经常用于查询的列放在索引的最左边,以便MySQL能够更…...

日常开发1:居中处理

开发的时候总会遇到两个空间上下两层,然后居中排放,如果只是知道下方或者上方控件的具体位置点,但是不知道另外一个控件的集体点位,应该怎么处理呢? 如上图所示,知道imageview 下方中间的点的位置(这里暂时定义image的宽高已知),上方是textview,那么如何布局呢? 简单解决方法…...

css弹性盒子——flex布局

目录 ​编辑 一、flex容器的样式属性(父元素属性) display:flex 弹性盒子,实现水平排列,在父盒子设置,适用于单行/单列 justify-content 二、flex元素的样式属性(子元素属性) 1.flex-grow 2.flex-shrink 3.flex-basis 4.flex组合属性 flex:flex-…...

亚马逊云科技 Gen BI 2024-09-04 上海站QuickSight

机缘 我又来了,感觉不上班比上班还要忙 天天像特种工一天,今天有度过的充实的一天,上午去图书馆,下午去了 亚马逊云科技 Gen BI 技术体验日 。 具体照片可以去 这里看 哈哈,这个就是我了 商业智能的趋势 根据艾瑞咨…...

【Qt】Qt和JavaScript使用QWebChannel交互

问题 问题一: 问题描述:运行时,Qt向Js端发送消息没有问题,Js端向Qt端发送消息时失败 报错:Cannot invoke unknown method of index -1 on object webTransport(0x…) 原因及解决办法:使用Qt 5.11.2编译生…...

码住!15个爆好用知识库软件工具分享

市场趋势:全球知识库管理软件的市场规模发展速度非常快,并且未来几年内仍将继续保持增长。据Verified Market Research预测,2028年知识库管理软件的全球市场份额将增长到588.1亿美元,复合年增长率达12.67%。 知识库软件可以帮助企…...

MybatisPlus中@EnumValue注解介绍、应用场景和示例代码

EnumValue注解详细介绍 功能概述: EnumValue注解标记在枚举类型的字段上,表示该字段是枚举值在数据库中存储的实际值。这对于枚举的持久化是关键,确保枚举在数据库中的表示与Java枚举类的一致性。 主要用途: 字段指定:…...

【计算机网络】描述TCP建立连接与断开的过程

一、TCP连接的建立与断开 1、建立连接——三次握手 1、A的TCP向B发出连接请求报文段 其首部中的同步位SYN 1,并选择序号seq x,表明传送数据时的第一个数据字节的序号是 x 2、B的TCP收到连接请求报文段后,如同意,则发回确认。 B …...

CSS学习14[重点]

定位 前言一、定位二、定位模式1. 静态定位 static2. 相对定位 relative3. 绝对定位 absolute4. 子绝父相5. 绝对定位的盒子水平居中 6. 固定定位(fixed)7. 叠放次序(z)三、四种定位总结四、定位模式转换 前言 为什么学习定位&am…...

力扣 | 递归 | 区间上的动态规划 | 486. 预测赢家

文章目录 一、递归二、区间动态规划 LeetCode&#xff1a;486. 预测赢家 一、递归 注意到本题数据范围为 1 < n < 20 1<n<20 1<n<20&#xff0c;因此可以使用递归枚举选择方式&#xff0c;时间复杂度为 2 20 1024 ∗ 1024 1048576 1.05 1 0 6 2^{20…...

黑白格

题目描述 小杨有一个 n 行 m 列的网格图&#xff0c;其中每个格子要么是白色&#xff0c;要么是黑色。 小杨想知道至少包含 k 个黑色格子的最小子矩形包含了多少个格子。 输入格式 第一行包含三个正整数 n,m,k&#xff0c;含义如题面所示。 之后 n 行&#xff0c;每行⼀个…...

数据链路层(MAC地址)

文章目录 数据链路层&#xff08;MAC地址&#xff09;1、以太网2、以太网帧格式3、MAC地址4、对比理解 MAC 地址和 IP 地址5、最大传输单元&#xff08;MTU&#xff09;6、MTU 对 IP 协议的影响7、MTU 对 UDP 协议的影响8、MTU 对 TCP 协议的影响9、查看硬件地址和 MTU10、ARP …...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...