Linux Shell 脚本编程极简入门指南
一、学习前提准备
✅ 环境要求:
-
Linux系统(Ubuntu/CentOS等)或 WSL (Windows用户)
-
任意文本编辑器(推荐VSCode/Vim)
-
基础命令行操作能力
🔍 验证环境:
# 查看系统默认Shell
echo $SHELL
# 查看Bash版本
bash --version
二、Shell脚本基础认知
2.1 什么是Shell脚本?
-
解释型语言:通过
/bin/bash
逐行解析执行 -
核心价值:
-
自动化重复性系统操作(80%运维工作可脚本化)
-
快速实现任务调度(结合cron)
-
提升操作可重复性和精确度
-
2.2 脚本文件标准结构
#!/bin/bash # Shebang声明(必须第1行)
# 文件:demo.sh # 脚本描述
# 作者:CSDN用户 # 维护信息
echo "欢迎学习Shell编程" # 可执行语句
三、首个Shell脚本实战
3.1 创建并运行脚本
# 创建脚本文件(建议.sh后缀)
touch hello_world.sh
chmod +x hello_world.sh # 添加执行权限
3.2 编辑器输入以下代码
#!/bin/bash
# 第一个Shell程序
echo "当前用户:$(whoami)"
echo "系统时间:$(date +%F)"
3.3 三种执行方式对比
执行方式 | 命令示例 | 适用场景 |
---|---|---|
路径直接执行 | ./hello_world.sh | 已添加执行权限时 |
指定解释器执行 | bash hello_world.sh | 调试快速执行 |
source命令执行 | source hello_world.sh | 需保留环境变量时 |
四、核心编程语法精要
4.1 变量操作
company="CSDN社区" # 定义变量(等号无空格)
readonly version="1.0" # 只读变量(不可修改)
today=$(date +%Y-%m-%d) # 命令执行结果赋值
echo "${company} ${today}" # 建议变量用花括号包裹
4.2 条件分支结构
if [ -f "/etc/passwd" ]; then # 判断文件存在echo "系统密码文件存在"
elif [ -d "/tmp" ]; then # 判断目录存在echo "/tmp目录存在"
elseecho "条件未满足"
fi
4.3 循环结构
for循环处理文件列表:
for file in *.log; doecho "正在处理日志文件:${file}"
done
while按行读取文件:
while read line; doecho "当前行:$line"
done < input.txt
4.4 函数定义与调用
# 带返回值函数
file_exists() {[ -f "$1" ] && return 0 || return 1
}
# 调用函数
file_exists /etc/hosts
if [ $? -eq 0 ]; then # $?获取上一条命令返回值echo "文件存在"
fi
五、实用功能模块速查
5.1 参数传递处理
特殊变量 | 含义 | 示例 |
---|---|---|
$0 | 脚本名称 | echo "脚本:$0" |
$1 -$9 | 第1-9个位置参数 | echo "第1参数:$1" |
$# | 参数总个数 | if [ $# -gt 0 ] |
$@ | 所有参数列表 | for param in $@ |
5.2 退出状态码
check_service() {systemctl is-active nginx >/dev/nullreturn $? # 返回上条命令的退出状态
}
check_service
case $? in0) echo "服务运行中";;*) echo "服务异常,状态码:$?";;
esac
5.3 管道与重定向
# 管道组合命令
cat access.log | grep "404" | awk '{print $7}'
# 输出重定向
ls -l > file_list.txt # 覆盖写入
echo "新增内容" >> log.txt # 追加写入
# 错误输出处理
apt update 2> /dev/null # 丢弃错误输出
六、自动化实战:系统备份脚本
6.1 需求说明
-
每日凌晨压缩备份
/data
目录 -
自动删除30天前的备份文件
-
记录操作日志
6.2 完整代码实现
#!/bin/bash
# 自动化备份脚本
# 配置参数
backup_dir="/data"
dest_path="/backup"
keep_days=30
log_file="/var/log/backup.log"
# 目录检查
[ ! -d "$dest_path" ] && mkdir -p "$dest_path"
[ ! -f "$log_file" ] && touch "$log_file"
# 生成压缩包
timestamp=$(date +%Y%m%d%H%M)
tar -czf "${dest_path}/backup_${timestamp}.tar.gz" "$backup_dir" 2>&1 | tee -a "$log_file"
# 清理旧备份
find "$dest_path" -name "*.tar.gz" -mtime +$keep_days -delete 2>&1 | tee -a "$log_file"
# 日志记录
echo "[$(date)] 备份完成,保留最近${keep_days}天文件" | tee -a "$log_file"
6.3 部署到cron计划任务
# 每日凌晨2点执行
crontab -e
# 添加如下行
0 2 * * * /opt/scripts/backup.sh
七、高阶调试技巧
7.1 执行过程追踪
bash -x script.sh # 显示每条执行命令
7.2 代码段调试
set -x # 开启调试模式
# 需要调试的代码
set +x # 关闭调试模式
7.3 错误自动退出
#!/bin/bash
set -e # 任何语句返回值非0则立即退出
set -o pipefail # 管道命令出错时也退出
八、学习路线与资源推荐
🔥 技能提升路线:
-
掌握正则表达式(grep/sed)
-
学习awk高级文本处理
-
理解Linux信号处理(trap)
-
研究Ansible等自动化工具
📚 推荐资料:
-
书籍:《Linux命令行与Shell脚本编程大全》
-
工具:ShellCheck在线检测
相关文章:
Linux Shell 脚本编程极简入门指南
一、学习前提准备 ✅ 环境要求: Linux系统(Ubuntu/CentOS等)或 WSL (Windows用户) 任意文本编辑器(推荐VSCode/Vim) 基础命令行操作能力 🔍 验证环境: # 查看系统默认Shell echo $SHELL #…...

【医院管理会计专题】7.解锁本量利分析:医院医疗服务决策的智慧密码
医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今医疗行业竞争日益激烈的背景下,医院管理面临着诸多挑战,如何实现高效运营、提升服务质量并控制成本成为关键问题。管理会计作为一种重要的管理工具,在医院管理中发挥着越来越重要的作用。本…...
Kotlin和Java区别
哈哈哈,前段时间,面试的时候,突然问到我Kotlin和Java的区别,一下子把我问懵逼了,确实没遇到问这个的,想了下,说了下Kotlin的编译时空检查机制,代码更简洁,很多封装好的AP…...
Taro 面试题
基础概念 1. Taro 是什么?它的核心特点有哪些? Taro 是京东开源的 多端统一开发框架,基于 React 语法,可编译到 微信小程序、H5、React Native 等多个端。 核心特点: 多端适配:一套代码运行多个端支持 …...
Java部署在window启动报unable tocreate tempdir
在Windows系统中,Java应用在运行时会试图在默认的临时目录中创建文件。该临时目录通常由系统环境变量TEMP或TMP指定。如果这些变量设置不正确、指向一个无效的路径,或者操作系统的权限不足,就会导致“Unable to create tempdir”错误。 解决…...

基于deepseek和开放题库,构建专业大模型微调在线答题系统
为什么要进行大模型微调 大模型微调是将预训练模型适配到特定任务或领域的关键技术,正常情况下大模型通过海量通用数据训练获得广泛知识,但其参数和表征空间面向通用场景,难以直接适配垂直领域或复杂任务。例如在通用医疗问答模型在具体病症诊…...

ios 小组件和数据共享
创建主工程就不必讲了 1 创建小组件 创建子工程 [new Target ] 选择 [ Widger Extension] 小组件入口是WidgetBundle文件,可以进行多个小组件的调试 TestWidget2文件是主要操作,小组件使用swiftUI布局,使用 AppIntent进行事件处理ÿ…...
LVTTL(Low Voltage Transistor-Transistor Logic)电平详解
一、LVTTL电平的定义与核心特性 LVTTL(低压晶体管-晶体管逻辑)是传统TTL(5V)的低电压版本,工作电压通常为3.3V,旨在降低功耗并适配现代低电压集成电路,同时保持与TTL的逻辑兼容性。其核心特点如…...

element tree树形结构默认展开全部
背景: el-tree树形结构,默认展开全部,使用属性default-expand-all【是否默认展开所有节点】;默认展开一级,设置default-expanded-keys【默认展开的节点的 key 的数组】属性值为数组。 因为我这里的数据第一级是四川【省…...

统计登录系统10秒内连续登录失败超过3次的用户
为防止暴力破解用户账号的行为,在输入账号和密码时一般都会限制用户尝试密码输出错误的次数,如果用户多次输错密码后,将在一段时间内锁定账号,常见的有银行类APP、个税App等应用,如下是用户账号密码输入错误的提示图&a…...
音视频软件工程师面试题
一、基础知识 编解码相关 H.264 和 H.265(HEVC)的主要区别是什么?视频编解码的基本流程是什么?关键技术有哪些?音频编解码(如 AAC、MP3、Opus)的区别和应用场景?什么是 B 帧、P 帧、I 帧?它们的作用是什么? 流媒体协议RTMP、HTTP-FLV、HLS、WebRTC 的区别和应用场景…...

架构师面试(十四):注册中心设计
问题 大家或多或少都接触过【注册中心】,对注册中心的基本功能,如:服务注册、服务发现、健康检查和变更通知 ,肯定是耳熟能详的;那么大家对注册中心的架构设计是否了解呢? 如果让你负责设计一个分布式的注…...
ctf-web: php原生类利用 -- GHCTF Popppppp
源代码 <?php error_reporting(0); class CherryBlossom { public $fruit1; public $fruit2; public function __construct($a) {$this->fruit1 $a; } function __destruct() { echo $this->fruit1; } public function __toString() { $newFunc …...

「Unity3D」UGUI将元素固定在,距离屏幕边缘的某个比例,以及保持元素自身比例
在不同分辨率的屏幕下,UI元素按照自身像素大小,会发生位置与比例的变化,本文仅利用锚点(Anchors)使用,来实现UI元素,固定在某个比例距离的屏幕边缘。 首先,将元素的锚点设置为中心&…...

nextjs15简要介绍以及配置eslint和prettier
目录 一、Next.js 何时使用服务器端渲染(SSR)?何时使用静态生成(SSG)? 1、服务器端渲染(SSR - getServerSideProps) 2、 静态生成(SSG - getStaticProps) …...

存储过程和自定义函数在银行信贷业务中的应用(oracle)
数据校验和清洗 例如,检查客户的年龄是否在合理范围内,贷款金额是否符合规定的上下限等。 对于不符合规则的数据,可以进行清洗和修正。比如,将空值替换为默认值,或者对错误的数据进行纠正。 CREATE OR REPLACE PROC…...

基于Ollama平台部署的Qwen大模型实现聊天机器人
文章目录 基于Ollama平台部署的Qwen大模型实现聊天机器人1 概述2 技术栈2.1 开发技术2.2 环境 3 技术架构4 实现步骤4.1 环境搭建4.1.1 WSL配置及Ubuntu安装4.1.2 Ollama安装及模型部署 4.2 模块安装4.2.1 安装Streamlit 1.42.24.2.2 安装requests 2.32.34.2.3 安装ollama 0.4.…...
在 JDK 1.8 的 ConcurrentHashMap 中,为什么存在两种插入方式?
在 JDK 1.8 的 ConcurrentHashMap 中,之所以对“容器为空”和“计算位置为空”采取不同的处理方式,主要是因为 并发场景下的性能优化和并发安全保证。我们可以分开来看这两种情况: 1. 容器为空时,使用 volatile CAS 初始化 原因…...

如何让powershell的界面变成全屏显示?
刚打开powershell,原来的样子: 全屏:可以按一下键盘上的alt enter 键,效果:...
语音识别踩坑记录
本来想在原来的语音识别的基础上增加本地扩展本地词典, 采用的语音识别是Vosk识别器,模型是 vosk-model-small-cn-0.22 // 初始化Vosk识别器 if (recognizer null) {using (Model model new Model(modelPath)){string grammar "{""…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...