云运维学习笔记——第四周(shell编程)

发布时间:2026/7/6 2:12:54
云运维学习笔记——第四周(shell编程) 一、shell编程1.shell是一个命令解释器他为用户提供了一个向Linux内核发送请求以便于运行程序的界面系统程序用户可以用shell启动、挂起、停止甚至是编写一些程序。​​​​​​​ ​​​​​​​2.shell脚本的执行方式1脚本格式要求1脚本比#!/bin/bash要求2脚本需要有可执行的权限2编写一个shell脚本要求输出helloworld#!/bin/bash echo hello world3脚本的常用执行方式1方式1输入脚本的绝对路径或相对路径说明首先要授予hello.sh脚本x权限再执行脚本2方式2sh脚本说明不用赋予脚本x权限直接执行3.shell的变量1shell变量的介绍1Linux shell这个变量分为系统变量和用户自定义变量2系统变量$HOME、$PWD、$SHELL等等3显示当前shell中所有变量的命令set2shell变量的定义基本语法1定义变量变量名值2撤销变量unset 变量3声明静态变量readonly 变量注意静态变量不能unset快速入门#!/bin/bash #案例1定义变量A A100 echo A$A #案例2撤销变量A unset A echo A$A #案例3定义静态变量B readonly B200 echo B$B unset B echo B$B​​​​​​​定义变量的规则1变量名称可以由字母、数字、下划线组成但是不能以数字开头5A200❌️2等号两侧不能有空格3变量名称一般大写将命令的返回值赋给变量1Adate 反引号运行里面的命令并把结果返回给A2A$(date)等价于反引号二、设置环境变量基本语法1.exoprt 变量变量值 功能描述将shell变量输出为环境变量/全局变量2.source 配置文件 功能描述将修改后的配置文件立即生效3.echo $变量名 功能描述查询环境变量的值快速入门1.在/etc/profile 文件中定义TOMCAT_HOME环境变量·2.查看环境变量TOMCAT_HOME的值3.在另一个shell程序中使用TOMCAT_HOME注在输出TOMCAT_HOME环境变量之前需要让其生效source /etc/profile三、位置参数变量1.介绍当我执行一个shell脚本时如果希望获取到命令行的参数信息就可以使用位置变量2.基本语法$n 功能描述n为数字$0代表命令本身$1-9表示第一到第九参数10以上的参数需要大括号包含如${10}$* 功能描述这个变量代表命令行中所有的参数$*吧所有的参数看做一个整体$ 功能描述这个变量也代表命令行中的所有参数不过$把每个参数区分对待S# 功能描述这个变量代表命令行中所有参数的个数3.案例编写一个shell脚本在脚本中获取到命令行各个参数信息#!/bin/bash echo 参数1$1 echo 参数2$2 echo 参数3$3 echo 参数4$4 echo 参数个数$#四、运算符1.基本介绍学习如何在shell中进行各种运算操作2.基本语法1$((运算式))或者expr mn注expr代表expression表达式2注意expr运算式之间要有空格如果希望expr的结果赋给某个变量使用反引号3expr \*乘 /除 %取余3.使用案例1计算23×42请求出命令行的两个参数[整数]的和 20 50#!/bin/bash #方式一 RUM1$(((23)*4)) echo rum1$RUM1 #方式二 RUM3exprt $1 $2 echo rum3$RUM3五、条件判断1.判断语句1基本语法[ condition ] 注意condition前后要有空格#非空返回true可使用$?验证0为true1为false2应用实例[ hspEdu ] 返回true[ ] 返回false[ condition ] echo OK || echo notok 条件满足执行后面的语句3常用判断条件1字符串比较2两个整数之间比较-lt 小于 -le小于等于little equal -eq等于-gt大于 -ge大于等于 -ne不等于3按照文件权限进行判断-r有读的权限 -w有写的权限 -x有执行的权限4按照文件类型进行判断-f文件存在并存在一个常规文件-e文件存在-d文件存在并是个目录5应用实例案例1“ok”是否等于“ok”判断语句案例2:23是否大于32判断语句-ge案例3/root/shcode/aaa.txt目录中的文件是否存在#!/bin/bash #案例1“ok”是否等于“ok” if [ ok ok ] then echo 等于 fi #案例2:23是否大于22 if [ 23 -ge 32] then echo 大于 fi #案例3/root/shcode/aaa.txt if [ -f /root/shcode/aaa.txt ] then echo 存在 fi2.if 判断基本语法if [ 条件判断式 ] then 代码 fi 或者多分支 if [ 条件判断式 ] then 代码 elif [ 条件判断式 ] then 代码 fi 注意事项[ 条件判断式 ]中括号和条件判断之间必须有空格应用实例请编写一个shell程序如果输入的参数大于等于60则输出“及格了”反之输出“不及格”#!/bin/bash if [ $1 -ge 60 ] then echo 及格了 elif [ $1 -lt 60 ] then echo 不及格 fi3.case语法基本语法case $变量名 in 值1) #如果变量的值等于值1则执行程序1 ;; 值2) #如果变量的值等于值2则执行程序2 ;; *) #如果变量的值不等于以上则执行此程序 ;; esac应用实例testCase.sh案例1当命令行参数是1时输出“周一”是2时就输出”周二”其它情况输出“other”#!/bin/bash case $1 in 1) echo 周一 ;; 2) echo 周二 ;; *) echo other ;; esac4.for循环基本语法1for 变量 in 值1 值2 值3... do 程序 done应用实例1打印命令行输入的参数这里可以看出$*和$的区别#!/bin/bash #案例1打印命令行输入的参数这里可以看出$*和$的区别 for i in S* do echo num1$* done #*,把输入的参数当做一个整体所以只会输出一行 echo for i in S do echo num1$ done #,把输入的参数分别对待所以只会输出多行​​​​​​​基本语法2for ((初始值;循环控制变量;变量变化)) do 程序 done应用案例2从1加到100的值输出结果#!/bin/bash SUM0 for ((i1;i100:i)) do echo SUM$((SUMi)) done echo sum$SUM5.while循环基本语句while [ 条件判断式 ] do 程序 done注意while和[]有空格条件判断式和[]也有空格应用实例从命令行输入一个数n统计1...n的值是多少#!/bin/bash SUM0 i0 while [ $i -le $1 ] do SUM$((SUMi)) i$((i1)) done echo sum$SUM六、read读取控制台输入1.基本语法read(选项)(参数) 选项 -p指定读取值的提示符 -t指定读取值时等待的时间秒如果没有指定的时间内输入就不再等待了 参数 变量指定读取值的变量名2.应用实例#!/bin/bash #案例1读取控制台输入一个NUM1值 read -p 请输入num1 NUM1 echo num1$NUM1 #案例2读取控制台输入一个NUM2值在10秒内输入。 read -t 10 -p 请输入num2 NUM2 echo num2$NUM2七、函数1.函数介绍shell编程和其他编程语言一样有系统函数也可以自定义函数。系统函数种介绍一下两个2.系统函数1basename基本语法功能返回完整路径最后/的部分常用于获取文件名basename [pathname] [suffix]basename [string] [suffix]功能描述basename命令会删掉所有前缀包括最后一个‘/’字符然后将字符串显示出来。pathname为路径string为字符串选项suffix为后缀如果suffix被指定了basename那么会将pathname或者string中的suffix去掉2dirname基本语法功能返回路径最后/前面的部分。常用于返回路径部分dirname 文件绝对路径功能描述从给定的包含绝对路径的文件名中去除文件名非目录的部分然后返回剩下的路径目录的部分3.自定义函数基本语法function 函数名(){ 命令代码 } #调用直接写 函数名()应用实例#!/bin/bash #实例计算输入两个参数的和动态的获取getSum function getSum(){ sum$(($1$2)) echo sum$sum } read -p 输入数字1 num1 read -p 输入数字2 num2 getSum $num1 $num2八、自动化备份脚本备份/var/log目录并自动清理 7 天前的备份文件。#!/bin/bash # 配置区 BACKUP_SOURCE/var/log # 要备份的源目录 BACKUP_BASE/backup # 备份存放的根目录 RETENTION_DAYS7 # 保留最近多少天 DATE$(date %Y%m%d) # 日期格式20260705 BACKUP_NAMElog_backup_${DATE} # 备份文件名 BACKUP_PATH${BACKUP_BASE}/${BACKUP_NAME} # 完整备份路径 LOG_FILE${BACKUP_BASE}/backup.log # 日志文件 # # 主程序 # 1. 创建备份存放目录如果不存在 mkdir -p ${BACKUP_BASE} # 2. 执行备份使用 tar 打包并压缩 echo ${LOG_FILE} echo [$(date %Y-%m-%d %H:%M:%S)] 开始备份 ${BACKUP_SOURCE} ${LOG_FILE} tar -czf ${BACKUP_PATH}.tar.gz -C ${BACKUP_SOURCE} . 2/dev/null # 3. 检查备份是否成功 if [ $? -eq 0 ]; then echo [$(date %Y-%m-%d %H:%M:%S)] ✅ 备份成功: ${BACKUP_PATH}.tar.gz ${LOG_FILE} else echo [$(date %Y-%m-%d %H:%M:%S)] ❌ 备份失败请检查错误信息 ${LOG_FILE} exit 1 fi # 4. 删除 7 天前的备份文件 echo [$(date %Y-%m-%d %H:%M:%S)] 开始清理 ${RETENTION_DAYS} 天前的备份... ${LOG_FILE} find ${BACKUP_BASE} -name log_backup_*.tar.gz -mtime ${RETENTION_DAYS} -delete if [ $? -eq 0 ]; then echo [$(date %Y-%m-%d %H:%M:%S)] ✅ 清理完成 ${LOG_FILE} else echo [$(date %Y-%m-%d %H:%M:%S)] ⚠️ 清理过程中出现错误 ${LOG_FILE} fi echo ${LOG_FILE} exit 0公司放假三天结果为了面试一下子休了6天结果面试全部GG也没有学习好无奈……希望接下来会有好结果吧。