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

【Linux从入门到精通】第22篇:Shell变量与数据类型——数字与字符串处理

目录一、引言变量不只是“存个值”二、环境变量 vs 局部变量作用域的秘密2.1 用实验理解差别2.2 什么时候用哪种2.3 查看当前所有环境变量2.4 持久化环境变量三、只读变量与常量保护3.1 readonly让变量变成“常量”3.2 什么时候用只读变量3.3 查看所有只读变量四、字符串处理Shell脚本的核心技艺4.1 字符串拼接4.2 获取字符串长度4.3 截取子字符串4.4 从首尾删除模式匹配4.5 字符串替换4.6 其他常用判断五、数字运算Shell的“计算器”5.1 整数运算$(()) 和 $[]5.2 常用的数学场景六、综合实战Nginx日志解析器七、本篇小结动手练习八、下篇预告一、引言变量不只是“存个值”写脚本久了你会发现真正花时间的不是“怎么定义变量”而是怎么处理变量里的内容从日志文件中提取出IP地址批量修改文件名后缀.jpg→.png检查路径末尾有没有多余的斜杠拼接出带时间戳的备份文件名Shell是一种“弱类型”语言——变量不需要声明类型同一个变量可以存数字、存字符串、甚至存命令输出。这种灵活性是便利也是坑你必须清楚知道“现在这个变量里到底装着什么”。今天的目标就是掌握这些处理技巧。二、环境变量 vs 局部变量作用域的秘密2.1 用实验理解差别先做一个小实验。打开两个终端在第一个终端中bash# 终端1 my_varhello echo $my_var # 输出hello bash # 启动一个子Shell echo $my_var # 输出空子Shell访问不到父Shell的局部变量 exit # 退出子Shell现在改用exportbash# 终端1 export my_varhello bash # 启动一个子Shell echo $my_var # 输出hello子Shell能访问到环境变量了 exit这个实验揭示了局部变量和环境变量的核心区别前者只在当前Shell进程内可见后者会传递给所有子进程。2.2 什么时候用哪种局部变量默认bash# 脚本内部的临时变量用局部变量 temp_file/tmp/backup_$(date %s).tar.gz counter0环境变量需要exportbash# 需要让子进程如Python脚本、其他Shell读取的配置 export DATABASE_URLmysql://localhost:3306/mydb export APP_ENVproduction2.3 查看当前所有环境变量bashenv # 查看所有环境变量 printenv # 同上 printenv HOME # 查看特定环境变量常见预定义环境变量变量含义示例值$HOME当前用户家目录/home/zhangsan$PATH命令搜索路径/usr/local/bin:/usr/bin:/bin$USER当前用户名zhangsan$PWD当前工作目录/home/zhangsan/project$SHELL当前Shell/bin/bash$OLDPWD上一个工作目录/tmp$RANDOM0-32767的随机数12345$$当前Shell进程的PID56782.4 持久化环境变量在脚本中用export定义的环境变量只在当前会话生效。要让环境变量永久生效需要写入Shell配置文件bash# 添加到 ~/.bashrc每个交互式Shell都会加载 vim ~/.bashrc export MY_PROJECT_HOME/opt/myproject # 让配置立即生效 source ~/.bashrc注意~/.bashrc每次打开终端都会执行~/.bash_profile只执行一次。一般把环境变量定义在~/.bashrc中然后在~/.bash_profile里source它。三、只读变量与常量保护3.1 readonly让变量变成“常量”bash#!/bin/bash readonly PI3.14159 PI3.14 # 报错PI: readonly variable3.2 什么时候用只读变量bash#!/bin/bash # 配置文件路径——不希望在脚本中被意外修改 readonly CONFIG_FILE/etc/myapp/config.yaml readonly LOG_DIR/var/log/myapp readonly MAX_RETRIES3 # 后续代码中 CONFIG_FILE 绝不会被意外覆盖3.3 查看所有只读变量bashreadonly # 列出所有只读变量包括系统预定义的 readonly -p # 同上你会发现$HOME、$USER等也是只读的——系统不允许你修改这些关键信息。四、字符串处理Shell脚本的核心技艺Shell中一切都是字符串。你输入的IP、文件名、路径、日志内容——全是字符串。掌握字符串处理就掌握了Shell脚本的半壁江山。4.1 字符串拼接Shell的拼接非常直接——把变量挨着写就行bashnamezhangsan greetingHello, ${name}! echo $greeting # Hello, zhangsan! # 多个变量拼接 src/var/log appnginx filenameerror.log full_path${src}/${app}/${filename} echo $full_path # /var/log/nginx/error.log避免歧义的拼接bashprefixsuper echo ${prefix}man # superman推荐 echo $prefixman # superman也可但不够清晰 echo $prefixman # superman echo $prefix man # super man空格被保留了不是拼接4.2 获取字符串长度bashstrHello World echo ${#str} # 11实用场景判断用户输入是否为空bashif [ ${#input} -eq 0 ]; then echo 输入不能为空 exit 1 fi4.3 截取子字符串格式${变量:起始位置:长度}起始位置从0开始bashstrHello World echo ${str:0:5} # Hello 位置0开始取5个字符 echo ${str:6} # World 位置6开始取到末尾 echo ${str:6:3} # Wor 位置6开始取3个 echo ${str: -5} # World 从末尾倒数5个注意冒号后有空格实用场景bash# 从日期时间戳中提取年月日 timestamp20260426_153000 date_part${timestamp:0:8} # 20260426 time_part${timestamp:9} # 153000 # 去掉文件扩展名 filenamereport.tar.gz base${filename:0:10} # 依赖硬编码位置不够通用 # 更好的方法见下一节的模式匹配4.4 从首尾删除模式匹配这是Shell字符串处理中最强大的功能有四种模式语法含义记忆${var#pattern}从开头删除最短匹配#像一个井号开头的标记${var##pattern}从开头删除最长匹配##多删${var%pattern}从末尾删除最短匹配%像百分号结尾的标记${var%%pattern}从末尾删除最长匹配%%多删实战处理文件路径bashpath/home/zhangsan/project/report.tar.gz # 获取文件名删除最后一个/之前的所有内容 filename${path##*/} echo $filename # report.tar.gz # 获取目录名删除文件名部分 dirname${path%/*} echo $dirname # /home/zhangsan/project # 获取文件扩展名删除最后一个.之前的所有内容 ext${path##*.} echo $ext # gz注意不是 tar.gz # 获取不带扩展名的文件名 base${filename%%.*} echo $base # report删除了 .tar.gz实战批量处理日志文件bash# 把所有 .log 文件重命名为 .log.bak for file in *.log; do base${file%.log} # 去掉 .log 后缀 mv $file ${base}.log.bak done4.5 字符串替换格式${变量/旧内容/新内容}bashurlhttp://example.com/index.html # 替换第一个匹配 echo ${url/http/https} # https://example.com/index.html # 替换所有匹配加一个/ path/usr/local/bin:/usr/bin:/bin echo ${path//\/usr/\/opt} # /opt/local/bin:/opt/bin:/bin单斜杠与双斜杠的区别bashtextaaaa echo ${text/a/A} # Aaaa只替换第一个 echo ${text//a/A} # AAAA替换所有4.6 其他常用判断语法含义示例${var:-默认值}如果var为空返回默认值${user:-root}${var:默认值}如果var为空赋值为默认值并返回${count:1}${var:替代值}如果var不为空返回替代值${debug:verbose}${var:?错误信息}如果var为空打印错误并退出${config:?未设置}bash#!/bin/bash # 使用默认值避免变量未定义 DB_HOST${DB_HOST:-localhost} DB_PORT${DB_PORT:-3306} echo 连接数据库 ${DB_HOST}:${DB_PORT}五、数字运算Shell的“计算器”Shell默认把变量值当字符串处理要做数学运算需要特殊语法。5.1 整数运算$(()) 和 $[]basha10 b3 echo $((a b)) # 13 echo $((a - b)) # 7 echo $((a * b)) # 30 echo $((a / b)) # 3整数除法向下取整 echo $((a % b)) # 1取余 echo $((a ** b)) # 1000指数也可以写成bashecho $[a b] # 老式写法仍然可用但不推荐 let c a b # 使用let命令5.2 常用的数学场景bash# 计数器循环中常用 count0 count$((count 1)) # 计算百分比 total100 used35 percent$((used * 100 / total)) # 35 echo 使用率${percent}% # 随机数生成 random_num$((RANDOM % 100)) # 0-99的随机数 echo $random_num六、综合实战Nginx日志解析器把今天学的字符串处理技巧整合到一个实用脚本中bash#!/bin/bash # 练习脚本简单Nginx访问日志解析 # 模拟一条Nginx日志实际使用时应从文件读取 log_line192.168.1.100 - - [26/Apr/2026:15:30:00 0800] GET /index.html HTTP/1.1 200 1024 http://example.com Mozilla/5.0 echo 原始日志 echo ${log_line} echo # 1. 提取IP地址第一个字段 ip${log_line%% *} echo IP地址${ip} # 2. 提取请求时间[]之间的内容 # 先删除 [ 之前的所有内容 time_bracket${log_line#*[} # 再删除 ] 之后的所有内容 time${time_bracket%%]*} echo 请求时间${time} # 3. 提取请求方法和路径引号之间的内容 request_part${log_line#*\} request${request_part%%\*} echo 请求内容${request} # 4. 提取HTTP状态码请求行后面的三个数字 # 先找到开始的第一次出现去掉它 after_request${log_line#*\} # 再去掉中间的 HTTP版本部分 status_part${after_request#*\ } # 取第一个字段状态码 status_code${status_part%% *} echo 状态码${status_code} # 5. 判断状态码类型 if [ ${#status_code} -eq 3 ]; then case ${status_code:0:1} in 2) echo → 请求成功 ;; 3) echo → 重定向 ;; 4) echo → 客户端错误 ;; 5) echo → 服务器错误 ;; esac fi # 6. 统计请求路径中包含home的请求次数实际使用时应循环处理所有行 path_part${request#* } path${path_part%% *} if [ ${path:0:5} /home ]; then echo → 这是首页请求 fi该练习展示了日志提取字段 字符串截取 长度判断 条件分支的组合使用。实际生产场景中只需把输入改为while read line; do ... done access.log循环即可。七、本篇小结环境变量 vs 局部变量局部变量只在当前Shell内可见export让变量传递给所有子进程永久生效写到~/.bashrc只读变量readonly定义不可修改的常量适用于配置文件路径、限制参数等字符串处理核心技巧操作语法示例长度${#var}echo ${#name}子串截取${var:pos:len}${str:0:5}开头删最短${var#pattern}${path#*/}开头删最长${var##pattern}${path##*/}结尾删最短${var%pattern}${path%.*}结尾删最长${var%%pattern}${path%%.*}替换首个${var/old/new}${url/http/https}替换所有${var//old/new}${text//a/A}默认值${var:-默认值}${user:-root}记忆口诀#从左删%从右删一个删最短两个删最长/替换//全换:-给默认:设默认。动手练习bash#!/bin/bash # 练习文件路径处理 # 给定文件路径 file/var/log/nginx/access.log echo 原始路径${file} # 1. 提取文件名 echo 文件名${file##*/} # 2. 提取目录路径 echo 目录${file%/*} # 3. 提取不带扩展名的文件名 basename${file##*/} echo 文件名无扩展名${basename%.*} # 4. 修改扩展名为 .bak echo 备份文件名${file%.log}.bak # 5. 练习字符串默认值 read -p 请输入你的名字直接回车使用默认值 name echo 你好${name:-访客}八、下篇预告掌握了字符串和变量脚本还缺少一项关键能力判断。没有判断的脚本只能顺序执行遇到不同情况无法做出不同反应。下一篇我们将进入条件判断的世界学习test命令与[ ]、[[ ]]的用法和区别文件测试是否存在、是否是目录、是否可写字符串比较与数字比较这是构建脚本逻辑能力的第一个台阶。学会条件判断你的脚本就拥有了“大脑”。延伸思考有些运维脚本里你会看到${var:default}这种写法。它和${var:-default}有什么区别提示前者不仅返回默认值还会把默认值赋给变量。试试看这是很多生产环境脚本用来自动初始化配置变量的技巧。

相关文章:

【Linux从入门到精通】第22篇:Shell变量与数据类型——数字与字符串处理

目录 一、引言:变量不只是“存个值” 二、环境变量 vs 局部变量:作用域的秘密 2.1 用实验理解差别 2.2 什么时候用哪种? 2.3 查看当前所有环境变量 2.4 持久化环境变量 三、只读变量与常量保护 3.1 readonly:让变量变成“常…...

为什么92%的AI PoC项目因容器隔离失效被叫停?Docker Sandbox 6步硬核配置手册(含GPU透传避坑指南)

更多请点击: https://intelliparadigm.com 第一章:Docker Sandbox 运行 AI 代码隔离技术配置总览 Docker Sandbox 是一种轻量级、可复现的容器化运行环境,专为安全执行第三方 AI 代码而设计。它通过命名空间(namespaces&#xff…...

头插法多线程不可用的原因

为什么头插法多线程下不可用?我们以HashMap扩容时用的头插法举例子: JDK 1.7 HashMap 扩容时的头插法迁移逻辑 // 旧数组 Entry[] oldTable table; // 新数组(容量翻倍) Entry[] newTable new Entry[oldCapacity * 2];// 遍历旧数组的每个桶…...

VS Code Copilot Next 配置实战手册(企业级自动化工作流搭建全流程)

更多请点击: https://intelliparadigm.com 第一章:VS Code Copilot Next 自动化工作流配置概览 VS Code Copilot Next 是微软与 GitHub 联合推出的下一代智能编程助手,它深度集成于 VS Code 编辑器中,支持上下文感知的代码生成、…...

视频孪生赋能智慧能源园区:黎阳之光打造全域数智化新标杆

在“双碳”战略与新型电力系统建设加速推进的背景下,能源园区正面临安全管控升级、能效提升压力、协同效率不足三大核心挑战。传统依赖人工巡检、分散系统、经验决策的管理模式,已难以适配现代化能源园区的发展需求。北京黎阳之光科技有限公司作为国内视…...

LLM应用开发模块化工具箱:从设计模式到实战构建智能体

1. 项目概述:一个面向LLM应用开发的模块化工具箱 如果你正在尝试构建基于大语言模型的应用,无论是想做一个能自动处理邮件的智能助手,还是一个能分析文档并生成报告的系统,你大概率会面临一个共同的起点:从零开始。这意…...

PyTorch Lightning深度学习工程化实战指南

1. 课程定位与核心价值 这个Python深度学习迷你课程的设计初衷,是帮助具备基础Python编程能力的学习者,在最短时间内掌握深度学习核心技术的工程化应用能力。不同于传统学院派教学,我们采用"问题驱动案例实战"的模式,重…...

【独家首发】MCP 2026医疗数据安全配置验证工具包(含自动化扫描脚本+等保测评报告生成器),仅限前200家三级医院申领

更多请点击: https://intelliparadigm.com 第一章:MCP 2026医疗数据安全配置标准体系概览 MCP 2026(Medical Configuration Protocol 2026)是由国际医疗信息技术联盟(IMITF)发布的全新医疗数据安全配置基准…...

OpenCV中SVM算法原理与图像分类实战

1. 支持向量机与OpenCV的深度整合支持向量机(SVM)作为机器学习领域的经典算法,在OpenCV计算机视觉库中有着成熟的实现。我在实际图像分类项目中多次采用这种组合方案,特别是在处理小样本、高维度数据时,SVM的决策边界优…...

R语言描述性统计:数据分析第一步与实战技巧

1. 为什么描述性统计是R语言数据分析的第一步每次拿到新数据集时,我做的第一件事就是运行描述性统计。这就像医生问诊时的基础检查,能快速发现数据的"体温"和"脉搏"。在R中,summary()函数是我的听诊器,30秒内…...

AI数据中心800VDC供电架构的技术突破与应用

1. AI工厂的电力革命:为什么800VDC成为下一代基础设施的核心在传统数据中心时代,电力系统设计往往被视为服务器机房的配套工程。但当我们进入生成式AI爆发的新纪元,这个认知被彻底颠覆。现代AI工厂的电力需求正在以惊人的速度增长——单个机架…...

副业焦虑的心理学分析与应对方法论

摘要副业焦虑已成为当代职场人群的普遍心理状态。本文从心理学视角分析副业焦虑的三大来源(社会比较焦虑、行动瘫痪焦虑、结果不确定性焦虑),提出"可控小确幸"理论框架,并设计一套基于自我决定论(SDT&#x…...

LangFlow:可视化低代码平台,快速构建LLM应用工作流

1. 项目概述:为什么我们需要LangFlow这样的AI应用构建工具?如果你最近在尝试将大型语言模型(LLM)集成到自己的业务或项目中,大概率会遇到一个共同的困境:想法很美好,落地很骨感。你构思了一个智…...

MatGPT:在MATLAB中无缝集成ChatGPT,打造AI增强的科学计算工作流

1. 项目概述如果你是一名MATLAB用户,同时又对ChatGPT这类大语言模型(LLM)的强大能力感到好奇,那么你很可能面临一个尴尬的局面:要么在两个工具之间反复切换,复制粘贴代码和问题;要么就得忍受在浏…...

【flowable 7.2.0 二开之三:基于 Flowable 7.2 的审批流系统解压即用】

flowable 7.2.0 二开之三:基于 Flowable 7.2 的审批流系统解压即用背景和痛点技术架构核心功能实现1. 流程设计器集成2. 表单设计器集成3. 条件分支实现4. 办理人动态分配5.字段级权限控制项目亮点开源版 vs 商业版如何获取背景和痛点 工作流引擎如 Flowable、Camu…...

MCP 2026适配不是选修课——为什么2026年Q2后所有新车型公告将自动驳回未通过MCP-TPMv2.1验证的申报?

更多请点击: https://intelliparadigm.com 第一章:MCP 2026强制适配政策的合规性底层逻辑 MCP(Model Compliance Protocol)2026 强制适配政策并非单纯的技术升级指令,而是基于可验证性、可审计性与跨域互操作性三重约…...

基于安卓平台的公交实时拥挤度查询系统

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一种基于安卓平台的公交实时拥挤度查询系统以解决城市公共交通领域存在的信息不对称与资源分配效率低下问题。随着城市化进程加速及移动互联…...

车载MCU资源告急!MCP 2026强制要求TSN+SecOC双栈部署,4步实现RTOS内存占用压缩32%

更多请点击: https://intelliparadigm.com 第一章:MCP 2026标准核心约束与车载MCU资源瓶颈分析 MCP 2026(Microcontroller Certification Profile 2026)是ISO/SAE联合工作组新近发布的车载微控制器功能安全与实时性认证基准&…...

redis中缓存穿透,及解决方案

Redis 缓存穿透是指客户端请求查询的数据,在 Redis 缓存和后端数据库中根本都不存在,导致每次请求都会绕过缓存,直接打到数据库上。如果遭遇高并发请求或恶意攻击,数据库会因为承受不住这种无效查询的压力而崩溃。🎯 缓…...

JeecgBoot企业级低代码平台:Spring Boot+Vue3架构解析与实战指南

1. 项目概述:一个企业级低代码开发平台的深度剖析最近几年,低代码开发平台的热度居高不下,几乎成了企业数字化转型的“标配”话题。但说实话,市面上很多号称“低代码”的产品,要么是功能简单的表单工具,要么…...

DeepXDE完整安装指南:5种方法快速配置科学机器学习环境

DeepXDE完整安装指南:5种方法快速配置科学机器学习环境 【免费下载链接】deepxde A library for scientific machine learning and physics-informed learning 项目地址: https://gitcode.com/gh_mirrors/de/deepxde DeepXDE是一款功能强大的开源科学机器学习…...

Claude Code技能精选指南:从信息过载到高效AI工作流构建

1. 项目概述:一份为Claude Code深度用户量身定制的技能精选指南如果你正在使用Claude Code,并且已经厌倦了在GitHub、skills.sh、LobeHub等各个平台间来回穿梭,只为寻找一个真正能提升工作效率的Skill,那么你找对地方了。这个名为…...

STM32F103 学习笔记-21-串口通信(第4节)—串口发送和接收代码讲解(下)

本章面向STM32零基础新手,基于STM32F103标准库开发,从USART串口单字节发送的核心原理出发,逐步扩展实现16位数据、数组、字符串发送功能,并讲解C标准库printf/scanf的重定向方法。你可以把USART串口理解为STM32的“有线电话”——…...

笔记软件换了一个又一个,Tolaria让知识库真正属于你

知识管理这件事,说起来容易,做起来却总让人觉得哪里不对劲。笔记软件换了一茬又一茬,从Evernote到Notion,从Obsidian到Logseq,每换一次就要折腾一次迁移,每换一次就要重新适应一套逻辑,到头来真…...

手把手教你搞定移远EC200U/EC25的Linux驱动:从硬件检查到串口映射的保姆级教程

手把手教你搞定移远EC200U/EC25的Linux驱动:从硬件检查到串口映射的保姆级教程 刚接触移远4G模块的开发者,往往会在Linux驱动适配环节遇到各种"坑"。本文将以EC200U和EC25为例,带你完整走通从硬件检查到功能稳定的全流程。不同于零…...

基于LangChain与Azure OpenAI构建智能问答云函数实战指南

1. 项目概述:构建一个基于LangChain与Azure OpenAI的智能问答函数最近在折腾一个有意思的东西:如何把一个简单的用户提问,通过云函数快速变成一个结构化的、有上下文的智能对话。这听起来像是需要一整套复杂的后端服务,但实际上&a…...

AI环境管理框架AEnvironment:解决多模型开发部署难题

1. 项目概述与核心价值最近在折腾一个挺有意思的项目,叫inclusionAI/AEnvironment。乍一看这个名字,可能有点抽象,但如果你正在做AI应用开发,特别是涉及到多模型、多环境、复杂依赖管理的场景,这个项目很可能就是你一直…...

AI Agent Harness Engineering 盈利模式设计:订阅制、按次付费与定制化服务

AI Agent Harness Engineering 盈利模式设计:订阅制、按次付费与定制化服务 关键词 AI Agent 工具链工程、Agent Harness 订阅制分层、Token 经济下按次计费优化、定制化 Agent 基础设施 ROI、Agent 生态协作分成、可观测性驱动的价值锚定、企业级 AI 安全合规附加模块 摘要…...

Akagi麻雀助手:终极指南 - 如何用AI提升你的雀魂麻将水平

Akagi麻雀助手:终极指南 - 如何用AI提升你的雀魂麻将水平 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將,能夠使用自定義的AI模型實時分析對局並給出建議,內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, Am…...

SpringBoot+Vue垃圾分类回收管理系统源码+论文

代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择: 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...