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

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

一、shell编程

1.shell是一个命令解释器,他为用户提供了一个向Linux内核发送请求以便于运行程序的界面系统程序,用户可以用shell启动、挂起、停止甚至是编写一些程序。

​​​​​​​ ​​​​​​​

2.shell脚本的执行方式

(1)脚本格式要求

1)脚本比#!/bin/bash要求

2)脚本需要有可执行的权限

(2)编写一个shell脚本,要求输出helloworld

#!/bin/bash echo "hello world"

(3)脚本的常用执行方式

1)方式1:输入脚本的绝对路径或相对路径

说明:首先要授予hello.sh脚本x权限,再执行脚本

2)方式2:sh+脚本

说明:不用赋予脚本x权限,直接执行

3.shell的变量

(1)shell变量的介绍

1)Linux shell这个变量分为系统变量和用户自定义变量

2)系统变量:$HOME、$PWD、$SHELL等等

3)显示当前shell中所有变量的命令:set

(2)shell变量的定义

基本语法

1)定义变量:变量名=值

2)撤销变量:unset 变量

3)声明静态变量:readonly 变量,注意:静态变量不能unset

快速入门:

#!/bin/bash #案例1:定义变量A A=100 echo "A=$A" #案例2:撤销变量A unset A echo "A=$A" #案例3:定义静态变量B readonly B=200 echo "B=$B" unset B echo "B=$B"

​​​​​​​

定义变量的规则

(1)变量名称可以由字母、数字、下划线组成,但是不能以数字开头,5A=200(❌️)

(2)等号两侧不能有空格

(3)变量名称一般大写

将命令的返回值赋给变量

(1)A=`date` 反引号,运行里面的命令,并把结果返回给A

(2)A=$(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 m+n(注:expr代表expression表达式)

(2)注意expr运算式之间要有空格,如果希望expr的结果赋给某个变量,使用反引号``

(3)expr \*乘 /除 %取余

3.使用案例

(1)计算(2+3)×4

(2)请求出命令行的两个参数[整数]的和 20 50

#!/bin/bash #方式一 RUM1=$(((2+3)*4)) echo "rum1=$RUM1" #方式二 RUM3=`exprt $1 + $2` echo "rum3=$RUM3"

五、条件判断

1.判断语句

(1)基本语法:

[ condition ] (注意:condition前后要有空格)

#非空返回true,可使用$?验证(0为true,>1为false)

(2)应用实例

[ 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 "存在" fi

2.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 "不及格" fi

3.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" ;; esac

4.for循环

基本语法1:

for 变量 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 #&@,把输入的参数分别对待,所以只会输出多行

​​​​​​​

基本语法2:

for ((初始值;循环控制变量;变量变化)) do 程序 done

应用案例2:从1加到100的值输出结果

#!/bin/bash SUM=0 for ((i=1;i<=100:i++)) do echo SUM=$((SUM+i)) done echo "sum=$SUM"

5.while循环

基本语句

while [ 条件判断式 ] do 程序 done

注意:while和[]有空格,条件判断式和[]也有空格

应用实例:从命令行输入一个数n,统计1+...+n的值是多少

#!/bin/bash SUM=0 i=0 while [ "$i" -le "$1" ] do SUM=$((SUM+i)) i=$((i+1)) 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.系统函数

(1)basename基本语法

功能:返回完整路径最后/的部分,常用于获取文件名

basename [pathname] [suffix]

basename [string] [suffix]

功能描述:basename命令会删掉所有前缀包括最后一个‘/’字符,然后将字符串显示出来。pathname为路径,string为字符串

选项:

suffix为后缀,如果suffix被指定了,basename那么会将pathname或者string中的suffix去掉

(2)dirname基本语法

功能:返回路径最后/前面的部分。常用于返回路径部分

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_DAYS=7 # 保留最近多少天 DATE=$(date +%Y%m%d) # 日期格式:20260705 BACKUP_NAME="log_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,也没有学习好,无奈……

希望接下来会有好结果吧。

http://www.cnnetsun.cn/news/3173496.html

相关文章:

  • 呼和浩特定制网站还是模板建站?适配 GEO 优化的官网选型攻略
  • Transformer 2017 原理解析:从 RNN 瓶颈到多头注意力 3 大核心优势
  • Dify 从入门到精通:低代码 AI 应用开发平台实战指南
  • Linux打印驱动终极解决方案:foo2zjs让50+打印机品牌在Linux上完美工作
  • 企业微信 JS-SDK 2.4.0 升级实战:从 wx.config 到 ww.register 的 3 步迁移
  • 微信/百度/阿里云OCR API 横向评测:驾驶证识别准确率与成本分析
  • flask之http请求方法
  • Linux 文件 I/O 深度对比:系统调用与 C 库函数性能实测(附 2 种备份代码)
  • Oracle 11g 服务端安装避坑:Windows 10/11 环境 3 个关键配置修改
  • 蒙特卡洛强化学习 3 大核心实现:首次访问 vs 每次访问 vs 增量更新
  • UE4/5 资产重定向器(Redirector)创建逻辑解析:4个条件与1个核心函数
  • ROLLUP 与 CUBE 性能对比:基于 1000万行数据的 5 种聚合查询执行计划解析
  • Argo Workflows 3.5 与 Airflow 2.9 对比评测:5 个维度解析容器原生工作流引擎差异
  • 智慧食堂系统哪家专业
  • POSIX 标准与 Linux 系统调用:从 printf 到 write 的 3 层调用链路剖析
  • Oracle Data Pump 性能调优 5 大参数:并行度、压缩与加密实战对比
  • Java性能调优的五个实用方法
  • /proc/kmsg 与 /dev/kmsg 深度对比:实时内核日志捕获的 2 种方案与 3 个陷阱
  • Week4:时序建模
  • 【共创季稿事节】密码生成器:如何构建一个安全的随机密码生成工具
  • CUDA 12.4 + cuDNN 9.2.0 Conda 安装:3步验证GPU深度学习环境
  • 【共创季稿事节】随机数生成器:Math.random() 的原理与应用
  • Java设计模式——结构型
  • HarmonyKit | 鸿蒙新特性对比:Tabs vs HdsTabs 选型深度解析
  • 2026最新7款AI编程助手学生党实测深度对比
  • 黎阳之光自研三维重构引擎,赋能全行业全域透明管理
  • 基于51/STM32单片机智能马桶设计 久坐提醒 换气除臭 杀菌消毒331(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 混合静态与动态分析:构建自动化软件供应链漏洞检测与修复闭环
  • 为什么选择Unlock Music:3分钟快速解锁加密音乐文件的完整指南
  • AIPCowork运维实战:从微信告警到中间件巡检,一句话就够了