day027-Shell自动化编程-基础
文章目录
- 1. 修改vim配置文件自动添加注释
- 2. 故障案例:Windows上写的Shell脚本上传到Linux系统上运行报错
- 3. 脚本运行方法
- 4. 变量
- 4.1 普通变量
- 4.2 环境变量
- 4.3 特殊变量
- 4.4 案例:书写ping检查脚本,检查脚本传入的第一个参数
- 4.5 面试题:$n,n大于9后会有什么问题?
- 5. if判断
- 5.1 比较大小
- 5.2 案例:书写ping检查域名/ip的脚本
- 5.3 案例:检查指定用户是否存在
- 5.4 案例:书写回收站脚本,执行rm的时候调用mv命令移动指定文件或目录到/recycle目录下
- 6. for循环
- 6.1 案例:批量添加用户
- 6.2 案例:检查系统中可登录用户的uid、gid信息
- 6.3 批量检查ip/domain是否可以访问
- 7. 思维导图
1. 修改vim配置文件自动添加注释
- vim的配置文件:
/etc/vimrc(Kylin)
,/etc/vim/vimrc(ubuntu)
- 添加下面配置:
autocmd BufNewFile *.py,*.cc,*.sh,*.java,*.bash,Dockerfile,docker-compose.yml exec ":call SetTitle()"func SetTitle() if expand("%:e") =~ 'sh\|bash' call setline(1,"#!/bin/bash")call setline(2, "##############################################################") call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: SunKexu")call setline(6, "# Organization: www.oldboyedu.com")call setline(7, "# Description:")call setline(8, "##############################################################")call setline(9, "")endif if expand("%") == 'Dockerfile' call setline(1, "#####################Dockerfile###############################")call setline(2, "##############################################################") call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: SunKexu")call setline(6, "# Organization: www.oldboyedu.com")call setline(7, "# Description:")call setline(8, "##############################################################")call setline(9, "")call setline(10, "FROM")call setline(11, "LABEL maintaniner='oldboy lidao@oldboyedu.com' author=lidao996")call setline(12, "CMD []")endif if expand("%") == 'docker-compose.yml' call setline(1, "#####################docker-compose###########################")call setline(2, "##############################################################") call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: SunKexu")call setline(6, "# Organization: www.oldboyedu.com")call setline(7, "# Description:")call setline(8, "##############################################################")call setline(9, "")call setline(10, "version: '3.3'")call setline(11, "services:")call setline(12, "volumes:")endif
endfunc
2. 故障案例:Windows上写的Shell脚本上传到Linux系统上运行报错
- 原因:Windows下的回车符是\r\n,Linux下的回车符是\n,因此报错。可以用
cat -n
查看详细内容 - 解决方法:
dos2unix
,使用该命令将脚本格式转换为Linux的格式
3. 脚本运行方法
方法 | 使用场景 |
---|---|
bash/sh | 最常用的方法,ubuntu中不能用sh |
路径运行 | 不推荐使用,因为可能有权限问题导致失败,需要给脚本执行权限 |
source/. | 运行脚本/加载带有变量、自定义函数库; 1.加载全局变量配置文件时使用 2.实现include功能,,加载子脚本 |
4. 变量
4.1 普通变量
变量命令规则:
- 不能以数字开头
- 变量名应有具体含义
4.2 环境变量
- 全局变量,查看全局变量的命令:
env
export
:创建或修改全局变量
4.3 特殊变量
- 在脚本中使用
特殊变量 | 说明 |
---|---|
$n | n是数字,表示第n个脚本参数 |
$0 | 脚本名字 |
$# | 脚本参数个数 |
$*/$@ | 取出所有脚本参数 |
$? | 上一个命令的返回值;0表示正确,非0表示错误 |
4.4 案例:书写ping检查脚本,检查脚本传入的第一个参数
[root@oldboy99-Kylin /server/scripts]# cat ping.sh
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################ip=$1ping -c 1 $ip
[root@oldboy99-Kylin /server/scripts]# bash ping.sh jd.com
PING jd.com (211.144.27.126) 56(84) bytes of data.
64 bytes from 211.144.27.126 (211.144.27.126): icmp_seq=1 ttl=128 time=136 ms--- jd.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 136.231/136.231/136.231/0.000 ms
4.5 面试题:$n,n大于9后会有什么问题?
问题现象:
- $n不能作为整体被解析,需要用大括号使n作为一个整体
[root@oldboy99-Kylin /server/scripts]# cat test.sh
#!/bin/bash
##############################################################
# File Name: test.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################echo $9 $10 $11
[root@oldboy99-Kylin /server/scripts]# bash test.sh {a..z}
i a0 a1
修改后:
[root@oldboy99-Kylin /server/scripts]# cat test.sh
#!/bin/bash
##############################################################
# File Name: test.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################echo $9 ${10} ${11}
[root@oldboy99-Kylin /server/scripts]# bash test.sh {a..z}
i j k
5. if判断
5.1 比较大小
判断 | if符号 |
---|---|
等于 | -eq |
不等于 | -ne |
大于 | -gt |
大于等于 | -ge |
小于 | -lt |
小于等于 | -le |
5.2 案例:书写ping检查域名/ip的脚本
[root@oldboy99-Kylin /server/scripts]# cat ping.sh
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
ip=$1# ping
ping -c2 $ip >/dev/null 2>&1# if
if [ $? -eq 0 ];thenecho "${ip} 可以访问"
elseecho "${ip} 不能访问"
fi[root@oldboy99-Kylin /server/scripts]# bash ping.sh jd.com
jd.com 可以访问
修改版:
[root@oldboy99-Kylin /server/scripts]# cat ping.sh
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
ip=$1# 检查是否有参数
if [ $# -ne 1 ];thenecho "Usage:$0 ip/domain"exit 1 #退出脚本,返回值是1
fi# ping
ping -c2 $ip >/dev/null 2>&1# if
if [ $? -eq 0 ];thenecho "${ip} 可以访问"
elseecho "${ip} 不能访问"
fi[root@oldboy99-Kylin /server/scripts]# bash ping.sh www.qq.com
www.qq.com 可以访问
5.3 案例:检查指定用户是否存在
[root@oldboy99-Kylin /server/scripts]# cat check_user.sh
#!/bin/bash
##############################################################
# File Name: check_user.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
user=$1# command
# 检查参数个数
if [ $# -ne 1 ];thenecho "usage: $0 username"exit 1
fiid ${user} >/dev/null 2>&1
if [ $? -eq 0 ];thenecho "${user}用户存在"
elseecho "${user}用户不存在"fi[root@oldboy99-Kylin /server/scripts]# bash check_user.sh mysql
mysql用户不存在
5.4 案例:书写回收站脚本,执行rm的时候调用mv命令移动指定文件或目录到/recycle目录下
- mktemp:创建临时文件或目录
- -d:创建目录
- -p 路径:指定临时文件或目录存放位置
[root@oldboy99-Kylin /server/scripts]# cat recycle.sh
#!/bin/bash
##############################################################
# File Name: recycle.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
files="$*"
recy_dir="/recycle"# command
# 检查参数个数
if [ $# -eq 0 ];thenecho "usage: $0 filename"exit 1
fi
# 检查用户是否为root
if [ $UID -ne 0 ];thenecho "请使用root删除,普通用户请使用mv自行操作"exit 2
fimv ${files} ${recy_dir} >>/dev/null 2>&1if [ $? -eq 0 ];thenecho "删除成功!"
elseecho "删除失败"
fi
[root@oldboy99-Kylin /server/scripts]# mktemp -dp ./
./tmp.KKJkrjumyK
[root@oldboy99-Kylin /server/scripts]# alias |grep rm
alias rm='bash /server/scripts/recycle.sh'
[root@oldboy99-Kylin /server/scripts]# rm ./tmp.KKJkrjumyK/
删除成功!
6. for循环
6.1 案例:批量添加用户
[root@oldboy99-Kylin /server/scripts]# for name in oldboy{01..10}; do useradd $name;done
[root@oldboy99-Kylin /server/scripts]# tail /etc/passwd
oldboy01:x:1003:1003::/home/oldboy01:/bin/bash
oldboy02:x:1004:1004::/home/oldboy02:/bin/bash
oldboy03:x:1005:1005::/home/oldboy03:/bin/bash
oldboy04:x:1006:1006::/home/oldboy04:/bin/bash
oldboy05:x:1007:1007::/home/oldboy05:/bin/bash
oldboy06:x:1008:1008::/home/oldboy06:/bin/bash
oldboy07:x:1009:1009::/home/oldboy07:/bin/bash
oldboy08:x:1010:1010::/home/oldboy08:/bin/bash
oldboy09:x:1011:1011::/home/oldboy09:/bin/bash
oldboy10:x:1012:1012::/home/oldboy10:/bin/bash
6.2 案例:检查系统中可登录用户的uid、gid信息
[root@oldboy99-Kylin /server/scripts]# cat check_login.sh
#!/bin/bash
##############################################################
# File Name: check_login.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
export LANG=en_US.UTF-8users=`grep '/bin/bash' /etc/passwd |awk -F ':' '{print $1}'`# for
for name in $users
douid=`id $name |awk -F '[ =]' '{print $2}'`gid=`id $name |awk -F '[ =]' '{print $4}'`group=`id $name |awk -F '[ =]' '{print $6}'`echo "用户名:$name,用户id:$uid,用户组:$gid,用户组信息:$group"
done
[root@oldboy99-Kylin /server/scripts]# bash check_login.sh
用户名:root,用户id:0(root),用户组:0(root),用户组信息:0(root)
用户名:oldboy,用户id:1000(oldboy),用户组:1000(oldboy),用户组信息:1000(oldboy)
用户名:oldboy01,用户id:1003(oldboy01),用户组:1003(oldboy01),用户组信息:1003(oldboy01)
用户名:oldboy02,用户id:1004(oldboy02),用户组:1004(oldboy02),用户组信息:1004(oldboy02)
用户名:oldboy03,用户id:1005(oldboy03),用户组:1005(oldboy03),用户组信息:1005(oldboy03)
用户名:oldboy04,用户id:1006(oldboy04),用户组:1006(oldboy04),用户组信息:1006(oldboy04)
用户名:oldboy05,用户id:1007(oldboy05),用户组:1007(oldboy05),用户组信息:1007(oldboy05)
用户名:oldboy06,用户id:1008(oldboy06),用户组:1008(oldboy06),用户组信息:1008(oldboy06)
用户名:oldboy07,用户id:1009(oldboy07),用户组:1009(oldboy07),用户组信息:1009(oldboy07)
用户名:oldboy08,用户id:1010(oldboy08),用户组:1010(oldboy08),用户组信息:1010(oldboy08)
用户名:oldboy09,用户id:1011(oldboy09),用户组:1011(oldboy09),用户组信息:1011(oldboy09)
用户名:oldboy10,用户id:1012(oldboy10),用户组:1012(oldboy10),用户组信息:1012(oldboy10)
6.3 批量检查ip/domain是否可以访问
[root@oldboy99-Kylin /server/scripts]# cat ping.sh
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
ips=$*# 检查是否有参数
if [ $# -eq 0 ];thenecho "Usage:$0 ip/domain"exit 1 #退出脚本,返回值是1
fi# ping
for ip in $ips
doping -c2 $ip >/dev/null 2>&1# ifif [ $? -eq 0 ];thenecho "${ip} 可以访问"elseecho "${ip} 不能访问"
fi
done
[root@oldboy99-Kylin /server/scripts]# bash ping.sh qq.com baidu.com
qq.com 可以访问
baidu.com 可以访问
7. 思维导图
【金山文档 | WPS云文档】 思维导图 https://kdocs.cn/l/co3I7PtpTYQX
相关文章:
day027-Shell自动化编程-基础
文章目录 1. 修改vim配置文件自动添加注释2. 故障案例:Windows上写的Shell脚本上传到Linux系统上运行报错3. 脚本运行方法4. 变量4.1 普通变量4.2 环境变量4.3 特殊变量4.4 案例:书写ping检查脚本,检查脚本传入的第一个参数4.5 面试题&#x…...

工业自动化DeviceNET从站转Ethernet/IP主站网关赋能冶金行业工业机器人高效运行
在冶金行业高速发展的当下,对生产效率与精度的要求不断攀升。工业机器人凭借其精准、高效的特性,在钻孔、铣削、切割、弯曲、冲压等加工工艺中广泛应用。然而,不同设备间的通信协议差异常成为制约系统协同的瓶颈。JH-DVN-EIP疆鸿智能DeviceNE…...
STM32启动文件学习(startup_stm32f40xx.s)
原代码 ;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** ;* File Name : startup_stm32f40xx.s ;* Author : MCD Application Team ;* version : V1.8.0 ;* date : 09-November-2016 ;* Desc…...
构建高效可靠的电商 API:设计原则与实践指南
引言 在数字化浪潮中,电商 API 接口技术已成为连接不同系统、实现数据高效流通的核心桥梁。通过标准化的协议和工具集合,API 不仅支撑了商品管理、订单处理等基础功能,还为个性化推荐、全球供应链协同等创新场景提供了底层支持。本文将结合行…...

开源数据库MySQL 与 PostgreSQL的巅峰对决。
MySQL 与 PostgreSQL 是两大主流开源关系型数据库,其核心差异主要体现在架构设计、功能特性、性能优化及适用场景上。结合最新技术对比和行业实践,以下为深度解析: 🧠 一、架构与设计哲学 维度PostgreSQL…...

从 LeetCode 到日志匹配:一行 Swift 实现规则识别
文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在开发中我们经常遇到“模式匹配”的问题,比如日志分类、用户意图识别、甚至是在一些权限系统中做规则映射判断。这类问题的本质是判断两个结构是否具有一致的对应关系。LeetCo…...

前端js获取当前经纬度(H5/pc/mac/window都可用)
前端JS获取当前位置的经纬度(H5/PC/mac/window都可用,亲测!),效果如下。 完整代码如下: <!-- 用原生api获取经纬度,转化为百度经纬度与服务端交互, 只支持https! --&g…...

Meta计划借助AI实现广告创作全自动化
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

AI编程规范失控?三大策略用Cursor Rules精准约束
在 AI 编程时代,如何让助手精准理解您的项目规范?当团队协作时,如何确保每位开发者生成的代码风格统一?Cursor Rules 正是您需要的终极解决方案——它如同一位永不疲倦的架构师,通过预设规则控制 AI 的每一次代码生成、重构与补全行为。 本教程将带您深入 Cursor Rules…...

4.大语言模型预备数学知识
大语言模型预备数学知识 复习一下在大语言模型中用到的矩阵和向量的运算,及概率统计和神经网络中常用概念。 矩阵的运算 矩阵 矩阵加减法 条件:行数列数相同的矩阵才能做矩阵加减法 数值与矩阵的乘除法 矩阵乘法 条件:矩阵A的列数 矩阵…...

免费开源Umi-OCR,离线使用,批量精准!
Umi-OCR(Windows端) Umi-OCR 是一款在 GitHub 上开源的免费 OCR 识别软件,它最大的亮点就是免费、开源、支持批量处理,而且识别准确度很高。这款软件不需要联网就能用,非常值得推荐! 在 OCR 识别功能方面&…...

NLP驱动网页数据分类与抽取实战
一、性能瓶颈点:数据抽取中的「三座大山」 在使用NLP技术进行网页商品数据抽取时,很多工程师会遇到如下三类瓶颈: 1. 请求延迟高:目标站点反爬机制灵敏,普通请求频繁被封。2. 结构解析慢:HTML结构复杂&am…...
设计模式之单例模式(二): 心得体会
设计模式之单例模式(一)-CSDN博客 目录 1.背景 2.分析 2.1.违背面向对象设计原则,导致职责混乱 2.2.全局状态泛滥,引发依赖与耦合灾难 2.3.多线程场景下风险放大,性能与稳定性受损 2.4.测试与维护难度指数级上升 2.5.违背 “最小知识原…...
使用Python提取PDF元数据的完整指南
PDF文档中包含着丰富的元数据信息,这些信息对文档管理和数据分析具有重要意义。本文将详细介绍如何利用Python高效提取PDF元数据,并对比主流技术方案的优劣。 ## 一、PDF元数据概述 PDF元数据(Metadata)是包含在文档中的结构化信…...
uni-app学习笔记十八--uni-app static目录简介
本笔记内容摘录自工程简介 | uni-app官网 一个 uni-app 工程,就是一个 Vue 项目,在完成uni-app项目创建后,会生成一个static目录, 为什么需要static这样的目录? uni-app编译器根据pages.json扫描需要编译的页面&…...

阿里云ACP云计算备考笔记 (3)——云存储RDS
目录 第一章 云存储概览 1、云存储通用知识 ① 发展历史 ② 云存储的优势 2、云存储分类 3、文件存储业务场景 第二章 块存储 1、块存储分类 2、云盘的优势 3、创建云盘 4、管理数据盘 ① 格式化数据盘 ② 挂载数据盘 ③ 通过 API 挂载云盘 5、管理系统盘 ① 更…...

仓颉语言---Socket编程
一、什么是Socket编程? 1.定义 Socket(套接字)可以被理解为网络上两个进程之间通信的端点。它是网络通信的抽象表示,封装了底层网络协议的复杂性,为应用程序提供了一个简单统一的接口。 Socket 编程是一种网络编程范式…...
Mysql的B-树和B+树的区别总结
B 树也称 B- 树,全称为 多路平衡查找树,B 树是 B 树的一种变体。B 树和 B 树中的 B 是 Balanced(平衡)的意思。 目前大部分数据库系统及文件系统都采用 B-Tree 或其变种 BTree 作为索引结构。 B 树& B 树两者有何异同呢&…...

【Java EE初阶 --- 多线程(初阶)】多线程的实现案例
乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 ,Java 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 文章目录 前言单例模式实现单例模式…...

制作一款打飞机游戏64:关卡设计
今天我想完成第一个音乐循环的关卡设计。 初始设置 首先,我要删除所有之前创建的敌人和“大脑”(可能指敌人的行为模式或AI)。我不想保留它们,我要从零开始,重新创建敌人。但我会保留精灵(游戏中的角色或…...
开发常用的QT mql组件
Column Column 是一种将其子项沿单个列定位的类型。它是不使用锚点的情况下垂直定位一系列项目的便捷方式。 add : Transition bottomPadding : real leftPadding : real move : Transition padding : real populate : Transition rightPadding : real spacing : rea…...
Git操作记录
一.简单上传操作 1.Git 全局设置 git config --global user.name "xxx" git config --global user.email "xxx"2.创建新存储库 git clone gitgitlab.xxx.cn:xx/xxx/xxx.git cd test touch README.md git add README.md git commit -m "add README&qu…...
Vue Router的核心实现原理深度解析
1. Vue Router的基本架构 Vue Router的核心功能是实现前端路由,即在不重新加载页面的情况下更改应用的视图。它的基本架构包括: 路由配置:定义路径与组件的映射关系路由实例:管理路由状态和提供导航方法路由视图:渲染…...

Python趣学篇:用Pygame打造绚烂流星雨动画
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《Python星球日记》 目录 一、项目简介与效果展示二、技术栈与核…...
AI系统负载均衡与动态路由
载均衡与动态路由 在微服务架构中,负载均衡是实现服务高可用和性能优化的关键机制。传统负载均衡技术通常围绕请求数、连接数、CPU占用率等基础指标进行分发,而在AI系统中,特别是多模型、多异构算力(如CPU、GPU、TPU)共存的环境下,负载均衡不仅要考虑节点资源消耗,还需…...

山西省第十八届职业院校技能大赛 网络建设与运维赛项 样题
山西省第十八届职业院校技能大赛 网络建设与运维赛项 (学生组) 样题 2024 年 11 月 xx 日 2 赛题说明 一、竞赛项目简介 “网络建设与运维”竞赛共分为模块一:网络理论测试与网络 运维;模块二: 网络建设与调试&a…...
Stone 3D新版本发布,添加玩家控制和生物模拟等组件,增强路径编辑功能,优化材质编辑
后续版本号改为构建日期加小版本,所以最新版本为20250603.01 功能更新如下: 1. 改写fps-controls组件,简化游戏应用的创建,你只需要一个场景glb,然后给Scene节点添加fps-controls组件,即可完成一个第一人…...
【Qt】之【Get√】【Bug】通过值捕获(或 const 引用捕获)传进 lambda,会默认复制成 const
通过值捕获(或 const 引用捕获)传进 lambda,会默认复制成 const。 背景 匿名函数外部定义 QSet<QString> nameSet,需要传入匿名函数使用修改 connect(dlg, ..., [nameSet](...) {nameSet.insert(name); // ❌ 这里其实是 const QSet…...
排序算法C语言实现
算法概览 排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性适用场景插入排序O(n)O(n)O(1)稳定小规模/基本有序希尔排序O(n log n)O(n)O(1)不稳定中等规模冒泡排序O(n)O(n)O(1)稳定教学/小规模堆排序O(n log n)O(n log n)O(1)不稳定大规模数据选择排序O(n)O(n)O(1)不稳定…...

Python----目标检测(训练YOLOV8网络)
一、数据集标注 在已经采集的数据中,使用labelImg进行数据集标注,标注后的txt与原始 图像文件同名且在同一个文件夹(data)即可。 二、制作数据集 在data目录的同目录下,新建dataset目录,以存放制作好的YOLO…...