一篇文章教会你如何编写一个简单的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. 简单脚本编写
文件内容如下:
编写完脚本后,赋权文件的执行权限
方式一:
chmod +x 脚本文件
方式二:
bash 脚本文件
2. Shell脚本参数
$0:表示当前脚本的名称。
$*:表示脚本的所有参数。
$#:表示脚本的参数的个数。
$n:表示脚本的第n个参数,n=1,2,3…
$? :程序执行完后的结果,返回值0表示执行成功。
#!/bin/bash
echo "当前脚本名称$0"
echo "总共有$#个参数,分别是$*。"
echo "第一个参数为$1,第三个参数为$3"
在执行该Shell脚本文件的时候在后面添加三个参数分别是wuhu1,wuhu2,wuhu3。
执行结果:
注意:
-
双引号会解释变量
-
单引号会把变量当成字符串表示
2.1 Shell脚本参数判断
2.1.1 文件测试语句
- -d:测试文件是否为目录类型,是目录返回0,不是目录返回非0值。
- -e:测试文件是否存在。
- -f:判断是否为一般文件。
- -r:判断当前用户对该文件是否有读取权限。
- -w:判断当前用户对该文件是否有写入权限。
- -x:判断当前用户对该文件是否有执行权限。
判读是否为目录
[ -d /etc/passwd ]
echo $? # $?返回上一次执行命令的结果
说明:这里的[]
中输入的内容前后需要加空格
返回值为1,表示/etc/passwd不是目录。
判断当前目录下的wuhu是否为目录
判断是否为文件
[ -f /etc/passwd ]
echo $? # $?返回上一次执行命令的结果
返回值为0,表示/etc/passwd是文件。
2.1.2 逻辑测试语句
逻辑运算符:
- &&
- ||
- !
问题:上面所输入命令十分的繁琐,是否可以使用一条命令来完成上面的操作?
注意:这里是不能使用管道符的,使用管道符发现两次的输出值是不一样的。
可以使用**&&**符号
- && 必须保证两边都为真,条件才会成立,只要有一个为假条件都不会成立。
- 只有当左侧命令执行成功时,右侧的命令才会被执行。
[ -f /etc/passwd ] && echo "/etc/passwd是一个文件"
[ -d wuhu ] && echo "wuhu是一个目录"
[ $USER = root ] && echo "该用户是超级管理员用户"
还可以使用**|| **符号
- || 两边有一个为真就为真,两边都为真也为真,两边为假才为假。
- 如果左侧命令执行成功(返回值为零),则右侧的命令将不会被执行。
[ $USER = root ] || echo "该用户是超级管理员用户" # 表示当前用户不是root输出对应的语句[ ! $USER = root ] || echo "该用户是超级管理员用户" # 表示当前用户是root输出对应的语句
例如:要求普通用户输出user,管理员用户输出superuser
[ ! $USER = root ] && echo "user" || echo "superuser"
切换回普通用户,执行该命令
2.1.3 整数值测试语句
整数的比较运输符
- -eq:是否等于
- -ne:是否不等于
- -gt:是否大于
- -lt:是否小于
- -le:是否等于或小于
- -ge:是否等于或大于
[ 9 -eq 8 ]
echo $?[ 9 -ne 8 ]
echo $?
free:查看内存
现在需要输出free中的Mem这一行
free -m | grep Mem | awk '{print $4}'
定义变量
Freemem=`free -m | grep Mem | awk '{print $4}'`
echo $Freemem # 输出变量
例如:如果这个值小于1024的时候,会输出内容不足的提示信息。
[ $Freemem -gt 1024 ] && echo "内存不足"
[ $Freemem -lt 1024 ] && echo "内存不足"
2.1.4 字符串比较语句
字符串比较:
- =:比较字符串内容是否相同。
- !=:比较字符串内容是否不同。
- -z:判断字符串内容是否为空,如果为空返回0表示真,如果不为空返回1。
[ -z $String ]
echo $? # 返回结果为0,因为没有定义过这个变量[ -z $USER ]
echo $? # 返回结果为1,因为当前用户不为空
判断当前系统是否支持中文。
[ $LANG = zh_CN.UTF-8 ] && echo "支持中文" || echo "不支持中文"
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
执行结果
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” 是一个空设备文件,它可以用于丢弃不需要的输出,相当于一个黑洞。
执行结果
然后就可以完善一下脚本内容
#!/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 秒。
执行效果
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” 是用于存储用户输入值的变量名。
执行效果如下
4. Shell脚本循环
4.1 for循环
基本格式:
for 变量名 in 取值列表
do命令序列
done
4.1.1 批量添加用户
创建一个用户名的txt文件
编写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)读取密码,而不是要求用户手动输入密码。
执行结果如下:
创建前
创建后
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
执行结果
4.1.3 批量ping IP 地址
创建一个IP地址的txt文件
编写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 中的命令替换语法,它表示将命令的输出结果作为一个整体嵌入到命令行中。
执行效果如下:
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
执行结果:
方式二:
#!/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” 是序列的结束值。
执行结果:
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” 是一个用于执行基本数学运算或字符串操作的命令。
执行结果
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
执行效果如下:
相关文章:

一篇文章教会你如何编写一个简单的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#中,lock 是用于实现多线程同步的关键字。它用于创建一个互斥锁(Mutex),以确保在同一时间只有一个线程可以访问被锁定的代码块。这在多线程环境中是很重要的,因为如果多个线程同时访问共享资源,可能会导…...

学会Mybatis框架:让你的开发事半功倍【五.Mybatis关系映射】
目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 导语 一、一对一的关系映射 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引入的一个类,用于处理可能为null的值。 利用Optional可以减少代码中if-else的判断逻辑,增加代码的可读性。且可以减少空指针异常的发生,增加代码的安全性。 常用的方法 示例 代码 public class OptionalTest {pub…...

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

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

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

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

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

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

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

Unity中立体声平移的应用
实现的效果 若从左声道开始,播放效果逐渐从左声道过渡到右声道,再从右声道过渡到左声道,具体效果请戴上耳机播放下列视频。 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 操作,但在SqlServer中Json还是被存储为字符串,如下: use [tempdb]declare JSON nvarchar(max) set JSONN{"id": "WakefieldFamily","parents": [{ "familyName&q…...

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

使用Docker安装和部署kkFileView
🎈1 参考文档 kkFileView官方文档 🚀2 安装kkFileView 拉取Redis镜像。 docker pull keking/kkfileview启动docker容器。 docker run -it -d -p 8012:8012 keking/kkfileview --restart always解释: docker run redis # 从kkfileview镜像运行…...

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

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

maven的依赖下载不下来的几种解决方法
前言 每次部署测试环境,从代码库拉取代码,都会出现缺少包的情况。然后找开发一通调试,到处拷包。 方案一:pom文件注释/取消注释 注释掉pom.xml里的报红色的依赖(同时可以把本地maven库repo里对应的包删除)&…...

CAR-T商品化的第一步
1、CAR-T细胞的体外扩增能力 CAR-T细胞疗法需要先从患者体内获得T淋巴细胞,然后通过体外转基因技术 transduce CAR靶向结构域。这一过程需要在细胞培养体系中得到充分的扩增,以获得足够的治疗CAR-T细胞数量。因此,CAR-T细胞的体外扩增能力直…...

yolov2相较于yolov1的改进
目录 前言 BN层取代了Dropout 使用了高分辨率分类器 K-means选定先验框的尺寸 网络结构—darknet19 细粒度的特征 前言 yolov2是在yolov1的基础上进行改进的,主要解决了yolov1定位不准确以及检测重叠的物体极差的情况,总的来说,它有以下…...

如何在Spring Boot应用中使用Nacos实现动态更新数据源
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

代码随想录算法训练营day1~18总结
时间、空间复杂度,解题过程中运用的函数补充说明 数组 day1: http://t.csdn.cn/dBSgY day2: http://t.csdn.cn/JTDvH 数组总结 链表 day3:http://t.csdn.cn/mJx9V day4:http://t.csdn.cn/qiGqz 链表总结 哈希表 day6:…...

【炼气境】HashMap原理以及如何使用
系列文章目录 文章目录 系列文章目录前言1、数据结构2、工作原理3、当两个对象的 hashCode 相同会发生什么?4、你知道 hash 的实现吗?为什么要这样实现?5、为什么要用异或运算符?6、HashMap 的 table 的容量如何确定?l…...

QT基础教程之七Qt消息机制和事件
QT基础教程之七Qt消息机制和事件 事件 事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,…...

Python入门自学进阶-Web框架——40、redis、rabbitmq、git——3
git,一个分布式的版本管理工具。主要用处:版本管理、协作开发。 常见版本管理工具: VSS —— Visual Source Safe CVS —— Concurrent Versions System SVN —— CollabNet Subversion GIT GIT安装:下载安装文件:…...

skywalking agent监控java服务
一、前言 skywalking agent可以监控的服务类型有多种,python、go、java、nodejs服务等都可以监控,现在通过java服务来演示skywalking agent的使用,并且是使用容器的方式实现 二、部署skywalking agent监控 需要注意,skywalking…...

LARGE LANGUAGE MODEL AS AUTONOMOUS DECISION MAKER
本文是LLM系列文章,针对《LARGE LANGUAGE MODEL AS AUTONOMOUS DECISION MAKER》的翻译。 作为自主决策者的大语言模型 摘要1 引言2 前言3 任务形式化4 方法5 实验6 相关工作7 结论 摘要 尽管大型语言模型(LLM)表现出令人印象深刻的语言理解…...