Shell变量的奇妙用法,让你的Shell脚本更简洁高效

news2024/10/6 20:36:47

当涉及到命令行工具和脚本编写时,Shell变量是一个非常重要的概念。利用Shell变量的一些奇妙用法,我们可以用一个简单的表达式实现复杂操作,使我们的命令更加简洁高效。

本文将介绍一些常用的Shell变量操作符,包括字符串操作、数组操作等。这些操作符可以帮助我们快速地截取子字符串、替换文本、遍历数组等操作。本文所有用法适用于bash,部分适用于ksh。

图片

变量子串

${var} 返回变量var的内容,单独使用时有没有{}一样,混合多个变量和常量时,用{}界定变量名

${#var} 返回变量var内容的长度

${var:offset} 从变量var中的偏移量offset开始截取到字符串结尾的子字符串,offset从0开始

${var:offset:length} 从变量var中的偏移量offset开始截取长度为length的子字符串

${var#*.} 从变量var中删除第一个匹配的点(.)及其左边的所有字符

${var##*.} 从变量var中删除最后一个匹配的点(.)及其左边的所有字符

${var%.*} 从变量var中删除最后一个匹配的点(.)及其右边的所有字符

${var%%.*} 从变量var中删除第一个匹配的点(.)及其右边的所有字符

示例:

var=file.txt.tar.gz
${var#*.}  #内容为"txt.tar.gz"
${var##*.} #内容为"gz"
${var%.*}  #内容为"file.txt.tar"
${var%%.*} #内容为"file"
 


也可以使用其它Pattern和表达式,示例:

var=/home/xxx/aaa/file.txt #假设xxx为当前用户
# 从路径中获取文件名
${var##*/}  #内容为"file.txt"

 

# 将绝对路径转为相对路径
# whoami是获取当前用户名,使用$()执行子shell,$(whoami)将得到xxx
~${var#*$(whoami)}  #内容为"~/aaa/file.txt"
${var/pattern/string} 使用string代替第一个匹配的pattern

${var//pattern/string} 使用string代替所有匹配的pattern

${var,} 首字母转小写

${var,,} 全部转小写

${var^} 首字母转大写

${var^^} 全部转大写

 




特殊扩展变量

${var-word} 如果变量var未赋值,则返回字符串word

${var:-word} 如果变量var未赋值或者值为空,则返回字符串word

${var+word} 如果变量var有值(包括空串""),则返回字符串word

var1=foo
var2=
${var1-word}        # 内容为"foo"
echo ${var2-word}   # 内容为""
echo ${var2:-word}  # 内容为"word"
 


${var:+word} 如果变量var有值且不为空,则返回字符串word

${var=word} 如果变量var未赋值,则返回字符串word,并为var赋值为字符串word

${var:=word} 如果变量var未赋值或者值为空串,则返回字符串word,并为var赋值为字符串word

${var?word} 如果变量var未赋值,将字符串word作为标准错误输出,否则返回变量var的值

${var:?word} 如果变量var未赋值或者值为空串,将字符串word作为标准错误输出,否则返回变量var的值

数组

array=(1 2 3 a b c) 定义一个名为array的数组,包含了6个元素,元素字段类型不需要统一

${array[index]} 访问数组中的元素,index从0开始,如果为负表示从数组的末尾开始的偏移量

${array[*]} 获取数组中所有元素

${array[@]} 获取数组中所有元素

${#array[*]} 获取数组的长度

${#array[@]} 获取数组的长度

${!array[@]} 获取数组索引列表,返回 0 1 2 3 4 5

array+=(4 d) 向数组中添加元素,数组内容为 1 2 3 a b c 4 d

unset array[6] 删除第 7 个元素,数组内容为 1 2 3 a b c d

unset array[-1] 删除倒数第 1 个元素,数组内容为 1 2 3 a b c

多行字符串变量

var=$(cat <<- 'EOF'
line1
line2
...
EOF
)
 


或者使用单引号或者双引号(单引号中${}和$()等都不会取表达式的值,双引号中才会):

var='line1
line2
...'
 


注意上述两种写法的差别,避免为变量内容带来不必要的空行。通过循环可依次得到变量中的每一行:

while read -r line; do
echo $line
done <<< $var
 


 

Shell系统变量

$1 表示第一个参数,$2 表示第二个参数 ...

$# 命令行参数的个数

$0 当前Shell脚本程序的名称

$? 前一个命令或函数的返回码

$* 以 "参数1 参数2 ... " 形式获取所有参数

$@ 以 "参数1" "参数2" ... 形式获取所有参数

$$ 本程序的进程ID,即PID

$! 上一个命令的PID

$PPID 父进程的PID

$UID 执行这个脚本的当前用户ID

变量输出

变量内容的输出使用 echo 命令。

如果未使用 echo,则会将变量内容当成 Shell 命令来执行,常用于调用某个程序并传递参数,如:应用程序启动脚本。

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

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

相关文章

SAP UI5 walkthrough step5 Controllers

在这个章节&#xff0c;我们要做的是&#xff0c;将之前的text文本展示为一个按钮&#xff0c;并将声明绑定在点击按钮事件。 因为改的是外观&#xff0c;所以我们修改的是view.XML webapp/view/App.view.xml <mvc:ViewcontrollerName"ui5.walkthrough.controller.A…

Nacos注册中心客户端容灾

目前Nacos客户端有一个FailoverReactor来进行容灾文件的管理&#xff0c;可以通过在指定磁盘文件里写入容灾数据来进行客户端使用数据的覆盖。FailoverReactor目前会拦截Nacos客户端查询接口调用&#xff0c;以getAllInstances接口为例&#xff0c;目前FailoverReactor的工作流…

uni-app实现安卓原生态调用身份证阅读器读卡库读身份证和社保卡、银行卡、IC卡等功能

DONSEE系列多功能读写器Android Uniapp API接口规范V1.0.0 本项目Uniapp调用了身份证读卡器的库文件&#xff1a;DonseeDeviceLib-debug.aar&#xff0c;该库放到nativeplugins\donsee-card\android&#xff0c;然后会自动加载。SDK会自动检查是否拥有USB设备权限&#xff0c;…

2023五岳杯量子计算挑战赛数学建模思路+模型+代码+论文

赛题思路&#xff1a;12月6日晚开赛后第一时间更新&#xff0c;获取见文末名片 “五岳杯”量子计算挑战赛&#xff0c;是国内专业的量子计算大赛&#xff0c;也是玻色量子首次联合移动云、南方科技大学共同发起的一场“企校联名”的国际竞赛&#xff0c;旨在深度融合“量子计算…

人工智能教程(三):更多有用的 Python 库

目录 前言 推荐 JupyterLab 入门 复杂的矩阵运算 其它人工智能和机器学习的 Python 库 前言 在本系列的上一篇人工智能教程&#xff08;二&#xff09;&#xff1a;人工智能的历史以及再探矩阵中&#xff0c;我们回顾了人工智能的历史&#xff0c;然后详细地讨论了矩阵。在…

二维数组附近遍历所有值

二维数组附近遍历所有值 假如以56点为中心&#xff0c;上下左右近距离遍历附近值&#xff0c;看代码&#xff0c;代码把思路写出来了&#xff0c;边界问题暂不处理。 #include<iostream> using namespace std;void FindNearPos(int (*int_arr)[10] , int p_row , int …

Linux centos8安装JDK1.8、tomcat

一、安装jdk 1.如果之前安装过jdk&#xff0c;先卸载掉旧的 rpm -qa | grep -i jdk 2.检查yum中有没有java1.8的包 yum list java-1.8* 3.yum安装jdk yum install java-1.8.0-openjdk* -y 4.验证 二、安装tomcat Index of /tomcat 可以在这里选择你想要安装的tomcat版本…

【vtkWidgetRepresentation】第七期 vtkImplicitPlaneRepresentation

很高兴在雪易的CSDN遇见你 前言 本文分享vtkImplicitPlaneRepresentation源码剖析&#xff0c;及相关的实例&#xff0c;该接口主要用于切割交互&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起…

线上盲盒小程序,开启互联网盲盒时代

近年来&#xff0c;盲盒经济在国内非常火爆&#xff0c;各类盲盒品牌层出不穷&#xff0c;深受国内外年轻人、消费者的喜爱。 目前&#xff0c;根据数据显示&#xff0c;盲盒市场不仅在线下异常火热&#xff0c;线上盲盒也是成为了大众的新选择。各类电商平台中盲盒的成交额更…

C++ Qt开发:Qt的安装与配置

Qt是一种C编程框架&#xff0c;用于构建图形用户界面&#xff08;GUI&#xff09;应用程序和嵌入式系统。Qt由Qt公司&#xff08;前身为Nokia&#xff09;开发&#xff0c;提供了一套跨平台的工具和类库&#xff0c;使开发者能够轻松地创建高效、美观、可扩展的应用程序。其被广…

元宇宙vr党建云上实景展馆扩大党的影响力

随着科技的飞速发展&#xff0c;VR虚拟现实技术已经逐渐融入我们的日常生活&#xff0c;尤其在党建领域&#xff0c;VR数字党建展馆更是成为引领红色教育新风尚的重要载体。今天&#xff0c;就让我们一起探讨VR数字党建展馆如何提供沉浸式体验&#xff0c;助力党建工作创新升级…

无头浏览器与Selenium:探索无界爬虫的奇妙世界

selenium设置无头浏览器 背景 ​ 我们之前的selenium都是浏览器驱动自动打开一个网页&#xff0c;执行相关操作&#xff0c;其实也可以让其后台显示&#xff0c;不用在前台显示。 ​ 要设置无头浏览器&#xff0c;可以使用Selenium的Headless模式。在Headless模式下&#xf…

解读 | 阿里通义千问模型全尺寸开源 “诚意满满“背后的名与利

大家好&#xff0c;我是极智视界&#xff0c;欢迎关注我的公众号&#xff0c;获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码和资源下载&#xff0c;链接&#xff1a;https://t.zsxq.com/0aiNxERDq 12 月 1 日阿里开源…

【深度挖掘Java性能调优】「底层技术原理体系」深入挖掘和分析如何提升服务的性能以及执行效率(性能三大定律)

深入挖掘和分析如何提升服务的性能以及执行效率 前提介绍知识要点 性能概述教你看懂程序的性能案例介绍性能指标性能的参考指标性能瓶颈&#xff08;木桶原理&#xff09; 性能分析三大定律Amdahl定律计算公式参数解释案例分析定律总结 Gustafson定律与Amdahl定律相对立Gustafs…

Postman和Apifox针对不同环境、全局变量的使用与比较

文章目录 一、Postman1、配置环境和全局变量2、验证3、存在问题分析 二、Apifox1、配置环境和全局参数2、创建公共脚本3、测试 总结 一、Postman 1、配置环境和全局变量 在Postman的界面中&#xff0c;点击"Environment"&#xff0c;添加我们需要的环境&#xff0c…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(二)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理1&#xff09;数据介绍2&#xff09;数据测试3&#xff09;数据处理 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客&#xff0c;在读者…

10 大 Android 手机系统修复软件深度评测

您的新 Android 手机可能因其令人兴奋的性能而印象深刻。然而&#xff0c;随着时间的推移&#xff0c;您可能会发现系统有些地方与以前不太一样。您可能会遇到屏幕无响应、 Android应用程序崩溃、连接问题、电池耗尽等现象。 10 大 Android 手机系统修复软件 好吧&#xff0c;…

伦茨科技宣布ST17H6x芯片已通过Apple Find My「查找」认证

深圳市伦茨科技有限公司&#xff08;以下简称“伦茨科技”&#xff09;发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家&#xff0c;该平台提供可通过Apple Find My认证的Apple查找&#xff08;Find My&#xff09;功能集成解决方案。…

五、HotSpot细节实现

一、并发标记与三色标记 问题&#xff1a;三色标记到底发生在什么阶段&#xff0c;替代了什么。并发标记 1、并发标记( Concurrent Marking) 从 GC Root 开始对堆中对象进行可达性分析&#xff0c;递归扫描整个堆里的对象图&#xff0c;找出要回收的对象&#xff0c;这阶段耗…

Debian Linux安装配置ibus rime中文输入法

Linux安装配置Rime 安装 清除所有fcitx软件包 sudo apt purge fcitx*安装ibus和ibus-rime sudo apt install ibus ibus-rime启用输入法 找到输入法配置 启用ibus输入法 此时由于刚安装完毕ibus并没有启动 要么重启系统 要么输入下面的命令 ibus-daemon -drx找到ibus首选…