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

shell脚本基础

1.文本文件
  Shell 脚本是一个纯文本文件(如 .sh 扩展名),内容由可执行的命令序列组成。
示例:包含 ls -lecho "Hello" 等命令的文本文件。

2.可执行性

  需通过 chmod +x script.sh 赋予执行权限,由 Shell 解释器(如 Bash)逐行解析并执行命令。

3.内容组成

     命令:直接调用系统命令(如 cpgrep)。

    逻辑控制:通过 ifforwhile 等实现条件判断和循环。

     数据操作:使用变量(如 name="file.txt")、参数传递($1$2)和输入输出(readecho)。

 4.解释型语言特性

   无需编译,由 Shell 环境实时解析执行。   

   执行过程:逐行读取 → 解析 → 调用系统功能。 

   对比编译型语言(如 C):无二进制生成阶段,依赖运行时环境。

Shell 脚本的核心特征

特征说明
依赖 Shell 环境需在 Bash、Zsh 等 Shell 中运行,不同 Shell 可能有语法差异
直接操作系统接口可调用系统命令、管理进程、操作文件系统
轻量级自动化适合快速编写小型任务

Shell 脚本的核心意义

1.系统管理与运维的基石
   Shell 脚本是 Linux/UNIX 环境下实现 自动化运维 和 高效系统管理 的核心工具。它通过封装命令流程,解决重复性操作,显著提升管理效率。

2.深度集成系统生态

    Linux/UNIX 系统的 底层组件(如服务启动脚本 /etc/init.d/)和 基础服务(如 Cron 定时任务、日志轮转工具 logrotate)均依赖 Shell 脚本实现核心逻辑。 

    主流开源软件(如 Nginx、MySQL)的安装配置、状态监控等功能也通过 Shell 脚本提供支持。

3.运维工程师的核心能力

       脚本编写:需掌握变量、流程控制、函数等语法,编写自动化工具(如备份、监控、批量部署)。

       脚本解读:需能分析系统内置脚本(如 /etc/profile)及第三方软件附带的脚本(如 Let's Encrypt 的 certbot-auto),以便调试和定制。

长期复用的技术投资

    脚本具有 可移植性:一次编写的脚本可在同类系统(如 CentOS、Ubuntu)中重复使用。

    维护成本低:通过参数化设计(如 $1 接收外部参数),可适应动态需求变化,避免重复开发。

技术价值的底层逻辑

   直接调用系统接口
     Shell 脚本通过执行 原生命令(如 grepawkrsync)直接操作文件、进程和网络,无需依赖额外库或中间层。

1.脚本幻数

     作用:定义脚本执行所需的解释器路径,必须位于脚本首行。

     语法#!/bin/bash 或 #!/usr/bin/env bash

  技术意义

           内核通过 Shebang 确定使用何种解释器执行脚本。     

           若未指定,默认以当前 Shell 环境执行,可能导致兼容性问题。

2.程序主题

由三类核心内容组成

类别说明
命令直接调用系统可执行程序或自定义函数
逻辑控制结构条件分支if-elsecase
循环forwhileuntil
流程控制breakcontinue
数据操作变量name="value"PATH=$PATH:/new_dir
参数传递$1(位置参数)、$@(所有参数)
输入输出readecho>(重定向)
3.注释

  语法

    单行注释:以 # 开头,如 # 此脚本用于清理日志

 多行注释:通过 :<<EOF 实现(EOF可替换为任意标记)

Shell 脚本注释方法

1.单行注释

      语法:以 # 符号开头,注释到行尾。

      用途:解释单行代码意图或临时禁用某条命令。

[root@gu ~]# vim gu.sh
#!/bin/bash
#show some word
echo hello world
[root@gu ~]# sh gu.sh
hello world
多行注释

    方法:利用 : 命令与引号(兼容性较好)

: '
注释内容1
注释内容2
允许包含特殊符号(如 $、!)
'

注意:首行 : ' 与末行 ' 必须单独成行,且 ' 前后不可有空格

Shell 脚本编码规范

1. 文件命名规范

 规范要求:1.全小写 + 下划线分隔

                    2.体现核心功能

                   3.避免特殊字符

2.解释器声明规范

   强制要求:首行必须明确指定解释器

3. 注释规范
类型规范要求
元数据脚本头部声明功能、作者、版本
行注释使用英文注释
块注释复杂逻辑用多行注释

开头加版本特权等信息

# Date:创建日期
# Author:作者
# Mail:联系方式
# Function:功能
# Version:版本
4. 命令使用规范
原则推荐做法技术优势
优先内置命令使用 echotestread减少子进程创建,执行更快
避免冗余管道grep "error" log.txt比 `cat log.txt
合并命令[[ -f file ]] && rm file替代 if [ -f file ]; then rm file;
使用现代语法$((i++)) 替代 expr $i + 1提升可读性和性能
5. 代码结构规范

缩进:统一使用 4 空格(非 Tab)例:`bash

                                                               for i in 1 2 3

                                                               echo $i

                                                               done

Vim 自动化脚本头配置解析

1. 配置文件定位

      路径~/.vimrc(用户级 Vim 配置)

      生效范围:仅对当前用户生效,不影响系统全局配置

2. 核心配置分解
" ==== 基础编辑设定 ====
set ts=2     " Tab 宽度为 2 空格
set sw=2     " 自动缩进步长为 2 空格
set ai       " 开启自动缩进 (autoindent)
set et       " 将 Tab 转换为空格 (expandtab)" ==== 模板自动化 ====
" 快捷键映射:F4 插入模板
map <F4> ms:call SHELLTITLE()<cr>'s" 自动触发:新建 .sh 或 .script 文件时插入模板
autocmd BufNewFile *.sh,*.script call SHELLTITLE()" ==== 模板生成函数 ====
func SHELLTITLE()" 使用 heredoc 语法更高效插入多行let header = [\"###############################################",\"# Author:     lee",\"# Version:     ",\"# Date:       ".strftime("%Y/%m/%d"),\"# Mail:       lee@westos.org",\"# Function:     ",\"# ",\"################################################",\"",\"#!/bin/bash"\]call append(0, header)  " 在缓冲区第 0 行后插入
endfunc

技术优化点说明

1.模板插入效率提升
原始代码使用多个 call append() 逐行写入,改为 数组批量插入 减少 Vim 内部函数调用开销。

2.日期动态生成
strftime("%Y/%m/%d") 自动填充当前日期,支持格式定制如 "%Y-%m-%d %H:%M"

3.跨版本兼容性

autocmd 使用 BufNewFile 事件而非旧版 BufCreate

采用 map 而非 noremap 需注意模式作用域(建议明确为 noremap <F4> :call SHELLTITLE()<CR>

4.安全边界处理
添加 endfunc 后的空行,避免后续配置被误认为函数内容。

 脚本执行方式

脚本的执行方式直接影响其运行环境与进程树结构

一、在当前 Shell 环境执行

特征

   继承当前 Shell 变量和函数   

   直接修改当前 Shell 状态    

   常用于环境配置脚本

命令技术原理示例进程树分析
. gu.shsource 命令的同名简写
source gu.sh直接读取脚本内容并在当前 Shell 上下文逐行执行脚本中的 cat 成为当前 Shell 的子进程

二、在子 Shell 环境执行

特征

    创建独立进程空间    不污染当前 Shell 环境    默认执行方式,适合大多数脚本

sh gu.sh   强制使用 /bin/sh 解释器执行
权限要求
chmod +x gu.sh  # 必须赋予可执行权限才能直接运行
进程状态解读
状态码含义
S可中断睡眠
T暂停/跟踪状态
R运行/可运行状态

Shell 脚本调试

调试是定位和修复脚本逻辑错误的核心手段

1.调试的核心目标

定位错误类型

    语法错误:如缺少 done、引号未闭合(bash -n 可静态检查)   

    逻辑错误:如条件判断错误、循环失控   

    环境依赖错误:如路径缺失、权限不足

二、调试工具与参数
1. 逐行追踪模式 (-x)

输出特征
每行命令执行前会显示 + 前缀的命令内容

2.详细回显模式 (-v)

  与 -x 的差异
 -v 显示脚本原始代码行,-x 显示展开后的实际执行命令。

调试步骤

 启动逐行调试:bash -x gu.sh   

观察最后执行的命令为 + cat     

检查代码行确认应为 cal     

修复后验证

流程图解

graph TDA[脚本卡住无输出] --> B{启动-x调试}B --> C[定位到cat命令]C --> D[代码审查]D --> E[修正为cal]E --> F[验证输出]

命令退出状态码

退出状态码是进程间通信的核心机制之一,用于标识程序执行结果,严格遵循 UNIX 哲学中的 "沉默即成功" 原则。

一、退出码定义与标准
特性技术规范
数值范围0-255(8 位无符号整数)
成功标志返回 0(即使程序无输出)
错误码语义非零值由开发者定义
特殊状态码1: 通用错误
2: 命令行参数错误
127: 命令未找到
二、查看退出状态码
1. 查看方法
$ command    # 执行命令
$ echo $?    # 立即查看退出码(变量 `$?` 为瞬态值,仅保存最近一次结果)
三、脚本中的退出码控制
1. 隐式退出码

  默认返回最后一条命令的退出码

#!/bin/bash
date         # 若 date 执行成功,脚本返回 0

2.显式指定退出值

在脚本中使用 exit [n] 直接控制退出状态码

#!/bin/bash
# 正常流程
echo "执行任务..."
exit 0  # 明确返回成功# 异常处理
if [[ ! -d "/data" ]]; thenecho "错误:/data 目录不存在" >&2exit 1  # 自定义错误码
fi

http://www.xdnf.cn/news/9062.html

相关文章:

  • 记忆上传与自我同一性的哲学-技术综合分析
  • AI日报 - 2025年05月26日
  • 快速了解GO之Channel 通道
  • uv ——新的python包管理工具
  • 如何在 ONLYOFFICE 演示文稿中调整段落首行缩进
  • 第10章 网络与信息安全基础知识
  • 【分治】数组中的逆序对
  • 格恩朗管段超声波流量计:流量测量先锋
  • SD-WAN与传统网络结合:轨道交通网络优化的高效实践与深度解析
  • Day37打卡 @浙大疏锦行
  • 数据库入门:以商品订单系统为例
  • Nuxt.js vs Next.js:Vue 与 React 阵营的 SSR 双雄对比
  • python25-递归算法
  • 人工智能第一币AISPF,首发BitMart交易所
  • P5734 【深基6.例6】文字处理软件
  • Netty学习专栏(六):深度解析Netty核心参数——从参数配置到生产级优化
  • Lines of Thought in Large Language Models
  • (10)-java+ selenium->元素之By class name
  • window 显示驱动开发-Direct3D 呈现性能改进(一)
  • P1068 [NOIP 2009 普及组] 分数线划定
  • 机试 | STL | string | 文字处理软件
  • linux 进程间通信_共享内存
  • Python打卡第37天
  • 数据结构基础知识补充
  • leetcode刷题日记——求根节点到叶节点数字之和
  • Python数据分析基础(一)
  • vue3自定义指令来实现 v-lazyImg 功能
  • IP地址查询的重要性
  • 01 NLP的发展历程和挑战
  • 第2章 程序设计语言基础知识