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

【Linux操作系统 | 第19篇-进阶篇】Shell编程(上篇)

在这里插入图片描述

文章目录

  • 🧐初识Shell
    • 什么是Shell
    • 为什么要学习Shell🤔
    • Shell脚本的编写要求和执行方式👏
      • 脚本格式要求
    • 脚本的常见执行方式
    • 第一个Shell脚本
  • 🥝Shell变量
    • 系统变量+set命令🍋‍🟩
    • 用户变量🍋‍🟩
      • 定义用户变量
    • 变量的引用🍋‍🟩
      • 简单引用
      • 花括号引用
      • 命令替换
    • 特殊字符处理🍋‍🟩
    • 栗子🌰
      • 案例1:定义变量A
      • 案例3:声明静态的变量B=2,不能unset
      • 案例4:将指令返回的结果赋给变量
    • 变量定义规则🧾

🧐初识Shell

什么是Shell

Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。下面我们用一幅图来解释什么是
shell。
在这里插入图片描述

为什么要学习Shell🤔

  • Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理
  • 对于 JavaEE 和 Python 程序员来说,由于工作的需要,可能会要求你编写一些 Shell脚本来执行程序或者是完成对服务器的维护,比如编写一个定时备份数据库的脚本
  • 对于大数据程序员来说,需要编写 Shell程序来管理集群
  • Shell脚本的编写要求和执行方式👏

    脚本格式要求

  • 脚本以 #!/bin/bash 开头
  • 脚本具有可执行权限
  • 脚本的常见执行方式

  • 给要执行的脚本文件,添加可执行权限
  • 直接用 sh脚本文件名 命令执行,不用赋予脚本可执行权限
  • 第一个Shell脚本

    [root@hygge ~] pwd
    /root
    [root@hygge ~] mkdir shellCode # 在root目录下面创建一个文件夹shellCode
    [root@hygge ~] cd shellCode/
    [root@hygge shellCode] ll
    total 0
    [root@hygge shellCode] vim hello.sh #创建一个脚本文件
    

    在这里插入图片描述
    保存并退出。
    此时我们发现脚本是没有执行权限的

    [root@hygge shellCode] ll
    总用量 4
    -rw-r--r--. 1 root root 31 716 11:40 hello.sh   当前脚本没有可执行权限
    [root@hygge shellCode] ./hello.sh  					执行脚本
    -bash: ./hello.sh 									权限不够 
    

    测试解决方案有两种:一种是修改脚本的可执行权限,第二种就是使用sh + 脚本文件名的方式执行脚本
    第一步:

    [root@hygge shellCode] chmod u+x  hello.sh   给当前hello.sh赋予可执行权限
    [root@hygge shellCode] ll
    总用量 4
    -rwxr--r--. 1 root root 31 716 11:40 hello.sh   当前脚本具备可执行权限
    [root@hygge shellCode] ./hello.sh					可以使用相对路径的方式执行shell脚本
    Hello world
    [root@hygge shellCode] /root/shellCode/hello.sh		也可以使用绝对路径的方式执行shell脚本
    Hello world
    

    第二种:
    我们先恢复脚本不可执行的权限

    [root@hygge shellCode] chmod u-x hello.sh    让hello.sh脚本不具备可执行的权限
    [root@hygge shellCode] ll
    total 4
    -rw-r--r--. 1 root root 31 Sep 5 20:51 hello.sh
    [root@hygge shellCode] sh hello.sh   		 执行脚本
    Hello world
    

    🥝Shell变量

    系统变量+set命令🍋‍🟩

    Linux中Shell的变量分为 系统变量 和 用户自定义变量。系统变量:$HOME 、 $PWD、 $SHELL、 $USER 等等。
    我们可以使用set命令显示当前 Shell 中所有变量

    查询指定的系统变量:

    [root@hygge shellCode] echo $HOME
    /root
    [root@hygge shellCode] echo $PWD
    /root/shellCode
    [root@hygge shellCode] echo $SHELL
    /bin/bash
    [root@hygge shellCode] echo $USER
    root
    

    查询所有的系统变量:

    [root@hygge shellCode] set | more
    

    用户变量🍋‍🟩

    定义用户变量

    我们在开发中,绝大多数使用的是用户自定义的变量。呢么自定义变量该如何定义呢?

  • 定义变量:变量=值 【注意:等号两侧没有空格
  • 撤销变量:unset 变量
  • 声明静态变量:readonly 变量 【注意:该变量不能 unset 销毁
  • 变量的引用🍋‍🟩

    在 Shell 脚本中,要使用变量的值,需要在变量名前加上$符号。常见的引用方式有以下几种:

    简单引用

    直接在变量名前加$,如echo $name,这种方式最为常用

    name="Bob"
    echo $name    输出:Bob
    

    花括号引用

    使用场景:当变量名和其他字符连接在一起时,可能导致解析错误,此时需要使用花括号将变量名括起来明确变量边界

    fruit="apple"
    echo "I like ${fruit}s"  输出:I like apples
    

    如果不使用花括号,写成echo “I like $fruits”,Shell 会尝试查找名为fruits的变量,而不是我们期望的fruit变量

    命令替换

    可以将命令的执行结果赋值给变量,使用反引号`或者$( )

    current_date=`date +%Y-%m-%d`   	使用反引号
    echo $current_datecurrent_time=$(date +%H:%M:%S)   	使用$( )
    echo $current_time
    

    $( )形式相对更常用,因为它更具可读性,并且在嵌套命令替换时更方便

    特殊字符处理🍋‍🟩

    当变量的值包含空格、特殊字符等时,需要使用引号进行处理。

  • 双引号:双引号内的变量会被解析,特殊字符除了$、反斜杠\ 、反引号`外,其他都会保留原意
  • name="Alice"
    message="Hello, $name!"
    echo $message     输出:Hello, Alice!
    
  • 单引号:单引号内的所有字符都会原样输出,变量不会被解析
  • message='Hello, $name!'
    echo $message    输出:Hello, $name!
    
  • 反斜杠:反斜杠用于转义单个字符,使其失去特殊含义
  • path=/home/user\ documents
    echo $path    输出:/home/user documents
    

    这里没有 反斜杠\ 的话会报错的,因为documents前面有一个空格,属于特殊字符,要用双引号括起来

    栗子🌰

    案例1:定义变量A

    [root@hygge shellCode] vim vr.sh
    

    在这里插入图片描述
    结果:

    [root@hygge shellCode] chmod u+x vr.sh   设置脚本权限
    [root@hygge shellCode] ./vr.sh           执行脚本
    100
    

    还可以这么输出:
    在这里插入图片描述
    结果:

    [root@hygge shellCode] ./vr.sh
    100
    A=100
    A=100
    A=     这里是因为变量A被销毁了,所以值不存在了
    

    案例3:声明静态的变量B=2,不能unset

    在这里插入图片描述
    结果:

    [root@hygge shellCode]# ./vr.sh
    100
    A=100
    A=100
    A=
    B=2
    ./vr.sh: 第 20 行:unset: B: 无法反设定: 只读 variable   # 报错,无法销毁静态变量
    

    案例4:将指令返回的结果赋给变量

    在这里插入图片描述

    结果是:

    [root@hygge shellCode]# ./vr.sh
    100
    A=100
    A=100
    A=
    B=2
    ./vr.sh: 第 20 行:unset: B: 无法反设定: 只读 variable
    2025-07-16---12:05:58
    2025-07-16---12:05:58
    

    在上面的shell脚本里面,我们的变量都是大写,那么在shell编程里面,变量定义的规则是什么呢?

    变量定义规则🧾

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头
  • 等号两侧不能有空格
  • 变量名称一般习惯为大写,这是一个规范,大家遵守即可

  • 如果我的内容对你有帮助,请 点赞 评论 收藏 。创作不易,大家的支持就是我坚持下去的动力!
    在这里插入图片描述

http://www.dtcms.com/a/282452.html

相关文章:

  • 英飞凌 | 新兴无线BMS系统解决方案深度分析
  • C语言:动态内存管理
  • 【Docker-Day 6】从零到一:精通 Dockerfile 核心指令 (FROM, WORKDIR, COPY, RUN)
  • 壹脉销客AI电子名片源码核心架构
  • C++11 std::uninitialized_copy_n 原理与实现
  • 计算机网络:(九)网络层(下)超详细讲解互联网的路由选择协议、IPV6与IP多播
  • EVA series系列(上)
  • UltraISO编辑ISO文件
  • XPath注入攻击详解:原理、危害与防御
  • PLC-BMS电力载波通信技术深度解析:智能电网与储能系统的融合创新
  • (nice!!!)(LeetCode 每日一题) 3201. 找出有效子序列的最大长度 I (动态规划dp)
  • js数组简介
  • Linux 探秘进程与 fork:从内核源码到容器化演进
  • NLP:LSTM和GRU分享
  • 加速度传感器的用途与应用
  • Opencv---cv::minMaxLoc函数
  • Go与Python在数据管道与分析项目中的抉择:性能与灵活性的较量
  • React 中 props 的最常用用法精选+useContext
  • 单列集合顶层接口Collection
  • QT——事件系统详解
  • YOLOv13_SSOD:基于超图关联增强的半监督目标检测框架(原创创新算法)
  • GaussDB 数据库架构师修炼(五) 存储容量评估
  • 动态规划题解_打家劫舍【LeetCode】
  • MySQL 8.0 OCP 1Z0-908 题目解析(27)
  • 钱包核心标准 BIP32、BIP39、BIP44:从助记词到多链钱包的底层逻辑
  • RocketMQ源码级实现原理-消息过滤与重试
  • 【Deepseek-R1+阿里千问大模型】四步完成本地调用本地部署大模型和线上大模型,实现可视化使用
  • 拥抱主权AI:OpenCSG驱动智能体运营,共筑新加坡智能高地
  • 【技术追踪】基于检测器引导的对抗性扩散攻击器实现定向假阳性合成——提升息肉检测的鲁棒性(MICCAI-2025)
  • 辅助驾驶GNSS高精度模块UM680A外形尺寸及上电与下电