)
文章目录前言一、Shell介绍1.1 Shell简介1.2 Shell三大功能1.3 常见Shell类型1.4 Shell解释器二、Shell脚本编写与执行2.1 Shell脚本的基本构成2.2 编写 Shell 脚本2.4 创建脚本四步流程2.3 执行 Shell 脚本三、Shell 程序变量3.1 语法格式3.2 变量使用3.3 echo命令高级用法四、特殊变量赋值4.1 双引号和单引号4.2 反撇号与命令替换4.2.1 反撇号4.2.2 $()4.3 read交互式输入命令五、变量运算5.1 expr5.2 $[ ] 和 $(())5.3 let命令——直接修改变量5.4 bc计算器——浮点运算5.4.1 expr只能计算整数而bc可以计算小数基本用法5.4.2 bc逻辑运算返回0或1六、变量类型与作用范围6.1 自定义变量与环境变量6.2 只读变量6.3 位置变量6.4 预定义变量6.5 export命令七、重定向与管道7.1 标准输入输出与错误输出7.2 输出重定向7.3 输入重定向7.4 管道操作7.5 案例7.5.1 案例一自动化备份7.5.2 案例二服务器健康检查总结前言Shell 是 Linux/Unix 系统的命令行解释器也是运维工程师最核心的自动化工具。Shell 脚本本质是一个按顺序存放 Linux 命令的文本文件加上变量、条件判断、循环和函数就成了一门完整的编程语言特别适合系统管理、软件部署、日志分析和定时任务等场景。相比其他编程语言Shell 在调用系统命令、管理进程和处理文本方面有天然优势。一、Shell介绍1.1 Shell简介Shell 是 一个用 C 语言编写的程序是Linux系统中的一个命令行解释器它是用户与操作系统内核之间的桥梁。简单说就是你输入命令Shell 负责理解并告诉内核去执行。1.2 Shell三大功能命令翻译把命令翻译成内核能懂的指令输入输出管理管理数据从哪来到哪去编程能力把命令写成脚本自动执行1.3 常见Shell类型1/bin/bash默认ShellCentOS/RHEL都用它2/bin/sh bash的祖先已软链接到bash3/bin/tcshC Shell增强版1.4 Shell解释器Linux 系统中存在多种 Shell 解释器用户可通过以下命令查看系统中已安装的 Shellcat/etc/shells#查看系统支持的所有Shellecho$SHELL#查看当前使用的Shell二、Shell脚本编写与执行2.1 Shell脚本的基本构成部分说明示例脚本声明告诉系统用什么解释器#!/bin/bash注释代码说明不被执行# 这是注释命令实际执行的语句echo “hello”2.2 编写 Shell 脚本使用文本编辑器如 vi创建一个新文件扩展名通常为 .sh#!/bin/bashechoHello World#!是一个约定标记指定脚本使用的解释器路径。echo用于向窗口输出文本。2.4 创建脚本四步流程创建文件 vim f01.sh添加权限 chmod x f01.sh检查语法 bash -n f01.sh执行脚本./f01.sh2.3 执行 Shell 脚本执行脚本前需赋予执行权限chmodx ./f01.sh执行方式有四种最常用的是前两种sh f01.sh作为解释器参数执行./f01.sh当前目录下执行source f01.shsource执行sh f01.sh重定向执行source和bash区别1bash 会创建子进程执行脚本里的 cd、export、变量赋值等操作只对子 Shell 生效。脚本执行完毕子 Shell 销毁当前终端环境完全不变。2source不会创建子 Shell直接在当前的 Shell 中逐行执行不会创建子 Shell直接在当前的 Shell 中逐行执行。脚本里的 cd、export、变量赋值等操作会直接影响当前终端。三、Shell 程序变量3.1 语法格式变量定义格式变量名值等号两侧不能有空格命名规则1只能包含字母、数字、下划线2不能以数字开头3区分大小写3.2 变量使用利用$变量名或${变量名}使用变量。#!/bin/bashname小明age18echo$nameecho$ageechomy name is$name,age is${age}#变量后面紧跟着其他字符比如字母、数字、下划线时就必须用花括号{}把变量名括起来告诉 Shell 哪部分是变量名哪部分是普通文本。3.3 echo命令高级用法选项含义选项作用示例-n不换行echo -n “请输入”-e识别转义符echo -e “a\nd”常用转义字符最常用是\n、\t字符含义\n换行\t制表符\c不换行\b退格\ \输出\本身\$输出$本身四、特殊变量赋值4.1 双引号和单引号双引号识别变量单引号不识别变量注需要变量值时用双引号需要原样输出时用单引号4.2 反撇号与命令替换作用把命令输出存到变量里4.2.1 反撇号timedate%Techo$time4.2.2 $()$()更容易嵌套echo今天日期$(date%Y年%m月%d日)4.3 read交互式输入命令常用选项-p显示提示-n限制字符数-s静默输入输入密码-t超时秒数#!/bin/bashread-p请输入名字nameecho你好$nameread-n11-p请输入手机号:phoneechoecho$phoneread-s-p请输入密码:pwdecho$pwd五、变量运算5.1 exprexpr 是一款表达式计算工具它能完成表达式的求值操作。expr11#运算符两边必须有空格expr2\*3#乘法需要转义expr10%3#取余a5b3expr$a$b#expr也支持变量运算sumexpr$a $b#用反撇号把结果存为变量echo$sumsum$(expr$a $b)#用$()把结果存为变量echo$sum5.2 $[ ] 和 $(())echo$[2*3]#用$[]不需要把乘法转义echo$((2*3))#用$(())不需要把乘法转义a9b6echo$[a b]echo$((a-b))echo$[a * b]echo$[a / b]三种方式对比方式乘法转义变量$expr需要需要$[]不需要可省略$(())不需要可省略5.3 let命令——直接修改变量let会修改变量本身num5letnumnum4#此时num变为9echo$num#输出num为9num5letnum5#此时num变为10echo$num#输出num为10letnum-4#此时num为10-46echo$num#输出num为6letnum*2#此时num为6*212echo$num#此时num为12let自增自减num15letnum#此时num为16echo$num#输出为16letnum--#此时num为16-115echo$num#输出为15let幂运算特有num2letnumnum**10#2的10次方num变为1024echo$num#输出为10245.4 bc计算器——浮点运算5.4.1expr只能计算整数而bc可以计算小数基本用法echoscale2; 10/3|bc#scale2 表示保留2位小数,输出为3.33echo4^2|bc#表示4的2次方输出为16echosqrt(16)|bc#表示为16开根号输出为4r5echo3.14159 *$r*$r|bc#表示为3.14159*5*5输出为78.53975scale只对除法有效5.4.2bc逻辑运算返回0或1echo35|bc#输出为0假echo35|bc#输出为1真echo10 10|bc#输出为1真六、变量类型与作用范围6.1 自定义变量与环境变量自定义变量用户自己定义的变量环境变量系统预定义的常见环境变量变量含义echo $USER当前用户名echo $HOME用户主目录echo $PWD当前工作目录echo $SHELL默认Shellecho $LANG系统语言echo $RANDOM随机数0-32767echo $UID用户IDecho$PATH#命令搜索路径查看PATH注PATH“” 会让所有命令失效6.2 只读变量readonlyPI3.1415926#设置只读变量PI3.14#结果报错只读变量不能改变unsetPI#只读变量无法删除6.3 位置变量#!/bin/bashecho脚本名称$0echo第一个参数$1echo第二个参数$2echo第三个参数$3echo参数总数$#echo所有参数(\$*)$*echo所有参数(\$)$ls/etc/dev/nullechols /etc 的返回值$?# 返回值为0则上一条命令正确返回值大于0则上一条命令错误ls/abc/dev/null21echols /abc 的返回值$?echo当前Shell进程PID$$sleep100echo后台进程PID$!6.4 预定义变量常用预定义变量$?上一条命令的返回状态0成功非0失败$$当前进程的进程号$!最后一个后台进程的进程号ls/etc/dev/nullechols /etc 的返回值$?# 返回值为0则上一条命令正确返回值大于0则上一条命令错误ls/abc/dev/null21echols /abc 的返回值$?echo当前Shell进程PID$$sleep100echo后台进程PID$!6.5 export命令name李四bash# 进入子Shellecho$name# 无输出子Shell看不到exit# 退出子Shellexportname# 导出变量bash# 进入子Shellecho$name# 输出李四子Shell能看到#export的三种用法#方式1先定义再导出name李四exportname#方式2定义时直接导出exportcitybeijing# 方式3export -n 取消导出export-nname# 取消后子Shell又看不到了七、重定向与管道7.1 标准输入输出与错误输出Linux的三条“流水线”文件描述符名称默认设备说明0STDIN键盘程序从这里读数据1STDOUT显示器正常输出到这里2STDERR显示器错误信息到这里7.2 输出重定向uname-pkernel.txt# 覆盖把输出保存到文件覆盖原有内容uname-rkernel.txt# 追加把输出追加到文件末尾ls/etc/passwd xxxok.txt2err.txt# 正确的保存到ok.txt错误的保存到err.txtcommand/dev/null21# 忽略所有输出正确错误都丢弃echo$?#输出值为0则上一条命令正确7.3 输入重定向#输出到文件catconfig.txtEOF app_nameMyApp version1.0 EOFcatconfig.txt#查看文件7.4 管道操作常用管道命令命令功能grep过滤sort排序uniq去重/统计wc统计行/字/字符cut提取列rpm-qa|grephttpd# 查找httpd包who|wc-l# 统计当前登录用户数cattest.txt|awk{print $1}|sort|uniq-c|sort-rn|head-3# 统计文件中出现次数最高的3个水果# awk {print $1}取每行第一个字段通常是 IP# sort 排序方便 uniq 统计# uniq -c 统计每个 IP 出现次数# sort -rn 按次数倒序排序# head -10 取前 10 条cat/etc/passwd|grep/bin/bash$|cut-d:-f1# 提取bash用户# grep /bin/bash$ 选择以/bin/bash结尾的行# -d指定以冒号为分割符# -f1 取第一列常用管道组合组合含义sort filename按字母排序sort -n filename按数字排序sort -r filename倒序sort file | uniq去重sort file |uniq -c统计出现次数sort file | uniq -d只显示重复行7.5 案例7.5.1 案例一自动化备份#!/bin/bashechoCPU负载$(uptime|awk{print $10})#打印第10列echo内存$(free-h|awkNR2{print $3/$2})echo磁盘$(df-h|awkNR1 $5080 {print ⚠ 磁盘$1使用率$5})#行号1跳过标题行且 第5字段数值80打印警告信息、第1字段分区名、第5字段使用率%7.5.2 案例二服务器健康检查#!/bin/bashBACKUP_DIR/backupDATE$(date%Y%m%d)tar-czf${BACKUP_DIR}/backup_${DATE}.tar.gz /home2${BACKUP_DIR}/error.log#将 /home 目录打包压缩成带日期的 .tar.gz 文件并把所有错误信息单独保存到日志文件中。if[$?-eq0];thenecho✓ 备份成功elseecho✗ 备份失败请查看错误日志fi总结本文系统介绍了Shell编程的核心基础知识。Shell既是命令解释器也是脚本编程语言在系统管理和自动化运维中应用广泛。脚本编写与执行创建脚本文件后需赋予执行权限chmod x可通过路径执行、bash调用或source方式运行三种方式在子进程环境上有所区别。变量与字符串变量定义无需声明类型局部变量与环境变量作用域不同单引号保留字面值双引号支持变量解析。参数传递与运算符$#统计参数个数$*将所有参数合并为单字符串$保持参数独立。同时掌握了算术运算、关系比较、逻辑操作及文件测试等各类运算符的使用方法。