Shell 脚本完整学习笔记
一、Shell 脚本概念脚本就是把多条 Linux 命令按执行顺序写入后缀为.sh的文件给文件赋予执行权限搭配if/while/for等控制语句实现复杂自动化操作。 通俗理解把手动一条条敲的命令写到文件一键自动执行。二、常见使用场景批量部署批量装软件、配置多台服务器、发布项目服务器监控监控 CPU、内存、磁盘、端口异常输出告警定时数据备份定时备份日志、数据库、业务文件自动化运维清理日志、批量启停服务、同步文件、统一权限三、脚本标准构成1. 解析器声明首行必须写#!/bin/bash/#!/bin/sh作用告诉操作系统用哪个解释器解析本脚本不加会默认使用当前终端 shell。2. 注释#单行注释执行脚本时忽略用来写功能、参数、注意事项。3. 执行指令脚本核心代码Linux 命令、变量、判断、循环、运算等。完整基础示例 test.shbash运行#!/bin/bash # 脚本名称test.sh # 功能基础演示脚本 # 作者运维 echo 我的第一个shell脚本 ls /root四、脚本 4 种执行方式 语法检测1. 添加执行权限bash运行chmod x test.sh # 赋予文件执行权限2. 四种执行方式方式 1sh/bash 直接调用新开子 shell 运行变量不影响当前终端bash运行sh test.sh bash test.sh方式 2相对 / 绝对路径执行./ 代表当前目录子 shell 运行bash运行# 相对路径 ./test.sh # 绝对路径 /root/test.sh方式 3. 脚本名当前 shell 执行变量会留在终端bash运行. test.sh方式 4source 脚本名和。完全等价当前 shell 执行bash运行source test.sh关键区分sh/bash/./ 执行开启子 shell脚本内变量执行完自动销毁不污染当前终端source /. 执行当前终端 shell运行脚本变量执行后仍保留在环境中3. 语法错误检测不运行脚本只检查语法bash运行sh -n test.sh # 无输出代表语法无错误报错则提示哪一行有问题五、管道符 |将前一条命令的输出交给后一条命令作为输入。 案例过滤系统中 nginx 进程bash运行ps -ef | grep nginx # ps -ef 输出所有进程管道把结果传给grep过滤nginx相关内容六、脚本输入输出1. 输出echo 打印内容到屏幕bash运行echo hello shell name张三 echo 名字是$name2. 输入read 接收用户手动输入存入变量案例交互式输入姓名bash运行#!/bin/bash echo 请输入你的姓名 read username # 等待用户输入内容存入username变量 echo 你输入的名字是$username简化写法一行提示 接收bash运行read -p 请输入年龄 age echo $age七、重定向1. 输出重定向覆盖输出清空文件原有内容写入新内容追加输出在文件末尾新增内容不覆盖 文件描述符1标准正确输出默认省略2标准错误输出代表所有输出正确 错误案例演示bash运行# 正确输出覆盖写入log.txt ls / log.txt # 错误输出单独存入err.log ls /不存在目录 2 err.log # 正确、错误全部写入all.log ls /不存在目录 all.log # 追加写入日志 echo 新增日志 log.txt2. 输入重定向把文件内容作为命令输入bash运行# 将test.txt内容交给cat读取 cat test.txt3. 多行分界符重定向here-doc分界符自定义EOF/fof 任意字符仅打印到屏幕bash运行cat fof 这是第一行 这是第二行 $USER fof覆盖写入文件bash运行cat info.txt fof 姓名张三 用户$USER fof追加写入文件bash运行cat info.txt fof 追加一行内容 fof分界符引号区别分界符不加引号识别$变量会解析变量值分界符加单引号fof所见即所得不解析变量原样输出符号 示例bash运行# 不识别变量直接打印$USER字符串 cat fof 当前用户$USER fof八、变量定义规则格式变量名值等号左右不能有空格错误name 李四正确name李四变量四大分类1. 自定义变量用户自己定义bash运行name运维 echo $name2. 系统内置变量操作系统自带bash运行echo $USER # 当前登录用户 echo $PATH # 系统环境路径 echo $HOSTNAME # 主机名3. 全局 / 局部变量全局脚本内全部代码可用局部函数内用local定义仅函数内部生效bash运行test(){ local num10 # 局部变量函数外无法调用 echo $num } test4. 位置变量执行脚本时传参执行脚本格式./test.sh 参数1 参数2 参数3$1第一个参数$2第二个依次类推 案例 test.shbash运行#!/bin/bash echo 第一个参数$1 echo 第二个参数$2执行./test.sh 苹果 香蕉输出 第一个参数苹果 第二个参数香蕉5. 预定义特殊变量固定含义表格变量作用$0当前脚本完整名称 / 路径$#传入参数总个数$*所有参数整体视为一串字符串$所有参数独立分开循环推荐使用$$当前脚本运行的进程 PID 号案例bash运行#!/bin/bash echo 脚本名$0 echo 参数总数$# echo 所有参数$* echo 进程号$$执行./test.sh a b c引号区别取值时单引号 强引用所见即所得不解析变量、特殊符号bash运行name小明 echo $name # 输出 $name双引号 弱引用识别$变量保留空格bash运行echo $name # 输出 小明不加引号识别变量空格会分割内容不推荐带空格字符串使用九、Shell 算术计算整合两张截图实操案例 报错解析基础说明Shell 原生仅支持整数运算小数浮点运算必须使用bc工具算术运算符加、-减、*乘、/整除、%取模取余数截图统一预设变量bash运行a40 b3方式 1expr 计算截图实操 报错重点核心规则运算符左右必须加空格无空格不会计算直接原样输出字符串乘号*是 shell 通配符直接使用会报语法错误必须加反斜杠转义\*bash运行# 1.加法空格正确正常计算 expr $a $b # 输出43 # 2.无空格不会运算直接输出字符串 expr $a$b # 输出403 # 3.减法 expr $a - $b # 输出37 # 4.直接写* 报错截图报错expr: 语法错误未预期的参数 1.log expr $a * $b # 5.乘号转义 \* 正确写法 expr $a \* $b # 输出120 # 6.除法整除舍弃小数 expr $a / $b # 输出13 # 7.取模求余数 expr $a % $b # a40时输出1修改a41后执行输出2 expr $a % $b方式 2let 计算直接赋值给变量bash运行# 定义变量接收计算结果 let sum$a$b # 打印结果 echo $sum # a41b3时输出 44方式 3$(()) 双括号运算最推荐简洁无转义两种用法直接输出 / 赋值给变量bash运行# 用法1直接echo打印运算结果 echo $(($a$b)) # 输出44 # 用法2把计算结果存入自定义变量ccc ccc$(($a$b)) # 打印变量 echo $ccc # 输出44方式 4bc 浮点小数运算补充截图未演示bash运行a10 b3 # -l 参数加载数学库保留小数 echo $a / $b | bc -l # 输出 3.3333333333四种计算方式对比总结表格方式优点缺点适用场景expr兼容所有 shell运算符必须空格、乘法要转义老旧脚本、简单运算let可直接赋值变量只能整数语法兼容性一般脚本内变量运算$(( ))语法最简、无需转义、支持复杂四则仅整数日常脚本首选bc支持小数、高精度计算写法繁琐浮点、财务计算