Shell参数扩展形式学习笔记

Shell参数扩展形式学习笔记

文章目录

  • Shell参数扩展形式学习笔记
    • 空值判断处理 ${parameter:-word} ${parameter:=word} ${parameter:?word} ${parameter:+word}
    • 变量位置截取 ${parameter:offset} ${parameter:offset:length}
    • 变量匹配组合 ${!prefix*} ${!prefix@} ${!name[@]} ${!name[*]}
    • 获取长度 ${#parameter}
    • 变量匹配删除 ${parameter#word} ${parameter##word} ${parameter%word} ${parameter%%word}
    • 变量文本替换 ${parameter/pattern/string} ${parameter//pattern/string} ${parameter/#pattern/string} ${parameter/%pattern/string}
    • 大小写转换 ${parameter^pattern} ${parameter^^pattern} ${parameter,pattern} ${parameter,,pattern}
    • 变量特定操作 ${parameter@operator}

在 Bash 的官方文档中,你可以查找关于 Shell 参数扩展的章节,通常位于“3.5.3 Shell Parameter Expansion”章节将提供关于 ${} 语法以及其他参数扩展形式的详细说明和示例。

链接如下:
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

空值判断处理 ${parameter:-word} ${parameter:=word} ${parameter:?word} ${parameter:+word}

举例说明:

这四种 ${} 形式的区别如下:

  1. ${parameter:-word}:如果变量 parameter 未定义或为空,则使用默认值 word,并将其扩展为该值;否则,保持变量 var 的原始值。

    示例:

    var="value"
    echo "${var:-default}"  # 输出 "value"
    unset var
    echo "${var:-default}"  # 输出 "default"
    
  2. ${parameter:=word}:如果变量 parameter 未定义或为空,则将其设置为默认值 word,并将其扩展为该值;否则,保持变量 var 的原始值。

    示例:

    var="value"
    echo "${var:=default}"  # 输出 "value"
    unset var
    echo "${var:=default}"  # 输出 "default"
    
  3. ${parameter:?word}:如果变量 parameter 未定义或为空,则输出错误信息 word 到标准错误输出,并退出脚本;否则,将变量 var 的值扩展为其原始值。

    示例:

    var="value"
    echo "${var:?Variable var is not set.}"  # 输出 "value"
    unset var
    echo "${var:?Variable var is not set.}"  # 输出错误信息到标准错误输出并退出脚本
    
  4. ${parameter:+word}:如果变量 parameter 已经被设置并且不为空,则将其扩展为 word;否则,将其扩展为空字符串。

    示例:

    var="value"
    echo "${var:+default}"  # 输出 "default"
    unset var
    echo "${var:+default}"  # 输出空字符串
    

总结:

  • ${parameter:-word}${parameter:=word} 用于提供默认值,但前者不会改变变量的值,后者会在变量未定义或为空时设置变量的值。
  • ${parameter:?word} 用于检查变量是否已定义,未定义则输出错误信息并退出脚本。
  • ${parameter:+word} 用于检查变量是否已设置并且不为空,是则扩展为指定值,否则扩展为空字符串。

变量位置截取 ${parameter:offset} ${parameter:offset:length}

这两种形式都是 Bash 中的参数扩展形式,用于提取字符串的子串。它们的区别在于提取子串的方式:

  1. ${parameter:offset}:从变量 parameter 的字符串中提取从偏移量 offset 开始的子串,直到字符串的末尾。

    示例:

    str="abcdefg"
    echo "${str:2}"  # 输出 "cdefg",从位置 2 开始提取子串
    
  2. ${parameter:offset:length}:从变量 parameter 的字符串中提取从偏移量 offset 开始,长度为 length 的子串。

    示例:

    str="abcdefg"
    echo "${str:2:3}"  # 输出 "cde",从位置 2 开始提取长度为 3 的子串
    

总结:

  • ${parameter:offset} 提取从偏移量 offset 开始到字符串末尾的子串。
  • ${parameter:offset:length} 提取从偏移量 offset 开始,长度为 length 的子串。

变量匹配组合 ${!prefix*} ${!prefix@} ${!name[@]} ${!name[*]}

这四种形式都是 Bash 中的间接引用形式,用于引用以特定前缀开头的变量名。它们的区别在于展开的方式和结果:

  1. ${!prefix*}:展开以 prefix 开头的所有变量名,并返回由这些变量值组成的字符串列表,每个变量值之间用空格分隔。

    示例:

    var1="value1"
    var2="value2"
    echo "${!var*}"  # 输出 "var1 var2"
    
  2. ${!prefix@}:与 ${!prefix*} 类似,展开以 prefix 开头的所有变量名,并返回由这些变量值组成的字符串列表,每个变量值之间用空格分隔。

    示例:

    var1="value1"
    var2="value2"
    echo "${!var@}"  # 输出 "var1 var2"
    
  3. ${!name[@]}:展开数组 name 中的所有元素,并返回由这些元素值组成的字符串列表,每个元素值之间用空格分隔。

    示例:

    array=("value1" "value2")
    echo "${!array[@]}"  # 输出 "value1 value2"
    
  4. ${!name[*]}:与 ${!name[@]} 类似,展开数组 name 中的所有元素,并返回由这些元素值组成的单个字符串,元素值之间用第一个字符为 IFS 的字符分隔(默认为空格)。

    示例:

    array=("value1" "value2")
    echo "${!array[*]}"  # 输出 "value1 value2"
    

总结:

  • ${!prefix*}${!prefix@} 展开以 prefix 开头的所有变量名,并返回由这些变量值组成的字符串列表,每个变量值之间用空格分隔。
  • ${!name[@]}${!name[*]} 展开数组 name 中的所有元素,并返回由这些元素值组成的字符串列表或单个字符串,元素值之间用空格或 IFS 分隔。

获取长度 ${#parameter}

${#parameter} 是 Bash 中的参数长度扩展形式,用于获取变量 parameter 的长度。这个形式可以用于获取字符串的长度,也可以用于获取数组的元素个数。

示例:

# 获取字符串的长度
str="Hello, world!"
echo "${#str}"  # 输出 "13"# 获取数组的元素个数
array=("apple" "banana" "orange")
echo "${#array[@]}"  # 输出 "3"

在第一个示例中,${#str} 返回字符串变量 str 的长度,即 13。
在第二个示例中,${#array[@]} 返回数组变量 array 中元素的个数,即 3。

变量匹配删除 ${parameter#word} ${parameter##word} ${parameter%word} ${parameter%%word}

这四种形式都是 Bash 中的模式删除操作,用于从变量值中删除匹配的部分。它们的区别在于匹配的方式和删除的范围:

  1. ${parameter#word}:删除变量 parameter 值开头匹配的最短部分(即最短匹配)。

    示例:

    path="/path/to/file.txt"
    echo "${path#*/}"  # 输出 "path/to/file.txt",删除第一个斜杠及其之前的部分
    
  2. ${parameter##word}:删除变量 parameter 值开头匹配的最长部分(即最长匹配)。

    示例:

    path="/path/to/file.txt"
    echo "${path##*/}"  # 输出 "file.txt",删除最后一个斜杠及其之前的部分
    
  3. ${parameter%word}:删除变量 parameter 值结尾匹配的最短部分(即最短匹配)。

    示例:

    filename="file.txt"
    echo "${filename%.*}"  # 输出 "file",删除最后一个点及其之后的部分
    
  4. ${parameter%%word}:删除变量 parameter 值结尾匹配的最长部分(即最长匹配)。

    示例:

    filename="file.txt"
    echo "${filename%%.*}"  # 输出 "file",删除最后一个点及其之后的部分
    

总结:

  • ${parameter#word}${parameter##word} 用于从变量值的开头匹配删除指定部分,区别在于前者是最短匹配,后者是最长匹配。
  • ${parameter%word}${parameter%%word} 用于从变量值的结尾匹配删除指定部分,区别在于前者是最短匹配,后者是最长匹配。

变量文本替换 ${parameter/pattern/string} ${parameter//pattern/string} ${parameter/#pattern/string} ${parameter/%pattern/string}

这四种形式都是 Bash 中的模式替换操作,用于在变量值中替换匹配的部分。它们的区别在于替换的范围和方式:

  1. ${parameter/pattern/string}:将变量 parameter 值中第一个匹配的 pattern 替换为 string

    示例:

    text="apple banana banana"
    echo "${text/ban/orange}"  # 输出 "apple orangeana banana",只替换第一个匹配的 "ban"
    
  2. ${parameter//pattern/string}:将变量 parameter 值中所有匹配的 pattern 替换为 string

    示例:

    text="apple banana banana"
    echo "${text//ban/orange}"  # 输出 "apple orangeana orangeana",替换所有匹配的 "ban"
    
  3. ${parameter/#pattern/string}:如果变量 parameter 值以 pattern 开头,则将其替换为 string

    示例:

    filename="file.txt"
    echo "${filename/#file/path}"  # 输出 "path.txt",替换开头的 "file"
    
  4. ${parameter/%pattern/string}:如果变量 parameter 值以 pattern 结尾,则将其替换为 string

    示例:

    filename="file.txt"
    echo "${filename/%.txt/.csv}"  # 输出 "file.csv",替换结尾的 ".txt"
    

总结:

  • ${parameter/pattern/string}${parameter//pattern/string} 用于在变量值中进行模式替换,前者替换第一个匹配,后者替换所有匹配。
  • ${parameter/#pattern/string}${parameter/%pattern/string} 用于在变量值的开头和结尾匹配替换,分别替换开头和结尾的匹配部分。

大小写转换 ${parameter^pattern} ${parameter^^pattern} ${parameter,pattern} ${parameter,pattern}

这四种形式都是 Bash 中的大小写转换操作,用于将变量值中匹配的部分进行大小写转换。它们的区别在于转换的方式和范围:

  1. ${parameter^pattern}:将变量 parameter 值中第一个匹配的 pattern 转换为大写。

    示例:

    text="hello world"
    echo "${text^w}"  # 输出 "Hello world",将第一个匹配的 "w" 转换为大写
    
  2. ${parameter^^pattern}:将变量 parameter 值中所有匹配的 pattern 转换为大写。

    示例:

    text="hello world"
    echo "${text^^o}"  # 输出 "hellO wOrld",将所有匹配的 "o" 转换为大写
    
  3. ${parameter,pattern}:将变量 parameter 值中第一个匹配的 pattern 转换为小写。

    示例:

    text="Hello World"
    echo "${text,w}"  # 输出 "hello World",将第一个匹配的 "W" 转换为小写
    
  4. ${parameter,,pattern}:将变量 parameter 值中所有匹配的 pattern 转换为小写。

    示例:

    text="Hello World"
    echo "${text,,o}"  # 输出 "hellO WOrld",将所有匹配的 "o" 转换为小写
    

总结:

  • ${parameter^pattern}${parameter^^pattern} 用于将变量值中的匹配部分转换为大写,分别转换第一个匹配和所有匹配。
  • ${parameter,pattern}${parameter,,pattern} 用于将变量值中的匹配部分转换为小写,分别转换第一个匹配和所有匹配。

变量特定操作 ${parameter@operator}

操作取值:

U 全大写
u 首字母大写
L 全小写
Q 转义字符生成
E 转义字符展开
P 提示符展开
A 变量名和值
K 数组变量名和值
a 属性值
k 数组变量名和值

下面是每个操作的示例:

  1. ${parameter@U}:将变量 parameter 的值中的所有小写字母转换为大写。

    示例:

    text="hello World"
    echo "${text@U}"  # 输出 "HELLO WORLD"
    
  2. ${parameter@u}:将变量 parameter 的值中的第一个字母转换为大写。

    示例:

    text="hello world"
    echo "${text@u}"  # 输出 "Hello world"
    
  3. ${parameter@L}:将变量 parameter 的值中的所有大写字母转换为小写。

    示例:

    text="HELLO WORLD"
    echo "${text@L}"  # 输出 "hello world"
    
  4. ${parameter@Q}:返回对变量 parameter 的值进行转义后的结果,可以用作输入。

    示例:

    text="Hello World"
    echo "${text@Q}"  # 输出 "Hello\ World"
    
  5. ${parameter@E}:将变量 parameter 的值中的反斜杠转义字符展开。

    示例:

    text="Hello\nWorld"
    echo "${text@E}"  # 输出 "Hello
    World"
    
  6. ${parameter@P}:展开变量 parameter 的值,类似于 Bash 提示符展开。

    示例:

    text="Hello World \A"
    echo "${text@P}"  # 输出 "Hello World 14:23"
    
  7. ${parameter@A}:返回一个赋值语句,将重建变量 parameter 的属性和值。

    示例:

    text="Hello World"
    echo "${text@A}"  # 输出 "text='Hello World'"
    
  8. ${parameter@K}:返回变量 parameter 的值,可能被引号引用,但数组的索引和关联数组的键值对将被逐个展开并用引号引用。

    示例:

    array=("key1" "value1" "key2" "value2")
    echo "${array@K}"  # 输出 "key1='value1' key2='value2'"
    
  9. ${parameter@a}:返回变量 parameter 的属性值,表示为一系列标志。

    示例:

    text="Hello World"
    echo "${text@a}"  # 输出 "-"
    

-:变量既没有被引号引用,也不是数组。
q:变量被单引号引用。
Q:变量被双引号引用。
x:变量是被解释的。
X:变量是被不被解释的。
@:变量是数组或者关联数组。
A:变量是被赋值的(assigned)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

感知机和神经网络

引入 什么是神经网络? 我们今天学习的神经网络,不是人或动物的神经网络,但是又是模仿人和动物的神经网络而定制的神经系统,特别是大脑和神经中枢,定制的系统是一种数学模型或计算机模型,神经网络由大量的人…

图像处理:图像噪声添加

文章目录 前言一、高斯噪声二、椒盐噪声三、泊松噪声四、斑点噪声五、指数噪声六、均匀噪声总结 前言 本文主要介绍几种添加图像噪声的方法,用于数据增强等操作。 以下图为例。 一、高斯噪声 高斯噪声就是给图片添加一个服从高斯分布的噪声,可以通过调…

vLLM初探

vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架,旨在极大地提升实时场景下的语言模型服务的吞吐与内存使用效率。vLLM是一个快速且易于使用的库,用于 LLM 推理和服务,可以和HuggingFace 无缝集成。vLLM利用了全新的注意力算法「Page…

Python+PySpark数据计算

1、map算子 对RDD内的元素进行逐个处理,并返回一个新的RDD,可以使用lambda以及链式编程,简化代码。 注意:再python中的lambda只能有行,如果有多行,要写成外部函数;(T)-&…

train_gpt2_fp32.cu - cudaCheck

源码 // CUDA error checking void cudaCheck(cudaError_t error, const char *file, int line) {if (error ! cudaSuccess) {printf("[CUDA ERROR] at file %s:%d:\n%s\n", file, line,cudaGetErrorString(error));exit(EXIT_FAILURE);} }; 解释 该函数用于检查CU…

无人机路径规划:基于鲸鱼优化算法WOA的复杂城市地形下无人机避障三维航迹规划,可以修改障碍物及起始点(Matlab代码)

一、部分代码 close all clear clc rng(default); %% 载入数据 data.S[50,950,12]; %起点位置 横坐标与纵坐标需为50的倍数 data.E[950,50,1]; %终点点位置 横坐标与纵坐标需为50的倍数 data.Obstaclexlsread(data1.xls); data.numObstacleslength(data.Obstacle(:,1)); …

连接和断开与服务器的连接

要连接到服务器,通常需要在调用mysql时提供一个MySQL用户名,很可能还需要一个密码。如果服务器在除了登录的计算机之外的机器上运行,您还必须指定主机名。联系您的管理员以找出应该使用哪些连接参数来连接(即使用哪个主机、用户名…

TypeError: can only concatenate str (not “int“) to str

TypeError: can only concatenate str (not "int") to str a 窗前明月光,疑是地上霜。举头望明月,低头思故乡。 print(str_len len(str_text) : len(a)) 试图打印出字符串 a 的长度,但是在 Python 中拼接字符串和整数需要使用字符…

【微服务】spring aop实现接口参数变更前后对比和日志记录

目录 一、前言 二、spring aop概述 2.1 什么是spring aop 2.2 spring aop特点 2.3 spring aop应用场景 三、spring aop处理通用日志场景 3.1 系统日志类型 3.2 微服务场景下通用日志记录解决方案 3.2.1 手动记录 3.2.2 异步队列es 3.2.3 使用过滤器或拦截器 3.2.4 使…

triton编译学习

一 流程 Triton-MLIR: 从DSL到PTX - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/671434808Superjomns blog | OpenAI/Triton MLIR 迁移工作简介https://superjom

基于STM32单片机的环境监测系统设计与实现

基于STM32单片机的环境监测系统设计与实现 摘要 随着环境污染和室内空气质量问题的日益严重,环境监测系统的应用变得尤为重要。本文设计并实现了一种基于STM32单片机的环境监测系统,该系统能够实时监测并显示室内环境的温湿度、甲醛浓度以及二氧化碳浓…

C语言题目:A+B for Input-Output Practice

题目描述 Your task is to calculate the sum of some integers 输入格式 Input contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line 输出格式 For each group of inpu…

Sass详解

Sass(Syntactically Awesome Stylesheets)是一种CSS预处理器,它允许你使用变量、嵌套规则、混入(Mixin)、继承等功能来编写CSS,从而使CSS代码更加简洁、易于维护和扩展。下面是Sass的详细解释: …

【docker】容器优化:一行命令换源

原理: 根据清华源提供的Ubuntu 软件仓库进行sources.list替换 ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 1、换源 echo "">/etc/apt/sources.list \&& echo "# 默认注释了源码镜像以提高 apt …

新iPadPro是怎样成为苹果史上最薄产品的|Meta发布AI广告工具全家桶| “碾碎一切”,苹果新广告片引争议|生成式AI,苹果倾巢出动

Remini走红背后:AI生图会是第一个超级应用吗?新iPadPro是怎样成为苹果史上最薄产品的生成式AI,苹果倾巢出动Meta发布AI广告工具全家桶,图像文本一键生成解放打工人苹果新iPadPro出货量或达500万台,成中尺寸OLED发展关键…

8、QT——QLabel使用小记2

前言:记录开发过程中QLabel的使用,持续更新ing... 开发平台:Win10 64位 开发环境:Qt Creator 13.0.0 构建环境:Qt 5.15.2 MSVC2019 64位 一、基本属性 技巧:对于Qlabel这类控件的属性有一些共同的特点&am…

QToolButton的特殊使用

QToolButton的特殊使用 介绍通过QSS取消点击时的凹陷效果点击时的凹陷效果通过QSS取消点击时的凹陷效果 介绍 该篇文章记录QToolButton使用过程中的特殊用法。 通过QSS取消点击时的凹陷效果 点击时的凹陷效果 通过QSS取消点击时的凹陷效果 #include <QToolButton> #i…

Dockerfile中的CMD和ENTRYPOINT

Shell格式和Exec格式 在Dockerfile中&#xff0c;RUN、CMD和ENTRYPOINT指令都可以使用两种格式&#xff1a;Shell格式和Exec格式。 exec 格式&#xff1a;INSTRUCTION ["executable","param1","param2"] shell 格式&#xff1a; INSTRUCTION c…

【深耕 Python】Quantum Computing 量子计算机(5)量子物理概念(二)

写在前面 往期量子计算机博客&#xff1a; 【深耕 Python】Quantum Computing 量子计算机&#xff08;1&#xff09;图像绘制基础 【深耕 Python】Quantum Computing 量子计算机&#xff08;2&#xff09;绘制电子运动平面波 【深耕 Python】Quantum Computing 量子计算机&…

ios 开发如何给项目安装第三方库,以websocket库 SocketRocket 为例

1.brew 安装 cococapods $ brew install cocoapods 2、找到xcode项目 的根目录&#xff0c;如图&#xff0c;在根目录下创建Podfile 文件 3、在Podfile文件中写入 platform :ios, 13.0 use_frameworks! target chat_app do pod SocketRocket end project ../chat_app.x…