一篇文章教会你如何编写一个简单的Shell脚本

文章目录

  • 简单Shell脚本编写
    • 1. 简单脚本编写
    • 2. Shell脚本参数
      • 2.1 Shell脚本参数判断
        • 2.1.1 文件测试语句
        • 2.1.2 逻辑测试语句
        • 2.1.3 整数值测试语句
        • 2.1.4 字符串比较语句
    • 3. Shell流程控制语句
      • 3.1 if 条件测试语句
        • 3.1.1 if...
        • 3.1.2 if...else...
        • 3.1.3 if...elif...else
    • 4. Shell脚本循环
      • 4.1 for循环
        • 4.1.1 批量添加用户
        • 4.1.2 批量删除用户
        • 4.1.3 批量ping IP 地址
        • 4.1.4 检测同一局域网,多台主机存活情况
      • 4.2 while循环
      • 4.3 case条件测试语句

简单Shell脚本编写

Shell脚本概念

Shell 脚本是一种用于自动化执行一系列命令和操作的脚本文件。它使用的是 Shell 解释器(如 Bash、Korn Shell、Zsh 等)来解释和执行其中的命令。Shell 脚本通常用于编写简单的任务和工作流程,可以帮助我们进行系统管理、批量处理、自动化部署等任务。

以.sh后缀名结尾的文件来表示该文件是一个Shell脚本。

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

1. 简单脚本编写

文件内容如下:

image-20230903114629343

编写完脚本后,赋权文件的执行权限

方式一

chmod +x 脚本文件

image-20230903114742333

方式二

bash 脚本文件

image-20230903114659648

2. Shell脚本参数

$0:表示当前脚本的名称。

$*:表示脚本的所有参数。

$#:表示脚本的参数的个数。

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

$? :程序执行完后的结果,返回值0表示执行成功。

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

image-20230903120223123

在执行该Shell脚本文件的时候在后面添加三个参数分别是wuhu1,wuhu2,wuhu3。

执行结果:

image-20230903120259036

注意

  • 双引号会解释变量

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

2.1 Shell脚本参数判断

2.1.1 文件测试语句

  • -d:测试文件是否为目录类型,是目录返回0,不是目录返回非0值。
  • -e:测试文件是否存在。
  • -f:判断是否为一般文件。
  • -r:判断当前用户对该文件是否有读取权限。
  • -w:判断当前用户对该文件是否有写入权限。
  • -x:判断当前用户对该文件是否有执行权限。

判读是否为目录

[ -d /etc/passwd ]
echo $?				# $?返回上一次执行命令的结果

说明:这里的[]中输入的内容前后需要加空格

image-20230903123048335

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

判断当前目录下的wuhu是否为目录

image-20230903123346602

判断是否为文件

[ -f /etc/passwd ]
echo $?				# $?返回上一次执行命令的结果

image-20230903123516341

返回值为0,表示/etc/passwd是文件。

2.1.2 逻辑测试语句

逻辑运算符:

  • &&
  • ||

问题:上面所输入命令十分的繁琐,是否可以使用一条命令来完成上面的操作?

注意:这里是不能使用管道符的,使用管道符发现两次的输出值是不一样的。

image-20230903124043040

可以使用**&&**符号

  • && 必须保证两边都为真,条件才会成立,只要有一个为假条件都不会成立。
  • 只有当左侧命令执行成功时,右侧的命令才会被执行。
[ -f /etc/passwd ] && echo  "/etc/passwd是一个文件"
[ -d wuhu ] && echo  "wuhu是一个目录"

image-20230903124711636

[ $USER = root ] && echo  "该用户是超级管理员用户"

image-20230903125212876

还可以使用**|| **符号

  • || 两边有一个为真就为真,两边都为真也为真,两边为假才为假。
  • 如果左侧命令执行成功(返回值为零),则右侧的命令将不会被执行。
[ $USER = root ] || echo  "该用户是超级管理员用户"		# 表示当前用户不是root输出对应的语句

[ ! $USER = root ] || echo  "该用户是超级管理员用户"	# 表示当前用户是root输出对应的语句

image-20230903125749282

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

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

image-20230903131030219

切换回普通用户,执行该命令

image-20230903131230506

2.1.3 整数值测试语句

整数的比较运输符

  • -eq:是否等于
  • -ne:是否不等于
  • -gt:是否大于
  • -lt:是否小于
  • -le:是否等于或小于
  • -ge:是否等于或大于
[ 9 -eq 8 ]
echo $?

[ 9 -ne 8 ]
echo $?

image-20230903134238723

free:查看内存

image-20230903134650248

现在需要输出free中的Mem这一行

free -m | grep Mem | awk '{print $4}'

image-20230903134734422

定义变量

Freemem=`free -m | grep Mem | awk '{print $4}'`
echo $Freemem			# 输出变量

image-20230903135523368

例如:如果这个值小于1024的时候,会输出内容不足的提示信息。

[ $Freemem -gt 1024 ] && echo "内存不足"
[ $Freemem -lt 1024 ] && echo "内存不足"

image-20230903135912372

2.1.4 字符串比较语句

字符串比较:

  • =:比较字符串内容是否相同。
  • !=:比较字符串内容是否不同。
  • -z:判断字符串内容是否为空,如果为空返回0表示真,如果不为空返回1。
[ -z $String ]
echo $?			# 返回结果为0,因为没有定义过这个变量

[ -z $USER ]
echo $?			# 返回结果为1,因为当前用户不为空

image-20230903140444779

判断当前系统是否支持中文。

[ $LANG = zh_CN.UTF-8 ] && echo "支持中文" || echo "不支持中文"

image-20230903141125055

3. Shell流程控制语句

流程控制语句

  • if
  • then
  • else
  • fi

3.1 if 条件测试语句

3.1.1 if…

基本格式如下:

if 条件测试语句		
then 
	命令序列
fi  结束if语句

例如:判断home目录下是否存在test目录,如果不存在则创建一个。

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

image-20230903142903331

执行结果

image-20230903143054035

3.1.2 if…else…

基本格式如下:

if 条件测试语句		
then 
	命令序列
else 
	命令序列
fi  结束if语句

例如:判断给定的IP是否正常

#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
if [ $? -eq 0 ]
then
        echo "$1该IP是正常的"
else 
        echo "$1该IP无法ping通" 
fi 

说明:&>/dev/null在 Linux/Unix 系统中,“/dev/null” 是一个空设备文件,它可以用于丢弃不需要的输出,相当于一个黑洞。

image-20230903144743570

执行结果

image-20230903144820330

然后就可以完善一下脚本内容

#!/bin/bash
if [ -z $1 ]
then
        echo "作者:小薛"
        echo "该命令检测服务器IP是否正常"
        echo "直接在命令后面加参数IP就可以执行"
else
        ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
        if [ $? -eq 0 ]
        then
                echo "$1该IP是正常的"
        else
                echo "$1该IP无法ping通" 
        fi
fi

说明

  • “-c 3” 选项表示发送 3 个 ICMP 请求消息,并等待每个请求的响应。
  • “-i 0.2” 选项表示设置每个 ICMP 请求的时间间隔为 0.2 秒(即每 200 毫秒发送一个请求)。
  • “-W 3” 选项表示设置等待响应的超时时间为 3 秒。

image-20230903150021885

执行效果

image-20230903150119546

3.1.3 if…elif…else

基本格式如下:

if 条件测试语句1	
then 
	命令序列1
elif 条件测试语句2
then 
	命令序列2
else 
	命令序列3
fi  结束if语句

例如:判断学员考试分数如何

#!/bin/bash
read -p "请输入分数(1-100):" fenshu
if [ $fenshu -ge 85 ] && [ $fenshu -le 100 ];then
        echo "该学生成绩为优秀"
elif [ $fenshu -ge 70 ] && [ $fenshu -le 84 ];then
        echo "该学生成绩为合格"
else
        echo "该学生成绩为不合格"               
fi

说明:

  • “-p” 选项用于在用户输入之前显示一个提示信息。
  • “read” 是一个 Bash 内置命令,用于从标准输入中读取用户输入并将其赋值给一个变量。
  • “fenshu” 是用于存储用户输入值的变量名。

image-20230903152258328

执行效果如下

image-20230903152359934

4. Shell脚本循环

4.1 for循环

基本格式:

for 变量名 in 取值列表
do
	命令序列
done

4.1.1 批量添加用户

创建一个用户名的txt文件

image-20230903153430251

编写Shell脚本

#!/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

说明

  • –stdin:选项告诉passwd命令从标准输入(stdin)读取密码,而不是要求用户手动输入密码。

image-20230903154931261

执行结果如下:

image-20230903155507018

创建前

image-20230903155024371

创建后image-20230903155524208

4.1.2 批量删除用户

编写Shell脚本

#!/bin/bash
for USERNAME in `cat user.txt`
do
        id $USERNAME &> /dev/null
        if [ $? -eq 0 ]
        then
                userdel -r $USERNAME &>/dev/null
                echo "$USERNAME用户已删除"
        else
                echo "$USERNAME用户不存在!"
        fi
done

image-20230903161734398

执行结果

image-20230903161831687

4.1.3 批量ping IP 地址

创建一个IP地址的txt文件

image-20230903162332275

编写Shell脚本

#!/bin/bash
HOSTLIST=$(cat /root/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

说明

  • “$()” 是 Bash 中的命令替换语法,它表示将命令的输出结果作为一个整体嵌入到命令行中。

image-20230903162909854

执行效果如下:

image-20230903163034465

4.1.4 检测同一局域网,多台主机存活情况

方式一

#!/bin/bash
read -p "请输入网络位:" NETWORK
for ((IP=1;IP<=100;IP++))
do
        ping -c 3 -i 0.2 -W 3 $NETWORK.$IP &> /dev/null
        if [ $? -eq 0 ]
        then
                echo "$NETWORK.$IP该IP可以ping通"

        else
                echo "$NETWORK.$IP该IP无法ping通!!!!!!!"
        fi
done

执行结果:

image-20230903165538490

方式二

#!/bin/bash
read -p "请输入网络位:" NETWORK
for IP in `seq 1 254`
do
        ping -c 3 -i 0.2 -W 3 $NETWORK.$IP &> /dev/null
        if [ $? -eq 0 ]
        then
                echo "$NETWORK.$IP该IP可以ping通"

        else
                echo "$NETWORK.$IP该IP无法ping通!!!!!!!"
        fi
done

说明:

  • “seq” 是一个用于生成序列的命令。
  • “1” 是序列的起始值。
  • “254” 是序列的结束值。

执行结果:

image-20230903165524898

4.2 while循环

基本格式如下:

while 条件
do
	命令序列
done

例如:猜测商品价格

编写Shell脚本

#!/bin/bash
echo "该商品价格在0~1000之间,输入价格来猜一猜"
TIMES=0
PRICE=$(expr $RANDOM % 1000 )
while true
do
        read -p "请输入价格:" INT
        let TIMES++
        if [ $INT -eq $PRICE ]
        then    
                echo "恭喜您猜对了该商品的及格,价格为$INT"
                echo "您猜了$TIMES次"
                exit
        elif [ $INT -gt $PRICE ];then
                echo "您所输入的价格高了"
        else
                echo "您所输入的价格低了"
        fi      
done

说明

  • $RANDOM是linux中的内置变量,可以随机生成0-32767之间的整数数字。
  • “expr” 是一个用于执行基本数学运算或字符串操作的命令。

image-20230903171930137

执行结果

image-20230903172221018

4.3 case条件测试语句

基本格式如下:

case 变量值 in 
模式1
	命令序列1
模式2 
	命令序列2
....
	默认命令序列
esac

例如:判断输入的是字母,数字,还是特殊符号

编写Shell脚本

#!/bin/bash
read -p "请输入一个字符:" KEY
case "$KEY" in
        [a-z]|[A-Z])
                echo "这是字母"
                ;;
        [0-9])
                echo "这是数字"
                ;;
        *)
                echo "这是特殊符号"
esac

image-20230903173802938

执行效果如下:

image-20230903173832062

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript -【第二周】

文章来源于网上收集和自己原创&#xff0c;若侵害到您的权利&#xff0c;请您及时联系并删除~~~ 理解什么是流程控制&#xff0c;知道条件控制的种类并掌握其对应的语法规则&#xff0c;具备利用循环编写简易ATM取款机程序能力 运算符语句综合案例 1. 运算符 算术运算符赋值运…

TCP三次握手四次挥手总结

目录 一、两种传输模式&#xff1a; 二、数据方向&#xff1a; 三、端口的作用&#xff1a; 四、端口类型&#xff1a; 五、三次握手&#xff1a; 六、四次断开 常见面试题 TCP&#xff08;Transfer control protocol&#xff09;传输控制协议 一、两种传输模式&#x…

对比Flink、Storm、Spark Streaming 的反压机制

分析&回答 Flink 反压机制 Flink 如何处理反压? Storm 反压机制 Storm反压机制 Storm 在每一个 Bolt 都会有一个监测反压的线程&#xff08;Backpressure Thread&#xff09;&#xff0c;这个线程一但检测到 Bolt 里的接收队列&#xff08;recv queue&#xff09;出现了…

Unity中Shader的消融视觉效果优化smoothstep(min,max,x)

文章目录 前言Unity中Shader的消融视觉效果优化 一、在clip(value) 的 基础上 用 smoothstep(min,max,x)&#xff0c;并且增加一个渐变纹理对消融边缘进行视觉上的优化二、进行优化 前言 Unity中Shader的消融视觉效果优化 一、在clip(value) 的 基础上 用 smoothstep(min,max…

vmware虚拟机(ubuntu)远程开发golang、python环境安装

目录 1. 下载vmware2. 下载ubuntu镜像3. 安装4. 做一些设置4.1 分辨率设置4.2 语言下载4.3 输入法设置4.4 时区设置 5. 直接切换管理员权限6. 网络6.1 看ip6.2 ssh 7. 本地编译器连接远程服务器7.1 创建远程部署的配置7.2 文件同步7.3 远程启动项目 8. ubuntu安装golang环境8.1…

Android RecyclerView 之 吸顶效果

前言 上一篇文章已经实现了列表跟宫格布局的动态切换&#xff0c;这篇文章主要来说通过 CoordinatorLayout 和 AppbarLayout 的配合&#xff0c;以及 NestedScrollView 来实现吸顶效果 。效果如下。 一、CoordinatorLayout 是什么&#xff1f; CoordinatorLayout 是 Androi…

HP惠普星15青春版/惠普小欧笔记本电脑15s-du1008tx原装出厂Win11系统

适用型号&#xff1a;15s-du1007tx、15s-du1008tx、15s-du1009tx、15s-du1010tx、15s-du1011tx、15s-du1012tx、15s-du1013tx 自带所有驱动、出厂主题壁纸LOGO、Office办公软件、惠普电脑管家等预装程序 所需要工具&#xff1a;32G或以上的U盘 文件格式&#xff1a;ISO 文件大…

Linux系统编程5(线程概念详解)

线程同进程一样都是OS中非常重要的部分&#xff0c;线程的应用场景非常的广泛&#xff0c;试想我们使用的视频软件&#xff0c;在网络不是很好的情况下&#xff0c;通常会采取下载的方式&#xff0c;现在你很想立即观看&#xff0c;又想下载&#xff0c;于是你点击了下载并且在…

一款windows的终端神奇,类似mac的iTem2

终于找到了一款windows的终端神奇。类似mac的iTem2 来&#xff0c;上神器 cmder cmder是一款windows的命令行工具&#xff0c;就是我们的linux的终端&#xff0c;用起来和linux的命令一样。所以我们今天要做的是安装并配置cmder ![在这里插入图片描述](https://img-blog.csdni…

ElasticSearch学习5-- 使用RestClient查询文档

1、查询基本步骤 1、创建SearchRequest对象 2、准备Request.source()&#xff0c;也就是DSL。 QueryBuilders来构建查询条件 传入Request.source() 的 query() 方法 3、发送请求&#xff0c;得到结果 4、解析结果&#xff08;参考JSON结果&#xff0c;从外到内…

MindsDB为许多不支持内置机器学习的数据库带来了机器学习功能

选择平台的首要原则是“靠近数据”,让代码靠近数据是保持低延迟的必要条件。 机器学习,特别是深度学习往往会多次遍历所有数据(遍历一次被称为一个epoch)。对于非常大的数据集来说,理想的情况是在存储数据的地方建立模型,这样就不需要大量的数据传输。目前已经有部分数据…

数据结构(Java实现)-反射、枚举以及lambda表达式

Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;既然能拿到那么&#xff0c;我们就可以修改部分…

微信仿H5支付

仿H5支付是指一种模拟原生H5支付流程的非官方支付方式。这种支付方式通常是由第三方支付服务提供商开发和维护的&#xff0c;目的是为了绕过官方支付渠道的限制&#xff0c;如费率、审核等问题。然而&#xff0c;由于仿H5支付并非官方授权和认可的支付方式&#xff0c;其安全性…

GitHub打不开解决方法——授人以渔

打不开GitHub的原因之一&#xff0c;DNS地址解析到了无法访问的ip。&#xff08;为什么无法访问&#xff1f;&#xff09; 1、打开GitHub看是哪个域名无法访问&#xff0c;F12一下 2、DNS解析看对应的域名目前哪个IP可以访问 DNS解析的网址&#xff1a; &#xff08;1&#x…

thinkphp6 入门(3)--获取GET、POST请求的参数值

一、Request对象 thinkphp提供了Request对象&#xff0c;其可以 支持对全局输入变量的检测、获取和安全过滤 支持获取包括$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量&#xff0c;以及文件上传信息 具体参考&#xff1a;https://www.kanclou…

Canvas实现3D效果

3D 球 效果图 代码 var canvas document.getElementById("cas"),ctx canvas.getContext("2d"),vpx canvas.width / 2,vpy canvas.height / 2,Radius 150,balls [],angleX Math.PI / 1000,angleY Math.PI / 1000,factor 0.0001 //旋转因子var An…

1.3 Metasploit 生成SSL加密载荷

在本节中&#xff0c;我们将介绍如何通过使用Metasploit生成加密载荷&#xff0c;以隐藏网络特征。前一章节我们已经通过Metasploit生成了一段明文的ShellCode&#xff0c;但明文的网络传输存在安全隐患&#xff0c;因此本节将介绍如何通过生成SSL证书来加密ShellCode&#xff…

位运算的使用

背景 ​ 工作中依赖外部团队使用了位运算对数据进行了转化和存储。 ​ 今天整理下关于位运算相关的内容。 位运算基础 现代计算机中所有的数据以二进制的形式存储在设备中。即 0、1 两种状态&#xff0c;计算机对二进制数据进行的运算(、-、*、/)都是叫位运算&#xff0c;即…

Arcface部署应用实战

1、概述 人脸识别的一个比较常用的网络arcface&#xff0c;依赖于其特殊设计的loss函数&#xff0c;使得模型在训练的时候能够实现类间距离增大&#xff0c;类内的距离不断减小&#xff0c;最终使得所训练的backbone能够获取鉴别性很高的特征&#xff0c;便于人脸识别。 本文…

leetcode 2483. Minimum Penalty for a Shop(商店的最少代价)

字符串customers只包含’Y’和’N’两种字母, 表示 i 时刻商店是否有客人来。 如果商店在 i 时刻处于开门状态&#xff0c;Y’的代价是0&#xff0c;N’的代价是1.&#xff08;开门了却没有客人就算损失&#xff09;。 反之&#xff0c;在 i 时刻处于关门状态&#xff0c;N’的…