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 特殊变量

  • 在脚本中使用
特殊变量说明
$nn是数字,表示第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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/908613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…

人工智能赋能高中学科教学的应用与前景研究

一、引言 1.1 研究背景 在科技飞速发展的当下,人工智能(Artificial Intelligence,简称 AI)已成为全球瞩目的关键技术领域,深刻地改变着人们的生活、工作和学习方式。从智能家居设备到智能交通系统,从医疗…

八、【ESP32开发全栈指南:UDP客户端】

1. 环境准备 安装ESP-IDF v4.4 (官方指南)确保Python 3.7 和Git已安装 2. 创建项目 idf.py create-project udp_client cd udp_client3. 完整优化代码 (main/main.c) #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h&…

Android Studio 解决首次安装时下载 Gradle 慢问题

1、问题描述 第一次安装 Android Studio 时&#xff0c; 新建工程后&#xff0c;在编译时会自动去下载 Gradle&#xff0c;但是一般都会下载失败&#xff0c;提示链接超时&#xff1a; Could not install Gradle distribution from https://services.gradle.org/distributions…

hive聚合函数多行合并

在数据仓库和大数据处理的场景中&#xff0c;Hive提供了强大的SQL查询能力&#xff0c;其中包括聚合函数用于处理和合并多行数据。本文将深入探讨Hive中的几种常见聚合函数及其在多行合并中的应用。 一、Hive中的常见聚合函数 Hive提供了多种聚合函数&#xff0c;这些函数可以…

关于物联网的基础知识(一)

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网的基础知识&#xff08;一&a…

迁移科技3D视觉系统:重塑纸箱拆垛场景的智能革命

一、传统拆垛场景的困局与破局之道 在汽车零部件仓库中&#xff0c;每天有超过2万只异形纸箱需要拆垛分拣。传统人工拆垛面临三大挑战&#xff1a; 效率瓶颈&#xff1a;工人每小时仅能处理200-300件&#xff0c;且存在间歇性疲劳安全隐患&#xff1a;20kg以上重箱搬运导致年…

微软重磅发布Magentic UI,交互式AI Agent助手实测!

微软重磅发布Magentic UI,交互式AI Agent助手实测! 何为Magentic UI? Magentic UI 是微软于5.19重磅发布的开源Agent助手,并于24日刚更新了第二个版本0.04版 从官方的介绍来看,目标是打造一款 以人为中心 的智能助手,其底层由多个不同的智能体系统驱动,能够实现网页浏览…

Python实现快速排序的三种经典写法及算法解析

今天想熟悉一下python的基础写法&#xff0c;那就从最经典的快速排序来开始吧&#xff1a; 1、经典分治写法&#xff08;原地排序&#xff09; 时间复杂度&#xff1a;平均O(nlogn)&#xff0c;最坏O(n) 空间复杂度&#xff1a;O(logn)递归栈空间 特点&#xff1a;通过左右指针…

海康网络摄像头实时取帧转Opencv数组格式(h,w,3),已实现python、C#

海康摄像头取帧都是有官方demo的&#xff0c;但是将海康格式的数据转为Opencv格式的没有相关demo&#xff0c;而大部分深度学习图像检测算法(如YOLO)&#xff0c;都是用opencv格式的图像作为输入&#xff0c;因此将海康格式数据转为opencv格式兼容性更强 需要代码请私信联系&a…

职坐标IT教育物联网全栈开发实战:传感器到云平台全链路

物联网全栈开发涉及从终端感知到云端服务的全流程技术整合&#xff0c;其核心在于构建完整的“端-管-云-用”技术链条。为帮助开发者系统掌握这一能力&#xff0c;课程围绕四大模块展开&#xff1a;传感器数据采集与处理、通信协议适配与优化、云平台架构设计及跨平台应用开发。…

LUFFY(路飞): 使用DeepSeek指导Qwen强化学习

论文标题 Learning to Reason under Off-Policy Guidance 论文地址 https://arxiv.org/pdf/2504.14945 代码地址 https://github.com/ElliottYan/LUFFY 作者背景 上海人工智能实验室&#xff0c;西湖大学&#xff0c;南京大学&#xff0c;香港中文大学 动机 目前大模型…

Android Camera Hal中通过Neon指令优化数据拷贝

背景描述&#xff1a; Camera apk普通相机模式录像操作时&#xff0c;一般是同时请求两个流&#xff0c;即预览流和录像流。对于两个流输出图像格式和分辨率相同的情况下&#xff0c;是不是可以通过一个流拷贝得到另一个流的数据&#xff0c;进而节省掉一个Sensor输出处理两次…

WPS word 已有多级列表序号

wps的word中&#xff0c;原来已生成的文档里&#xff0c;已存在序号。比如&#xff0c;存在2、2.1、2.1.1、2.1.1.1、2.1.1.1.1 5层序号&#xff0c;而且已分为5级。但增加内容的时候&#xff0c;并不会自动增加序号&#xff0c;应该如何解决&#xff1f; 原来长这样&#xff…

从零开始制作小程序简单概述

以下是结合案例的“从零制作小红书风格小程序”的全流程指南&#xff0c;采用小红书爆款笔记的结构呈现&#xff0c;并附CSDN参考资源&#x1f447;&#xff1a; 一、核心开发步骤&#xff08;附工具推荐&#xff09; 账号与定位 ✅ 注册类型选择&#xff1a;个人店&#xff08…

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…

网络编程之服务器模型与UDP编程

一、服务器模型 在网络通信中&#xff0c;通常要求一个服务器连接多个客户端 为了处理多个客户端的请求&#xff0c;通常有多种表现形式 1、循环服务器模型 一个服务器可以连接多个客户端&#xff0c;但同一时间只能连接并处理一个客户的请求 socket() 结构体 bind() listen() …

open3D:三维点云处理

open3d 点云数据处理 爆肝5万字❤️Open3D 点云数据处理基础&#xff08;Python版&#xff09;_python 点云 焊缝-CSDN博客 如何用NumPy读取和保存点云数据 - 知乎 读取并可视化点云 np.loadtxt 从txt中读取点集&#xff0c;并open3d显示单个点云 txt内容&#xff1a;每行皆…

使用联邦多轨迹图神经网络(GNNs)结合稀缺数据预测婴儿脑连接|文献速递-深度学习医疗AI最新文献

Title 题目 Predicting infant brain connectivity with federated multi-trajectory GNNs using scarce data 使用联邦多轨迹图神经网络&#xff08;GNNs&#xff09;结合稀缺数据预测婴儿脑连接 01 文献速递介绍 多模态影像下的婴儿脑连接演化预测&#xff1a;联邦学习与…

[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制

Linux 内核作为一个多任务操作系统&#xff0c;其进程管理子系统是核心组成部分之一。无论是用户应用的运行、驱动行为的触发&#xff0c;还是系统调度决策&#xff0c;几乎所有操作都离不开进程的创建、调度与销毁。本文将从进程的概念出发&#xff0c;深入探讨 Linux 内核中进…