简单shell脚本的编写

news2024/9/21 22:37:58

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/null

if [ $? -eq 0 ]
then 
	echo "该$1是正常的"
else
	echo "该$1是不正常的"
fi

image-20230826150236438

if…else…嵌套

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

if…else…多级嵌套

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

	if [ $? -eq 0 ]
	then 
		echo "该$1是正常的"
	else
		echo "该$1是不正常的"
	fi

fi

if…elif…else

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

image-20230826153620595

shell脚本循环

for循环

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

在这里插入图片描述

#!/bin/bash
#循环语句
read -p "请输入密码:" PASSWORD

for USERNAME  in  `cat user.txt`
do
	id $USERNAME &>/dev/null
	if [ $? -eq 0 ]
	then 
		echo "该用户$USERNAME 已经存在"
	else
		useradd $USERNAME &>/dev/null
		echo "$PASSWORD"| passwd --stdin $USERNAME &>/dev/null
		echo "该用户$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/null
	if [ $? -eq 0 ]
	then
		echo "该IP:$IP是正常的"
	else
		echo "该IP: $IP是ping不通的"
	fi
done

image-20230826161631043

检测同一局域网,多台主机存活情况
#!/bin/bash
read -p "请输入网络位:" NETWORK

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

for ip in $(seq 100 254)  #seq用于生成数字100~254
do
	ping -c 3 -i 0.2 -w 3 $NETWORK.$ip &>/dev/null  && result=0 || result=1
	if [ $result -eq 0 ];then
		echo "IP地址: $NETWORK.$ip is up !!"
		echo $NETWORK.$ip >> /tmp/up.txt
	else
		echo "IP地址: $NETWORK.$ip is down !!"
		echo $NETWORK.$ip >> /tmp/down.txt
	fi
done

在这里插入图片描述

多线程检测主机存活情况

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

#!/bin/bash
read -p "请输入IP网络位:" ip  
for i in $(seq 1 254) #seq用于生成数字1~254
    do
    { 
           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
do
	read -p "请输入价格:" INT
	let TIMES++                       #自增
	if [ $INT -eq $PRICE ];then
		echo "恭喜你猜对了,价格为$PRICE"
		echo "猜了$TIMES次"
		exit
	elif [ $INT -gt $PRICE ];then
		echo "猜高了"
	else
		echo "太低了"
	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

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

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

相关文章

小研究 - Java虚拟机垃圾收集器的性能分析与调节

垃圾收集器是Java虚拟机(JVM)的核心组成部分之一,对Java虚拟机的性能有非常重要的影响。本文将介绍&#xff2…

加油站ai视觉分析检测预警

加油站ai视觉分析预警系统通过yolov8图像识别和行为分析,加油站ai视觉分析预警算法识别出打电话抽烟、烟火行为、静电释放时间是否合规、灭火器摆放以及人员工服等不符合规定的行为,并发出预警信号以提醒相关人员。YOLOv8 的推理过程和 YOLOv5 几乎一样&…

什么是异步编程?什么是回调地狱(callback hell)以及如何避免它?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 异步编程⭐ 回调地狱(Callback Hell)⭐ 如何避免回调地狱1. 使用Promise2. 使用async/await3. 模块化和分离 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订…

Office软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Office是微软公司开发的一套办公软件套装,包括多个应用程序,如Word、Excel、PowerPoint等,是全球使用最广泛的办公软件之一。以下是Office软件的详细介绍。 1、Office的历史和演变 Office最…

基于和声算法优化的BP神经网络(预测应用) - 附代码

基于和声算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于和声算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.和声优化BP神经网络2.1 BP神经网络参数设置2.2 和声算法应用 4.测试结果:5.Matlab代码 摘要…

go学习-指针 标识符

指针,以及标识符 1.指针 (1).基本介绍 1)基本数据类型,变量存的值,也叫值类型 2)获取变量的地址用&,比如 var num int ,获取num的地址:&num 3)指针类型&…

Java-Lambda表达式

引入 Lambda表达式是在JAVA 8 中引入的,初衷是进一步简化匿名类的语法(匿名类还需要在类中实现函数),并使JAVA走向函数式编程。 语法 (parameters) -> expression 或 (parameters) -> { statements; } 可选类型声明。…

手把手教你安装jdk8

前提 我们口中说的Java8、JDK8、JDK1.8都是一个东西 下载 官方下载链接:(非翻墙可访问) https://www.oracle.com/java/technologies/javase/jdk18-archive-downloads.html 选择如图链接下载:(win11,其他系统版本选择…

【C++】C/C++内存管理-new、delete

文章目录 一、C/C内存分布二、C/C中动态内存管理方式2.1 C语言中动态内存管理方式2.2 C内存管理方式 三、operator new和operator delete函数3.1 operator new和operator delete函数3.2 operator new与operator delete的类专属重载(了解) 四、new和delet…

elementui table 在浏览器分辨率变化的时候界面异常

异常点: 界面显示不完整,表格卡顿,界面已经刷新完成,但是表格的宽度还在一点一点变化,甚至有无线延伸的情况 思路: 1. 使用doLayout 这里官方文档有说明, 所以我的想法是,监听浏览…

Vue2项目练手——通用后台管理项目第一节

Vue2项目练手——通用后台管理项目 知识补充yarn和npm区别npm的缺点:yarn的优点 npm查看镜像和设置镜像 项目介绍项目的技术栈 项目搭建文件目录 创建路由,引入element-uirouter/index.jsmain.jspages/Users.vuepages/Main.vuepages/Home.vuepages/Login…

vue脚手架的安装并创建项目

在之前的练习中我们都是采用引入jquery、vue文件的形式,很多es6的新特性都是无法使用的,因此现在我们采用脚手架进行安装相关的配置。 1、下载node.js,使用其中内置的npm来下载安装包。 直接在官网中下载长期支持版本即可。点击进入node.js官…

建模杂谈系列234 基于图的程序改造

说明 为了进一步提升程序设计与运维的可靠性,我觉得(目前看来)只有依赖图的结构。 提升主要包含如下方面: 1 程序结构的简洁性:节点和边2 程序执行的可视化:交通图(红、黄、绿)3 程序支持的逻辑复杂性。…

Multisim软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Multisim软件是一款电路仿真和设计软件,由美国国家仪器公司(National Instruments)开发。它提供了一个交互式的图形界面,使用户能够轻松地构建和仿真电路。以下是Multisim软件的详…

什么是devos勒索病毒,中招之后该怎么办?勒索病毒解密,数据恢复

Devos勒索病毒是一种比较常见的勒索病毒病毒,它利用加密技术来锁定用户的文件,并要求支付赎金才能解锁。这种病毒已经引起了全球范围内的关注,也给众多的企业主和个人造成了不可估量的损失。 Devos勒索病毒的起源尚不清楚,但它的攻…

无涯教程-分类算法 - 逻辑回归

逻辑回归是一种监督学习分类算法,用于预测目标变量的概率,目标或因变量的性质是二分法,这意味着将只有两种可能的类。 简而言之,因变量本质上是二进制的,其数据编码为1(代表成功/是)或0(代表失败/否)。 在数学上&…

Linux保存退出和不保存退出命令

Vim编辑器 vim 要编辑的文件输入i进入编辑模式保存退出: 按Esc键退出insert模式,然后输入冒号(:),输入wq!可以保存并退出. 不保存退出: 按Esc键退出insert模式,然后输入冒号(:),输入q!可以不保存并退出。…

Autosar存储入门系列03_Autosar中NVM状态机及存储调用逻辑

本文框架 0.前言1. NVM状态机介绍2. NVM读/写基本逻辑2.1 NVM读操作2.2 NVM写操作2.2.1 实时写2.2.2 下电写 2.3 NVM写入注意事项 0.前言 本系列是Autosar存储入门系列,希望能从学习者的角度把存储相关的知识点梳理一遍,这个过程中如果大家觉得有讲得不…

图文并茂:Python Tkinter从入门到高级实战全解析

目录 介绍什么是Tkinter?准备工作第一个Tkinter程序界面布局事件处理补充知识点 文本输入框复选框和单选框列表框弹出对话框 综合案例:待办事项列表总结 介绍 欢迎来到本篇文章,我们将带您深入了解如何在Python中使用Tkinter库来创建图形用…

弯道超车必做好题集锦二(C语言选择题)

前言: 编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,每篇大约10题左右。此为第二篇选择题篇,该系列会不定期更新,后续还会…