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

简单shell脚本的编写

文章目录

      • 简单使用
      • shell脚本参数判断
      • 整数的比较运算符
      • 字符串的比较运算
      • shell脚本流程控制
      • shell脚本循环
        • for循环
          • 批量添加用户
          • 批量ping IP地址
          • 检测同一局域网,多台主机存活情况
          • 检测同一局域网,多台主机存活情况
          • 多线程检测主机存活情况
        • while循环
        • case选择语句

shell脚本就是将命令写入文本中,文本可以被执行。

脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)

shell 既是应用程序,又是一种脚本语言(应用程序 解析 脚本语言)。

简单使用

$0 表示当前脚本的名称
$* 表示脚本的所有参数
$# 表示脚本的参数的个数
$? 程序执行完后的结果,返回值0表示执行成功

$n 表示脚本的第n个参数,n=1,2,3,4,5…9

#!bin/bash
echo "当前脚本的名称为$O"

双引号会解释变量

单引号会把变量当成字符串表示

没有给这个脚本赋予可执行权限就用bash来执行该脚本

image-20230826130448301

#!bin/bash
echo "当前脚本的名称为$O"
echo "总共有$#个参数,分别是$*"

image-20230826131058992

#!bin/bash
echo "当前脚本的名称为$O"
echo "总共有$#个参数,分别是$*"
echo "第一个参数是$1,第三个参数是$3"

image-20230826131207513

shell脚本参数判断

  • 1、文件测试语句
    • -d 测试文件是否是目录类型
      • 是目录返回0,不是目录返回非0
    • -e 测试文件是否存在
    • -f 判断是否为一般文件
    • -r 判断当前用户对该文件是否有==读取==权限
    • -w 判断当前用户对该文件是否有==写入==权限
    • -x 判断当前用户对该文件是否有==执行==权限
  • 2、逻辑测试语句
  • 3、整数值测试语句
  • 4、字符串比较语句

判断/etc/passwd是否为目录

┌──(kali💋kali)-[~/Desktop]
└─$ [ -d  /etc/passwd ]┌──(kali💋kali)-[~/Desktop]
└─$ echo $?                                                             11
#  $?表示上一步的结果,用echo 输出  

返回值为1,表示/etc/passwd不是目录

┌──(kali💋kali)-[~/Desktop]
└─$ ls
demo.sh  zs┌──(kali💋kali)-[~/Desktop]
└─$ [ -d  zs ]    ┌──(kali💋kali)-[~/Desktop]
└─$ echo $?
0                                                                        

image-20230826132641472

┌──(kali💋kali)-[~/Desktop]
└─$ [ -d  demo.sh ]┌──(kali💋kali)-[~/Desktop]
└─$ echo $?                                                             11

image-20230826132602446

一条命令完成上述命令 &&

&& 必须保证两边都为真,条件才会成立,有一边为假条件都不会成立

┌──(kali💋kali)-[~/Desktop]
└─$ [ -f  /etc/passwd ] && echo "该/etc/passwd是文件"                  
该/etc/passwd是文件      # [ -f  /etc/passwd ]  为真,确实是文件,
# 则执行后面的echo语句

image-20230826133443273

┌──(kali💋kali)-[~/Desktop]
└─$ [  $USER=kali ] && echo "该用户是kali用户"
该用户是kali用户

image-20230826140216263

|| 两边有一个为真就为真,两边都为真也为真

┌──(kali💋kali)-[~/Desktop]
└─$ [ $USER=kali ] ||   echo "该用户是kali用户"                                     

! 表示取反

┌──(kali💋kali)-[~/Desktop]
└─$ [ ! $USER=kali ] ||   echo "该用户是kali用户"
该用户是kali用户

要求普通用户输出user,管理员用户输出superuser

[ ! $USER = kali ] &&  echo "superuser" || echo "user"

image-20230826140635012

整数的比较运算符

-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 等于或小于
-ge 等于或大于
┌──(kali💋kali)-[~/Desktop]
└─$ [ 9 -gt 9 ]                                           ┌──(kali💋kali)-[~/Desktop]
└─$ echo $?                                                
1

image-20230826142855907

字符串的比较运算

= 比较字符串内容是否相同
!= 比较字符串内容是否为空
-z 判断字符串内容是否为空

image-20230826143230975

image-20230826143328453

┌──(kali💋kali)-[~/Desktop]
└─$ [ $LANG = "en_US.UTF-8" ] && echo "支持英文" || echo "支持中文"
支持英文 

image-20230826143722490

shell脚本流程控制

if 条件
then 命令
else 命令
fi

if…

#!/bin/bash
DIR="/home/kali/Desktop/demo"
if [ ! -e $DIR]
then 	mkdir -p $DIR
fi

if…else…

#!/bin/bash
ping -c 3 -i 0.2 -w 3 &1 $>/dev/nullif [ $? -eq 0 ]
then echo "该$1是正常的"
elseecho "该$1是不正常的"
fi

image-20230826150236438

if…else…嵌套

ping -c -i 0.2 -w 3 $1 &>/dev/nullif [ $? -eq 0 ]then echo "该$1是正常的"elseecho "该$1是不正常的"fi

if…else…多级嵌套

#!/bin/ash
if [ -z $1  ]
then echo "作者:zs"echo "该命令是检测服务器IP是否正常"echo "直接在命令后面加参数IP就可以执行"
elseping -c 3 -i 0.2 -w 3 $1 &>/dev/nullif [ $? -eq 0 ]then echo "该$1是正常的"elseecho "该$1是不正常的"fifi

if…elif…else

read -p "请输入分数 [1--100]:" score
if [ $score -ge 85 ] && [ $score -le 100 ] ;thenecho "优秀"
elif [ $score -ge 70 ] && [ $score -le 84 ] ;thenecho "合格"
elseecho "不合格"
fi

image-20230826153620595

shell脚本循环

for循环

for 变量名 in 取值列表
do命令序列
done
批量添加用户

在这里插入图片描述

#!/bin/bash
#循环语句
read -p "请输入密码:" PASSWORDfor USERNAME  in  `cat user.txt`
doid $USERNAME &>/dev/nullif [ $? -eq 0 ]then echo "该用户$USERNAME 已经存在"elseuseradd $USERNAME &>/dev/nullecho "$PASSWORD"| passwd --stdin $USERNAME &>/dev/nullecho "该用户$USERNAME添加成功"fi
done
批量ping IP地址

image-20230826160950004

#!/bin/bash
#批量pingIP地址
HOSTLIST=$(cat /home/kali/Desktop/iplist.txt)
for IP in $HOSTLIST
do ping -c 3 -i 0.2 -w 3 $IP &>/dev/nullif [ $? -eq 0 ]thenecho "该IP:$IP是正常的"elseecho "该IP: $IP是ping不通的"fi
done

image-20230826161631043

检测同一局域网,多台主机存活情况
#!/bin/bash
read -p "请输入网络位:" NETWORKfor ip in $(seq 100 254)  #seq用于生成数字100~254
doping -c 3 -i 0.2 -w 3 $NETWORK.$ip &>/dev/null  && result=0 || result=1if [ $result -eq 0 ];thenecho "IP地址: $NETWORK.$ip is up !!"echo $NETWORK.$ip >> /tmp/up.txtelseecho "IP地址: $NETWORK.$ip is down !!"echo $NETWORK.$ip >> /tmp/down.txtfi
done
检测同一局域网,多台主机存活情况
#!/bin/bash
read -p "请输入网络位:" NETWORKfor ip in $(seq 100 254)  #seq用于生成数字100~254
doping -c 3 -i 0.2 -w 3 $NETWORK.$ip &>/dev/null  && result=0 || result=1if [ $result -eq 0 ];thenecho "IP地址: $NETWORK.$ip is up !!"echo $NETWORK.$ip >> /tmp/up.txtelseecho "IP地址: $NETWORK.$ip is down !!"echo $NETWORK.$ip >> /tmp/down.txtfi
done

在这里插入图片描述

多线程检测主机存活情况

echo输入带颜色的内容相关博客

#!/bin/bash
read -p "请输入IP网络位:" ip  
for i in $(seq 1 254) #seq用于生成数字1~254do{ ping $ip.$i -c1 -s1 2>&1 1>/dev/null &&  echo -e ping $ip.$i"\033[32m通的!\033[0m" || echo -e ping $ip.$i"\033[31m不通的!\033[0m" } &  #注意在shell中不支持多线程的.这里&是采用多进程执行方式,{}里执行了,不管结束没结束继续执行下一条.done
wait #{}执行完,执行下一条,相当于高级语言多线程同步作用.
echo "扫描检测已结束。"

请添加图片描述

while循环

while 条件
do命令序列
done

$RANDOM是linux中的内置变量,可以随机生成0-32767之间的整数数字

在这里插入图片描述

#!/bin/bash
TIMES=0
echo "该商品的价格为0--999之间,来猜一猜!"
PRICE=$(expr $RANDOM % 1000 )
while true
doread -p "请输入价格:" INTlet TIMES++                       #自增if [ $INT -eq $PRICE ];thenecho "恭喜你猜对了,价格为$PRICE"echo "猜了$TIMES次"exitelif [ $INT -gt $PRICE ];thenecho "猜高了"elseecho "太低了"fi
done

image-20230826163244384

case选择语句

case 变量值 in 
模式1命令序列1
模式2 命令序列2
....默认命令序列
esac
#!/bin/bash
read -p "请输入一个字符:" KEY
case "$KEY" in[a-z]|[A-Z])echo "这是字母";;[0-9])echo "这是数字";;*)echo "这是特殊符号"
esac

image-20230826164122016

相关文章:

简单shell脚本的编写

文章目录 简单使用shell脚本参数判断整数的比较运算符字符串的比较运算shell脚本流程控制shell脚本循环for循环批量添加用户批量ping IP地址检测同一局域网,多台主机存活情况检测同一局域网,多台主机存活情况多线程检测主机存活情况 while循环case选择语…...

汽车售后接待vr虚拟仿真实操演练作为岗位培训的重要工具和手段

汽车虚拟仿真教学软件是一种基于虚拟现实技术的教学辅助工具。它能够模拟真实的汽车环境和操作场景,让学生能够通过虚拟仿真来学习和实践汽车相关知识和技能。与传统的教学方式相比,汽车虚拟仿真教学软件具有更高的视觉沉浸感和互动性,能够更…...

登录校验-Filter-登录校验过滤器

目录 思路 登录校验Filter-流程 步骤 流程图 登录校验Filter-代码 过滤器类 工具类 测试登录 登录接口功能请求 其他接口功能请求 前后端联调 思路 前端访问登录接口,登陆成功后,服务端会生成一个JWT令牌,并返回给前端&#xff0…...

Vue3列表竖向滚动(包含使用swiper的翻页效果)

一、使用element-plus表格进行滚动&#xff1a; 可以满足的需求&#xff1a;表格一行一行竖向滚动&#xff0c;类似走马灯。 不能满足的需求&#xff1a;表格分页竖向滚动&#xff0c;有翻页的效果。 代码&#xff1a; <template><el-table:data"tableData"…...

OS 死锁处理

如果P先申请mutex 则mutex从1置零&#xff0c;假设申请到的empty 0则empty变成-1阻塞态 同理C中mutex从0变为-1&#xff0c;那么如果想离开阻塞态&#xff0c;那么就需要执行V&#xff08;empty&#xff09;但是如果执行V&#xff08;empty&#xff09;就需要P&#xff08;mu…...

Java实现根据按图搜索商品数据,按图搜索获取1688商品详情数据,1688拍立淘接口,1688API接口封装方法

要通过按图搜索1688的API获取商品详情跨境属性数据&#xff0c;您可以使用1688开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例&#xff0c;展示如何通过1688开放平台API获取商品详情属性数据接口&#xff1a; 首先&#xff0c;确保您已注册成为1688开放平台…...

如何避免重复消费消息

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…...

【若依框架RuoYi-Vue-Plus 图片回显不显示问题,OSS文件上传或者本地上传】

一、问题 1.设计表 product&#xff08;商品表&#xff09; 有 id &#xff08;id&#xff09; name&#xff08;商品名&#xff09;icon&#xff08;图标&#xff09; 2.使用若依代码生成功能&#xff0c;导入product表&#xff0c;代码生成。 3.将生成的代码导入到项目中得到…...

docker搭建rocketmq环境

准备局域网 nameserver和broker在同一网段才能够互相访问&#xff0c;我们先创建一个局域网。 创建rocketmq-network&#xff0c;让nameserver、broker在同一个网段&#xff1a; docker network create --driverbridge \ --subnet192.168.2.10/24 rocketmq-network安装names…...

uwsgi部署多进程django apscheduler与问题排查

&#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;开源建设者与全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#xff1a;Zeeland&#x1f4da; Github主页: Undertone0809 (Zeeland)&…...

git difftool对比差异,避免推送不相关内容

问题 在利用git进行版本管理的时候&#xff0c;经常会由于对其他不相关的代码&#xff0c;做了一些小改动&#xff0c;例如删除了一个空行&#xff0c;多了一个缩进等。 为避免将这些不相关的改动也提交到远程&#xff0c;对PR造成不必要的影响&#xff0c;可以利用git diff命…...

Java设计模式:一、六大设计原则-05:接口隔离原则

文章目录 一、定义&#xff1a;接口隔离原则二、模拟场景&#xff1a;接口隔离原则三、违背方案&#xff1a;接口隔离原则3.1 工程结构3.2 英雄技能调用3.2.1 英雄技能接口3.2.2 英雄&#xff1a;后裔3.2.3 英雄&#xff1a;廉颇 3.3 单元测试 四、改善代码&#xff1a;接口隔离…...

第63步 深度学习图像识别:多分类建模误判病例分析(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 上两期我们基于TensorFlow和Pytorch环境做了图像识别的多分类任务建模。这一期我们做误判病例分析&#xff0c;分两节介绍&#xff0c;分别基于TensorFlow和Pytorch环境的建模和分析。 本期以健康组、肺结核组、COVID-19组、细菌性&am…...

OpenCv读/写视频色差 方案

OpenCv read / write video color differenceOpenCv读/写视频色差 感谢博主&#xff1a; OpenCv读/写视频色差答案 - 爱码网 有没有办法让 OpenCV 使用正确的转换&#xff1f;&#xff1f; 是的&#xff0c;使用 GStreamer 后端而不是 FFmpeg 后端&#xff0c;颜色看起来很完…...

【传输层】网络基础 -- UDP协议 | TCP协议

再谈端口号端口号范围划分netstatpidof UDPUDP的特点面向数据报UDP的缓冲区 基于UDP的应用层协议 TCP认识TCP协议的报头理解封装解包理解可靠性TCP工作模式16位窗口大小6位标志位URGACKPSHRSTSYNFIN 再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序 在TCP/I…...

Android开发之性能测试工具Profiler

前言 性能优化问题&#xff0c;在我们开发时都会遇到&#xff0c;但是在小厂和对自己要求不严格的情况下&#xff0c;我都很少去做性能优化&#xff1b; 在性能优化上&#xff0c;基本大家都是通过自己的开发经验和性能分析工具来发现问题&#xff0c;今天给大家分享一下小编最…...

SpringBoot初级开发--多环境配置的集成(9)

在Springboot的开发中&#xff0c;我们经常要切换各种各样的环境配置&#xff0c;比如现在是开发环境&#xff0c;然后又切换到生产环境&#xff0c;这个时候用多环境配置就是一个明智的选择。接下来我们沿用上一章的工程来配置多环境配置工程。 1.准备多环境配置文件 这里我…...

(数学) 剑指 Offer 39. 数组中出现次数超过一半的数字 ——【Leetcode每日一题】

❓ 剑指 Offer 39. 数组中出现次数超过一半的数字 难度&#xff1a;简单 数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输…...

如何用PS把roughness贴图转换成Smoothness,并放入Metallic贴图的a通道。

1&#xff1a;用PS打开Roughness贴图 2&#xff1a;选择反相&#xff0c;装换成Smoothness贴图 3&#xff1a;新建一个大小相等的psd文件&#xff0c;或者打开Metallic贴图 4&#xff1a;如果没有金属度贴图&#xff0c;就把新建的图画成纯黑色 5&#xff1a;选择图层蒙版->…...

了解XSS攻击与CSRF攻击

什么是XSS攻击 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者在受害者的浏览器上执行恶意脚本。这种攻击通常发生在 web 应用程序中&#xff0c;攻击者通过注入恶意脚本来利用用户对网站的信任&…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...