[Linux][Shell][Shell变量]详细讲解

目录

  • 1.本地变量
  • 2.变量定义
  • 3.取出变量值
  • 4.特殊变量
  • 5.特殊状态变量
  • 6.shell内置的变量命令
    • 1.echo
    • 2.eval
    • 3.exec
  • 7.截取字符串
  • 8.特殊shell扩展变量处理
    • 1.语法
    • 2.应用场景


1.本地变量

  • 定义Shell变量,变量名不需要加$
  • 本地变量只在⽤户当前shell⽣存期中有效

2.变量定义

  • 变量名要求:字⺟、数字、下划线组成、可以是字⺟或是下划线开头
  • 变量名严格区分⼤⼩写

3.取出变量值

  • 单引号:所⻅即所得,强引⽤
  • 双引号:输出引号⾥所有内容,识别特殊符号,弱引⽤
  • ⽆引号:连续的符号可以不加引号,有空格则有歧义,最好使⽤双引号
  • 反引号:引⽤命令执⾏结果,等于$()⽤法

4.特殊变量

  • shell的特殊变量,⽤在如脚本,函数传递参数使⽤

  • 有如下特殊的,位置参数变量

    变量作用
    $0获取shell脚本文件名,以及脚本路径
    $n获取shell脚本的第n个参数,n在1~9之间,大于9则需要些{},如{$10}
    $#获取执行的shell脚本后面的参数总个数
    $*获取shell脚本所有参数,不加引号等同于$@作用,加上引号"$*"作用是接收所有参数为单个字符串
    $@不加引号,效果同上,加引号,是接收所有参数为独立字符串

5.特殊状态变量

  • 查找方式man bash,搜索Special Parameters

    变量作用
    $?上次命令执行状态返回值,0正确,非0失败
    $$当前shell脚本的进程号
    $!上一次后台进程的PID
    $_获取上次命令的最后一个参数

6.shell内置的变量命令

1.echo

  • 参数
    • -n:不换行输出内容
    • -e:解释转义字符
      • \n:换行
      • \r:回车
      • \t:tab
      • \b:退格
      • \v:纵向制表符

2.eval

  • 功能:执行多个命令
  • 示例eval ls; cd ~

3.exec

  • 功能:不创建子进程,执行后续命令,exec执行后,自动exit

7.截取字符串

  • 语法

    语法作用
    #从开头删除匹配最短
    ##从开头删除匹配最长
    %从结尾删除匹配最短
    %%从结尾删除匹配最长
    #指定字符内容截取
    a*c匹配开头为a,中间任意个字符,结尾为c的字符串
    ${变量}返回变量值
    ${#变量}返回变量长度,字符长度
    ${变量:start}返回变量offset数值之后的字符
    ${变量:start:length}提取offset之后的length限制的字符
    ${变量#word}从变量开头,删除最短匹配的word子串
    ${变量##word}从变量开头,删除最长匹配的word
    ${变量%word}从变量结尾,删除最短匹配的word子串
    ${变量%%word}从变量结尾,删除最长匹配的word子串
    ${变量/pattern/string}用string代替第一个匹配的pattern
    ${变量//pattern/string}用string代替所有的pattern
  • 操作实例:删除文件名

    # 通过⼦串的替换⽅式
    snowk@SnowKYP# f=stu_102999_1_finished.jpg# 变量的⼦串功能,去掉后缀
    snowk@SnowKYP# echo ${f//_finished/}
    stu_102999_1.jpg# 利⽤变量的反引⽤替换⽂件名
    snowk@SnowKYP# mv $f `echo ${f//_finished/}`# 剩下的⽂件,利⽤循环操作
    # 找出剩下所有需要替换的jpg⽂件
    snowk@SnowKYP# ls *fin*.jpg
    stu_102999_2_finished.jpg stu_102999_3_finished.jpg stu_102999_4_finished.jpg
    stu_102999_5_finished.jpg# 写shell循环代码,循环操作
    # 去掉所有jpg⽂件的_finished后缀
    snowk@SnowKYP# for file in `ls *fin*.jpg`;do mv $file `echo ${file//_finished/}`;donesnowk@SnowKYP# ls *.jpg
    stu_102999_1.jpg stu_102999_2.jpg stu_102999_3.jpg stu_102999_4.jpg stu_102999_5.jpg
    

8.特殊shell扩展变量处理

1.语法

  • 功能:这四个扩展变量,都属于对变量的值进行判断、处理
  • 语法parameter,参数,范围
    • ${parameter:-word}:如果parameter变量值为空,返回word字符串
    • ${parameter:=word}:如果parameter变量值为空,则word替代变量值,且返回其值
    • ${parameter:?word}:如果parameter变量值为空,word当作stderr输出,否则输出变量值
      • ⽤于设置变量为空导致错误时,返回的错误信息
    • ${parameter:+word}:如果parameter变量值为空,什么都不做,否则word返回

2.应用场景

  • 数据备份,删除过期数据的脚本
    # 原脚本命令,有bug,有歧义
    find ${file_path} -name '*.tar.gz' -type f -mtime +7 | xargs rm -f# 修正后的脚本命令
    # 如果有bug起义,就在当前目录搜索并执行删除
    find ${file_path:=/tmp} -name '*.tar.gz' -type f -mtime +7 | xargs rm -f
    

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

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

相关文章

SpringBoot防止重复提交 AOP+自定义注解+redis

1.什么是重复提交呢 在Web开发中,重复提交(也称为双重提交或重复表单提交)是指用户在没有明确意图的情况下,多次提交同一表单的情况。这可能是由于用户多次点击提交按钮、表单提交过程中的网络延迟导致用户重复点击、或者由于浏览…

双向全桥隔离dc-dc变换器(DAB)

DAB(dual active bridge) 双向全桥隔离dc-dc变换器(DAB)和Buck/Boost不同,该变换器通过交流电感进行功率传输,其调制和控制不适合直接借鉴已有的研究。 调制挑战:开关网络相对复杂,调制自由度较多&#x…

揭秘SQL Server数据库选项:性能与行为的调控者

揭秘SQL Server数据库选项:性能与行为的调控者 在SQL Server的世界中,数据库选项是那些可以调整以优化数据库性能和行为的设置。它们是数据库管理员和开发者的得力助手,通过精细调控,可以显著提升数据库的响应速度和资源利用率。…

MySQL MVCC

总结自小林coding,bojiangzhou 脏读、不可重复读、幻读 说的都是并发读取的问题,最简单的方式就是给记录加一把锁,不管是更新、读取记录都需要竞争到这把锁之后才能操作。但这种方式的并发性能可想而知会有多么低。 于是 InnoDB 就设计了MVC…

C#——二进制流序列化和反序列化

C#二进制流序列化和反序列化 在C#中,可以使用BinaryFormatter来进行二进制的序列化和反序列化。 首先,定义一个可序列化的类 [Serializable] public class MyObject {public int IntProperty { get; set; }public string StringProperty { get; set; …

ubuntu 上配置开机自动启动ssh

一般安装了就会自动启动。但是各种rc.local, cron都测试了一下,还是这个systemd有效 使用 systemd 服务 创建文件 sudo nano /etc/systemd/system/custom-ssh.service [Unit] DescriptionStart SSH service at boot Afternetwork.target[Service] ExecStart/usr/…

软件开发(续).NET框架

1.解释一下.NET框架中的CLR(公共语言运行时)是什么,以及它的作用和功能是什么? CLR(Common Language Runtime)的概念和作用 在.NET框架中,CLR(Common Language Runtime&#xff09…

代码优化(2)——小程序登录

验证身份的时候,依赖的是cookie里面的token $this->request->server(HTTP_TOKEN,$this->request->request(token, \think\Cookie::get(token))) 小程序的交互权限验证,一般放到header里面进行鉴权,极少是通过cookie来传递参数验证…

一起来了解深度学习中的“梯度”

文章目录 前言一、什么是梯度?二、梯度计算三、优化算法四、示例五、梯度的作用六、形象化解释七、如果完全不懂公式可以实现这个算法吗?1. 使用 Hugging Face Transformers 实现深度学习任务1) 安装库2) 加载预训练模型和分词器3) 准备数据4) 进行推理5…

LeetCode HOT100(二)双指针

移动0 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 解法1:双指针交换 指针L&…

“论基于构件的软件开发方法及其应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 基于构作的软件开发 (Component-Based Software Development,CBSD) 是一种基于分布对象技术、强调通过可复用构件设计与构造软件系统的软件复用途径。基于构件的软件系统中的构件可以是COTS (Commercial-Off-the-Shelf)构件&#x…

Spring Boot轻松整合Minio实现文件上传下载功能

一、Linux 安装Minio 安装 在/root/xxkfz/soft目录下面创建文件minio文件夹,进入minio文件夹,并创建data目录; [rootxxkfz soft]# mkdir minio [rootxxkfz soft]# cd minio [rootxxkfz minio]# mkdir data 执行如下命令进行下载 [rootxx…

Java内存划分详解:从基础到进阶

Java内存划分详解:从基础到进阶 1. 程序计数器(Program Counter Register)2. Java虚拟机栈(Java Virtual Machine Stack)3. 堆(Heap)4. 方法区(Method Area)5. 运行时常量…

DDD架构面试问题

基础概念 什么是领域驱动设计(DDD)? 请解释一下DDD的核心思想和目标。 DDD中的领域(Domain)是什么? 请描述一下领域的概念以及它在软件开发中的重要性。 什么是限界上下文(Bounded Context&am…

ArduPilot开源代码之OpticalFlow_backend

ArduPilot开源代码之OpticalFlow_backend 1. 源由2. Library设计3. 重要例程3.1 OpticalFlow_backend::_update_frontend3.2 OpticalFlow_backend::_applyYaw 4. 总结5. 参考资料 1. 源由 光流计是一种低成本定位传感器,所有的光流计设备传感驱动代码抽象公共部分统…

[计网初识1] TCP/UDP

学习内容 1.TCP建立链接的3次握手,断开连接的4次挥手 2.TCP报文段组成 内容 1.TCP 建立连接的3次握手? 假设主动方是客户端,被动方是服务端。 第一次 客户端给服务端发送 “hello,我是客户端” (TCP段中 SYN1) 第二次 服务端给客户端发送"我接…

从零开始的python学习生活2

接上封装 class Phone:__volt0.5def __keepsinglecore(self):print("让cpu以单核运行")def if5G(self):if self.__volt>1:print("5G通话已开启")else:self.__keepsinglecore()print("电量不足,无法使用5G通话,已经设置为单…

Django项目创建的准备工作【 2 】

【 一 】调整后端目录 #1 目录结构 """ ├── luffy_api├── logs/ # 项目运行时/开发时日志目录 - 包├── manage.py # 脚本文件├── luffy_api/ # 项目主应用,开发时的代码保存 - 包├── apps/ …

【Git基本操作】添加文件 | 修改文件 | 及其各场景下.git目录树的变化

目录 1. 添加文件&add操作和commit操作 2. .git树状目录的变化 3. git其他操作 4. 修改文件 4.1 git status 4.2 git diff 1. 添加文件&add操作和commit操作 add操作:将工作区中所有文件的修改内容 添加进版本库的暂存区中。commit操作:…

云端编码:将您的技术API文档安全存储在iCloud的最佳实践

云端编码:将您的技术API文档安全存储在iCloud的最佳实践 作为一名技术专业人士,管理不断增长的API文档库是一项挑战。iCloud提供了一个无缝的解决方案,允许您在所有设备上存储、同步和访问您的个人技术API文档。本文将指导您如何在iCloud中高…