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

一篇文章教会你如何编写一个简单的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 ]
thenmkdir -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 ]
thenecho "$1该IP是正常的"
else echo "$1该IP无法ping通" 
fi 

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

image-20230903144743570

执行结果

image-20230903144820330

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

#!/bin/bash
if [ -z $1 ]
thenecho "作者:小薛"echo "该命令检测服务器IP是否正常"echo "直接在命令后面加参数IP就可以执行"
elseping -c 3 -i 0.2 -W 3 $1 &>/dev/nullif [ $? -eq 0 ]thenecho "$1该IP是正常的"elseecho "$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 ];thenecho "该学生成绩为优秀"
elif [ $fenshu -ge 70 ] && [ $fenshu -le 84 ];thenecho "该学生成绩为合格"
elseecho "该学生成绩为不合格"               
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/nullif [ $? -eq 0 ]then    echo "$USERNAME用户已存在!"else    useradd $USERNAME &> /dev/nullecho "$PASSWORD" | passwd --stdin $USERNAME &> /dev/nullecho "$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`
doid $USERNAME &> /dev/nullif [ $? -eq 0 ]thenuserdel -r $USERNAME &>/dev/nullecho "$USERNAME用户已删除"elseecho "$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
doping -c 3 -i 0.2 -W 3 $IP &>/dev/nullif [ $? -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++))
doping -c 3 -i 0.2 -W 3 $NETWORK.$IP &> /dev/nullif [ $? -eq 0 ]thenecho "$NETWORK.$IP该IP可以ping通"elseecho "$NETWORK.$IP该IP无法ping通!!!!!!!"fi
done

执行结果:

image-20230903165538490

方式二

#!/bin/bash
read -p "请输入网络位:" NETWORK
for IP in `seq 1 254`
doping -c 3 -i 0.2 -W 3 $NETWORK.$IP &> /dev/nullif [ $? -eq 0 ]thenecho "$NETWORK.$IP该IP可以ping通"elseecho "$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
doread -p "请输入价格:" INTlet TIMES++if [ $INT -eq $PRICE ]then    echo "恭喜您猜对了该商品的及格,价格为$INT"echo "您猜了$TIMES次"exitelif [ $INT -gt $PRICE ];thenecho "您所输入的价格高了"elseecho "您所输入的价格低了"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

相关文章:

一篇文章教会你如何编写一个简单的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脚…...

SSM框架-spring

SSM框架参考 spring...

聊一下C#中的lock

在C#中&#xff0c;lock 是用于实现多线程同步的关键字。它用于创建一个互斥锁&#xff08;Mutex&#xff09;&#xff0c;以确保在同一时间只有一个线程可以访问被锁定的代码块。这在多线程环境中是很重要的&#xff0c;因为如果多个线程同时访问共享资源&#xff0c;可能会导…...

学会Mybatis框架:让你的开发事半功倍【五.Mybatis关系映射】

目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 导语 一、一对一的关系映射 1.表结构 2.resultMap配置 3.测试关系映射 二、一对多的关系映射 1.表结构 2.resultMap配置 3.测试关系映射 三、多对多的关系映射 1.表结构…...

《TCP/IP网络编程》阅读笔记--基于Windows实现Hello Word服务器端和客户端

目录 1--Hello Word服务器端 2--客户端 3--编译运行 3-1--编译服务器端 3-2--编译客户端 3-3--运行 1--Hello Word服务器端 // gcc hello_server_win.c -o hello_server_win -lwsock32 // hello_server_win 9190 #include <stdio.h> #include <stdlib.h> #i…...

Java-Optional类

概述 Optional是JAVA 8引入的一个类&#xff0c;用于处理可能为null的值。 利用Optional可以减少代码中if-else的判断逻辑&#xff0c;增加代码的可读性。且可以减少空指针异常的发生&#xff0c;增加代码的安全性。 常用的方法 示例 代码 public class OptionalTest {pub…...

AJAX学习笔记1发送Get请求

传统请求有哪些方式,及缺点 传统请求有哪些? 1.直接在浏览器地址栏上输入URL. 2.点击超连接. <a href"/上下文/请求地址">超链接请求</a> ---->相对路径 <a href"http://www.baidu.com">超链接请求</a> ---->绝对路…...

Elasticsearch 高级搜索技巧和最佳实践

Elasticsearch 高级搜索技巧和最佳实践 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;它支持实时地存储、搜索和分析大规模数据。它被广泛应用于各行各业&#xff0c;用于构建高性能的搜索引擎、日志分析系统、电子商务推荐系统等。 本文将介…...

解决 .csv 文件上传到 pgsql 的字符报错问题

目录 背景问题解决办法 背景 上传 .csv 文件进行数据导入到 pg 时&#xff0c;报错显示如下&#xff1a; ods.tbl_inp_fee_detail.csv数据上传失败 报错信息:org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 Where: C…...

linux自动挂载并添加用户权限

目录 写在前面自动挂载完 写在前面 1、本文内容 linux挂载文件后&#xff0c;没有文件权限&#xff0c;使用uid和gid指定所需的所有者和所属组 2、平台/环境 linux 3、转载请注明出处&#xff1a; https://blog.csdn.net/qq_41102371/article/details/132539384 自动挂载 开…...

【C++】学习STL中的stack和queue

❤️前言 今天这篇博客的内容主要关于STL中的stack、queue和priority_queue三种容器。 正文 stack和queue的使用方式非常简单&#xff0c;我们只要根据之前学习数据结构的经验和文档介绍就可以轻松上手。于是我们直接开始对它们的模拟实现。 stack和queue的模拟实现 stack和q…...

Java捕获异常

在Java中&#xff0c;凡是可能抛出异常的语句&#xff0c;都可以用try ... catch捕获。把可能发生异常的语句放在try { ... }中&#xff0c;然后使用catch捕获对应的Exception及其子类。 使用try ... catch ... finally时&#xff1a; 多个catch语句的匹配顺序非常重要&#xf…...

【LLM】快速开始 LangChain

theme: orange LangChain是一个软件开发工具包&#xff0c;它通过将组件链接在一起并公开简单统一的API&#xff0c;简化了大型语言模型和应用程序的集成。本篇文章将会简要介绍&#xff0c;让各位开发者对其有一个整体的认识。 前言 如果你是一名软件开发人员&#xff0c;努力…...

Unity中立体声平移的应用

实现的效果 若从左声道开始&#xff0c;播放效果逐渐从左声道过渡到右声道&#xff0c;再从右声道过渡到左声道&#xff0c;具体效果请戴上耳机播放下列视频。 StereoPanning 代码实现 public class AudioInfo {[HideInInspector] public float[] StereoTranslationValues;//立…...

jupyter常用的方法以及快捷键

选中状态 蓝色 按enter 进入编辑状态 编辑状态 绿色 按Esc 进入选中状态 Code模式运行是运行代码 Markdown模式运行是进入预览状态 - - - 是文本格式的一种精简的语法形式 Raw NBConvert 是默认文本状态 - - - 输入什么样 展示什么样 Y - - - 切换code模式 M - - - 切换Markdo…...

SQL Server 操作JSON数据库列

Sql Server 从 2016 开始支持了一些 json 操作&#xff0c;但在SqlServer中Json还是被存储为字符串&#xff0c;如下&#xff1a; use [tempdb]declare JSON nvarchar(max) set JSONN{"id": "WakefieldFamily","parents": [{ "familyName&q…...

拼多多开放平台的API接口可以获取拼多多电商数据。以下是API接口流程

使用拼多多开放平台的API接口可以获取拼多多电商数据。以下是一般的API接口流程&#xff1a; 1. 注册开发者账号&#xff1a;首先&#xff0c;您需要在拼多多开放平台注册一个开发者账号。通过开发者账号&#xff0c;您可以获得API密钥和其他必要的信息。 2. 鉴权与认证&…...

使用Docker安装和部署kkFileView

&#x1f388;1 参考文档 kkFileView官方文档 &#x1f680;2 安装kkFileView 拉取Redis镜像。 docker pull keking/kkfileview启动docker容器。 docker run -it -d -p 8012:8012 keking/kkfileview --restart always解释&#xff1a; docker run redis # 从kkfileview镜像运行…...

胆囊结石3mm严重吗(解析胆囊结石的危害和处理方法)

胆囊结石是指胆囊内形成的固体结晶&#xff0c;大小不一&#xff0c;主要由胆固醇、胆汁色素和钙盐等物质组成。胆囊结石是一种比较常见的疾病&#xff0c;据统计&#xff0c;我国胆囊结石的患病率约为5%~10%左右。那么&#xff0c;胆囊结石3mm严重吗?下面就来一起了解一下。 …...

全新UI站长在线工具箱系统源码带后台开源版

该系统的全开源版本可供下载&#xff0c;并且支持暗黑模式。 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API&#xff0c;同时还自带免费API接口&#xff0c; 是一个多功能性工具程序&#xff0c;支持后台管理、上传插件、添加增减删功能。 环…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...