Shell 编程基础入门|曼巴精神打磨运维自动化基本功 文章目录一、为什么要学 Shell 编程先搞懂 Shell 是啥Shell 脚本是啥为什么必须学学好的前提二、第一个 Shell 脚本脚本规范开头注释脚本的 5 种执行方式开发规范与好习惯三、Shell 变量基础知识变量是啥变量两大类1. 环境变量全局变量2. 普通变量局部变量三种赋值方式区别巨大命令结果赋值四、变量进阶知识特殊变量生产天天用位置参数变量状态变量常用内置命令echoreadshift变量子串操作特殊扩展变量五、数值计算(()) 双小括号首选letexprbc支持小数awk小数运算神器六、条件测试脚本的大脑四种写法文件判断最常用字符串判断整数比较逻辑运算[[]] 正则匹配写在最后ManWhat can I say孩子们运维干到最后拼的就是自动化。重复的活天天做累死人还容易错Shell 脚本就是解放双手的第一把神器。批量检查服务器、自动部署服务、日志分析、定时巡检啥都能干是每个 Linux 运维的立身基本功。今天把 Shell 编程从入门到上手的核心知识点全撸一遍从第一个脚本到变量、运算、条件判断全是生产常用干货打开终端跟着敲拒绝眼会手废点赞收藏反复练一、为什么要学 Shell 编程先搞懂 Shell 是啥Shell 就是个命令解释器包在操作系统内核外面你敲命令它解释给内核执行结果再返回给你。咱们登录 Linux 之后所有的操作全是 Shell 在解释执行。Linux 默认的 Shell 是 bashBourne Again ShellSolaris/BSD 默认 shAIX 默认 ksh咱们重点讲 bashShell 脚本是啥把一堆命令、逻辑控制写进一个文件里一次性顺序执行就是 Shell 脚本非交互模式运行类似 Windows 的 bat 批处理。不用一条条敲命令写好脚本跑一次全搞定批量操作、自动化全靠它。为什么必须学Linux 里几乎所有东西都是纯文本配置文件、日志文件、启动脚本、服务配置。Shell 天生就是处理文本的学好 Shell就能把重复工作全自动化大幅提升效率。合格的 Linux 运维必须能熟练写 Shell 脚本也能看懂系统自带的各种脚本。学好的前提vim 玩得溜会配置 vimrc写代码效率翻倍Linux 常用命令熟练基础打牢正则表达式 三剑客grep、sed、awk掌握熟悉常见网络服务的部署、日志、排错曼巴忠告学好 Shell 的核心就是多练、多思考、多总结。从简单判断、简单循环开始多模仿多动手别上来就搞复杂脚本变量命名要规范别拿来主义慢慢形成自己的代码风格。二、第一个 Shell 脚本脚本规范开头脚本第一行必须写幻数指定用什么解释器执行#!/bin/bash#!就是幻数标记内核根据它后面的路径找解释器。CentOS 默认 Shell 是 bash不写也能用但规范写法必须加换环境就不会出问题。注释#后面的内容全是注释解释器不执行只给人看。可以单独一行也可以跟在命令后面写注释是职业素养方便别人看也方便自己过段时间回头看尽量用英文注释避免不同环境中文乱码脚本的 5 种执行方式bash script.sh最稳妥不需要脚本有执行权限也不用写幻数生产最推荐避免忘加 x 权限的经典坑./script.sh需要先加执行权限chmod x script.sh相对路径绝对路径都行source script.sh或. script.sh在当前 Shell 进程执行不启动新进程脚本里的变量、函数能直接在当前终端用这是和其他方式最大的区别bash script.sh输入重定向执行脚本放 PATH 环境变量的目录里直接输文件名就能执行开发规范与好习惯第一行必须写#!/bin/bash开头加版本、作者、功能描述、日期脚本名统一.sh结尾存固定目录成对的符号一次性写完再填内容防止漏括号流程控制语句一次性写完结构再填内容代码缩进对齐易读性拉满字符串赋值加双引号等号两边绝对不能有空格所有符号都是英文半角别敲成中文符号三、Shell 变量基础知识变量是啥变量就是内存里存数据的盒子用一个名字代表一段内容。名字只能是字母、数字、下划线不能以数字开头。Bash 是弱类型语言默认不分类型都当字符串处理。变量两大类1. 环境变量全局变量一般全大写用export导出当前 Shell 和所有子进程都能用永久生效用户级写~/.bashrc全局级写/etc/bashrc常用环境变量HOME、PATH、USER、PWD、LANG、HISTSIZE查看env看所有环境变量set看所有变量unset 变量名删除变量2. 普通变量局部变量只在当前 Shell / 脚本里有效出了这个环境就没了。三种赋值方式区别巨大# 不加引号简单连续字符串用里面有变量会被解析 a192.168.1.2-$b # 单引号所见即所得里面啥都原样输出变量不解析 b192.168.1.2-$a # 双引号最常用里面的变量会解析后再赋值 c192.168.1.2-$a曼巴忠告想原样输出用单引号想解析变量用双引号别搞混了命令结果赋值把命令执行的结果存进变量两种写法# 推荐写法$() 括起来清晰不容易混 now$(date %F) # 反引号写法不推荐容易和单引号搞混 nowdate %F经典坑变量名后面紧跟其他字符的时候必须用大括号把变量名括起来比如${name}abc不然 Shell 会把nameabc当成变量名直接空值新手 90% 都踩过四、变量进阶知识特殊变量生产天天用位置参数变量脚本接收外部传参全靠它$0当前脚本的文件名$1~$9第 1 到第 9 个参数第 10 个及以上写${10}$#传进来的参数总数$所有参数每个都是独立字符串传参首选$*所有参数当成一整个字符串状态变量$?上一条命令的执行返回值0 成功非 0 失败最最常用判断命令成没成、条件判断全靠它$$当前 Shell 进程的 PID$!上一个后台运行进程的 PID$_上一条命令的最后一个参数常用内置命令echo输出内容常用参数-n输出不换行-e解析转义字符\n换行、\t制表符read从标准输入读取内容赋值给变量交互脚本用read -p 请输入密码 passwd # -p 提示信息 read -s -p 请输入密码 passwd # -s 不显示输入输密码用shift位置参数整体左移一位$2 变1 11# 减 1处理大量参数的时候用。变量子串操作直接操作变量内容不用调用外部命令效率极高表格语法作用${#str}返回字符串长度最快的求长度方法${str:offset}从 offset 位置开始截取到结尾${str:offset:length}从 offset 开始截取 length 个字符${str#word}从开头删除最短匹配的 word${str##word}从开头删除最长匹配的 word${str%word}从结尾删除最短匹配的 word${str%%word}从结尾删除最长匹配的 word${str/old/new}替换第一个匹配的 old 为 new${str//old/new}替换所有匹配的 old 为 new生产场景常用批量改文件名、取路径后缀、提取目录名不用 sed 不用 awk原生就搞定。特殊扩展变量专门处理变量为空的场景防止脚本报错表格语法作用${var:-default}var 为空 / 未定义返回 defaultvar 本身不变${var:default}var 为空 / 未定义设为 default 并返回var 本身也变${var:?errmsg}var 为空 / 未定义输出 errmsg 并报错退出${var:word}var 有值就返回 word没值啥也不返回曼巴忠告生产写脚本路径、参数这类变量一定要加默认值比如find ${path:-/tmp} -name *.log防止变量没定义的时候直接从根目录开始删血的教训五、数值计算Shell 做算术运算常用的就这几个工具各有适用场景。(()) 双小括号首选整数运算最高效最常用推荐优先用echo $((11)) # 输出运算结果 ((a5*2)) # 运算后赋值给a echo $((a)) # 先返回a的值再加1 echo $((a)) # 先加1再返回值支持加减乘除、取余、幂运算也支持比较、逻辑运算成立返回 1不成立返回 0。let和 (()) 功能差不多写法不同let ii8expr老工具运算符两边必须有空格乘号要转义\*还能做字符串匹配、算长度现在用得少。expr 2 3 expr 2 \* 3bc支持小数Linux 自带计算器支持小数运算echo scale2; 10/3 | bc # scale保留2位小数awk小数运算神器小数计算用 awk 很方便精度高echo 7.7 3.8 | awk {print $1-$2}六、条件测试脚本的大脑条件判断就是让脚本有逻辑四种写法各有适用场景。四种写法test 表达式最原始[ 表达式 ]最常用推荐和 test 等价[[ 表达式 ]]扩展写法支持正则匹配(( 表达式 ))纯数值比较用注意[]和[[]]里面两端必须有空格没空格直接语法错经典中的经典坑文件判断最常用运维天天和文件目录打交道这些参数记死表格参数作用-d存在且是目录为真-f存在且是普通文件为真-e只要存在就为真不管是文件还是目录-r存在且可读为真-w存在且可写为真-x存在且可执行为真-s存在且大小不为 0 为真-ntfile1 比 file2 新为真-otfile1 比 file2 旧为真示例[ -f /etc/passwd ] echo 存在 || echo 不存在字符串判断表格参数作用-z字符串为空为真-n字符串非空为真/两个字符串相等为真!两个字符串不等为真曼巴忠告字符串比较一定要把变量加双引号不然变量为空的时候直接变成[ abc ]语法直接错新手必踩坑整数比较表格[] 里写法(()) 里写法含义-eq等于-ne!不等于-gt大于-ge大于等于-lt小于-le小于等于逻辑运算表格[] 里写法[[]]/(()) 里写法含义-a逻辑与两边都真才为真-o||逻辑或一边真就为真!!逻辑非取反和||短路超好用条件 成立执行 || 不成立执行简单判断不用写 if一行搞定。[[]] 正则匹配双中括号支持~正则匹配判断字符串是否符合模式[[ $str ~ ^[0-9]$ ]] echo 是数字 || echo 不是数字写在最后ManWhat can I say变量、运算、条件判断这三块是 Shell 编程的地基。基础打牢了后面循环、函数、批量自动化脚本都是手到擒来。一定要终端亲手敲写第一个脚本、传参测试、变量子串操作、数值运算、各类条件判断每个坑都踩一遍比背十页笔记都管用。万丈高楼平地起Shell 基本功打牢了后面自动化运维、批量管理、监控告警直接快人一步。后续持续更新 Shell 进阶实战干货欢迎点赞收藏关注一起持续打怪升级Mamba out