Linux Shell脚本讲解
目录
Shell脚本基础
Shell脚本组成
Shell脚本工作方式
编写简单的Shell脚本
Shell脚本参数
Shell脚本接收参数
Shell脚本判断用户参数
文件测试与逻辑测试语句
整数测试比较语句
字符串比较语句
Shell流程控制
if条件判断语句
单分支
双分支
多分支
for循环语句(根据范围进行循环)
while循环语句(根据条件进行循环)
case条件测试语句(判断语句)
Shell脚本编写计划任务
一次性计划任务
长期性计划任务
Shell脚本基础
Shell脚本组成
Shell脚本由三部分组成
脚本声明、脚本注释、脚本命令
脚本声明
告诉系统我们是使用哪个解释器来执行Shell脚本
现在基本上都是使用/bin/bash解释器
所以一般脚本声明为 #!/bin/bash
脚本注释
写一些说明信息(包括功能介绍、参数介绍等,可有可无)
此注释不会被系统读,只是让用户看的
#开头
脚本命令
通过这些命令来完成某些事情
Shell脚本工作方式
交互式 用户每输入一条命令就立即执行
批处理 用户事先编写一个完整的Shell脚本,Shell就会一次性执行脚本中的命令
编写简单的Shell脚本
简单的Shell脚本可以理解为就是命令的堆积,能够实现一些固定的功能
没有调节测试语句、循环语句赋予的灵活的调节判断功能
创建Shell脚本
shell脚本可以没有后缀,但是为了区分,可以给个后缀.sh
vim 123.sh 创建/编辑 名称为123的Shell脚本
编写简单的Shell脚本
#!/bin/bash 编写脚本声明
#this is test 编写脚本注释
pwd 编写脚本显示当前位置
grep /bin/bash /etc/passwd | wc -l 编写脚本显示可登录服务器的用户数量
执行Shell脚本
. 123.sh 路径+Shell脚本名,直接执行 Shell脚本(用户需要执行权限,可以更改权限)
. 表示当前路径
bash 123.sh bash shell脚本名称,通过bash命令调用Shell脚本
Shell脚本参数
Shell脚本接收参数
为了让Shell脚本程序更好地满足用户的一些实时需求
需要让脚本程序能够像之前执行命令那样接收用户的参数
此时就需要向Shell脚本传递参数
Shell脚本如何接收用户参数
在Shell脚本通过定义$N来接受用户输入的参数
$1、接收第一个位置参数
$2 接收第二个位置参数
Shell脚本的特殊参数
$0 脚本的名称
$# 统计接收参数的总数(用户输入的所有参数的总数)
$* 接收到的所有参数有哪些(用户输入的所有参数)
编写Shell脚本接收用户参数
编写Shell脚本
#!/bin/bash
#this is test
echo $1,$2,$4 接收用户输入的第1、2、4个参数并输出
echo "neame is $0" 显示脚本的名称
echo "count receive parameter number is $#" 统计用户输入的参数总数
echo "all receive parameter is $*" 用户输入的参数具体有哪些
执行脚本并输入参数
bash 123.sh 1 2 3 4 5
Shell脚本判断用户参数
判断语句格式:[ 条件表达式 ](注意条件表达式前后都有空格)
由于变量是没有定义类型的
在Shell中需要对输入的参数、变量进行类型判断(需要手动去完成,通过创建条件表达式完成)
根据测试对象的不同,条件表达式可分为以下4种
文件测试语句、逻辑测试语句(查看判断结果)、整数值比较语句、字符串比较语句
文件测试与逻辑测试语句
作用
判断文件是否存在
判断是什么类型的文件(一般文件、目录文件、设备(块)文件、链接文件、管道文件)
判断文件权限(写入、读取、执行权限)
具体操作符
[ -e 文件名称 ] 判断文件是否存在
[ -f 文件名称 ] 判断文件是否为一般文件(-d 目录文件、-l 链接文件、-s 套接字文件、-b块设备文件、-c 字符设备文件、-p 管道文件)
[ -w 文件名称 ] 判断文件的权限是否可以写入(-r是否可以读取、-x是否可以执行)
进行判断后如何得到判断结果
方一 通过echo$? 来得到判断结果
echo $? 输出上一个返回值的结果(可以用此命令来查看判断文件的结果)
如果结果为0,表示上一个命令执行成功;非零表示上一个命令执行失败
此方法要使用两条命令查看,麻烦
方二 通过逻辑测试语句(逻辑操作操作符)来查看判断结果
与(&&) 前面的语句如果执行成功,执行后面的语句
或(||) 前面的语句如果执行失败,执行后面的语句
非(!) 取反值(! 代表取反值;!=代表不等于)
[ -e 文件名 ] && 命令 如果文件存在,就执行命令
[ ! -e 文件名 ] 将文件是否存在的结果取反
编写文件判断Shell脚本
#!/bin/bash
#this is test
[ -e /dev/fastab ] 判断/dec/fstab文件是否存在
echo "this file $?" 输出上一个判断文件执行结果
[ $USER=root ] && echo " be" || “no be” 如果当前用户为root,输出be,否则输出no be
整数测试比较语句
对于数字比较所使用的操作符不能用>、<,因为>、<是重定向符
数据比较通过操作符 -eq、-gt、-lt等来执行
[ 1 -eq 2 ] 判断1是否等于2
[ 1 -gt 2 ] 判断1是否大于2
[ 1 -lt 2 ] 判断1是否小于2
-ne 是否不等于
-le 是否等于或小于
-ge 是否大于或等于
编写整数比较语句
#!/bin/bash
#this is test
FREE=`free -m | grep Mem | awk '{print $4}'` 将空闲内存的值赋值给变量FREE
[ $FREE -le 1024 ] && echo "$FREE is good" || echo "$FREE is bad"
比较空闲内存大小,小于等于1024为good,否则为bad
字符串比较语句
-z 判断字符串内容是否为空
!= 比较字符串内容是否不同
= 比较字符串内容是否相同
编写字符串比较语句
#!/bin/bash
#this is test
[ -z $USER=root ] 判断当前用户是否为是root
echo $?
[ ! -z $USER=root ] 判断当前用户是否不是root
echo $?
Shell流程控制
if条件判断语句
if 条件测试语句(if开头,fi结尾),可以分为单分支、双分支、多分支
单分支
语句格式
if 测试条件
then 条件通过所执行的命令(可以多条,如果在同一行用 ; 分隔多条命令)
fi
编写单分支脚本
#!/bin/bash
if [ ! -e /etc/admin ] 判断/etc/admin是不是不存在
then mkdir -p /etc/admin 如果不存在,则创建/etc/admin
echo `[ -e /etc/admin ] && echo 'create success'` 然后再判断/etc/admin是否创建成功
fi
双分支
语句格式
if 测试条件
then 条件通过所执行的操作
else 条件没有通过执行的操作
fi
编写双分支脚本
#!/bin/bash
if [ ! -e /etc/admin ] 判断/etc/admin是不是不存在
then mkdir -p /etc/admin ; echo `[ -e /etc/admin ] && echo 'create success'` 如果文件不存在,创建文件并判断文件是否创建成功
else echo 'this file is be' 如果文件存在,则输出this file is be
fi
多分支
语句格式
if 测试条件1
then 条件1通过后执行的操作
elif 测试条件2
then 条件2通过后执行的操作
else
条件1和条件2都不满足的操作
fi
多分支编程
#!/bin/bash
read -p "input number: " NUMBER 将用户输入的数据赋值到变量NMBER
if [ $NUMBER -ge 80 ] && [ $NUMBER -le 100 ];then 判断值是否≥80,≤100
echo 'good' 输出
elif [ $NUMBER -ge 60 ] && [ $NUMBER -le 79 ];then 判断值是否≥60,≤79
echo 'pass'
elif [ $NUMBER -ge 0 ] && [ $NUMBER -le 59 ] ;then 判断值是否≥0,≤59
echo 'fail'
else 以上条件都不满足
echo 'again input'
read -p "Enter:" GRADE
read 变量 读取单行数据内容,并将此内容赋值给变量GRADE
-p 提示用户输入信息
注意:字母与数字不能够作比较,小数也不可以和整数比较
for循环语句(根据范围进行循环)
语句格式
for 变量名 in 取值列表
do
操作命令
done
编写for循环语句
#!/bin/bash
read -p "input passwd: " PASSWD 输入密码并赋值到变量PASSWD
for USER1 in `cat user.txt` 从文件中提取数据赋值到变量USER1
do
id $USER1 &> /dev/null 查看用户信息并将回显的内容送到黑洞
if [ $? -eq 0 ];then 如果用户存在,即上个命令执行成功,输出用户is be
echo "$USER1 is be"
else 如果用户不存在,上个命令执行就不成功,执行以下命令
useradd $USER1 &> /dev/null
echo $PASSWD | passwd --stdin $USER1 &> /dev/null
fi
done
while循环语句(根据条件进行循环)
只要条件为真,则一直循环,只要条件不成立,才会停止
语句格式
while 条件
do 执行操作
done
while true 一直循环下去,直到遇到强制退出符
case条件测试语句(判断语句)
语句格式
case 变量值 in 范围值1)
输出命令1
;;
范围值2)
输出命令2
;;
*)
默认命令
esac
注意
case 命令只有右边的小括号,没有左边的小括号
case语句中的 | 指的是 逻辑或 的意思
* 匹配的是空值或者无穷多的信息
前面的范围值后面要加;; 最后的范围值不需要加;;
编写case判断语句
#!/bin/bash
read -p "input :" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "$KEY this is letter"
;;
[0-9])
echo "$KEY this is number"
;;
*)
echo "$KEY this is ohter characters"
esac
Shell脚本编写计划任务
管理员可以编辑自己的和普通用户的计划任务
普通用户只可以编辑自己的计划任务
计划任务根据执行方式分为一次性计划任务、长期性计划任务
一次性计划任务
此计划只执行一次,执行后或就不会再执行了
通过at命令来实现
at 时间
输入想要执行的任务
ctrl + d 保存并退出
ctrl + c 直接退出
at -c 任务编码 查看计划任务的工作
at -l 显示待执行的任务列表(显示任务编号 任务执行时间 发起用户)
at -d 任务编码 删除指定待执行任务
at -m 任务执行后给用户发邮件
at now +5 MINUTE 创建任务,5分钟后执行(HOUR时、DAY天、MONTH月)
atrm命令
atrm 任务编码 删除计划任务
长期性计划任务
长期性计划任务,周期性的根据时间规则执行任务
时间规则格式-此格式是固定的,如果不配置参数,需要使用*来做占位
分、时、日、月、星期 、命令
其中命令的使用方式必须是 命令路径方式(可以通过which来进行查找)
即ls -l 需要写为 /usr/bin/ls -l
例子:
10 21 12 * * 命令 每月的12号21点10分执行任务
* * * */2 * 命令 当下开始每间隔两个月
* * * 1,2,3 * 命令 1、2、3个月
* * * 1-5 * 命令 1到5个月
一般星期和日期只选择一个进行书写
crontab命令
长期计划任务通过Linux的crond服务来实现
而crond服务需要通过crontab命令来进行配置
即:crond是服务名称、crontab是配置工具名称
需要开启crond服务
systemctl enable crond 开启crond服务
systemctl restart crond 重新启动crond服务
如果配置了计划之后没有生效,可以重新启动下服务
命令格式
crontab -e 创建/编辑计划任务
crontab -l 指定计划任务
crontab -r 删除计划任务
也可以直接通过命令路径的方式编辑计划
vim /etc/crontab 来创建/编辑计划任务
不过不推荐使用vim进行编辑,虽然有注释,但是没有纠错功能
使用crontab有纠错功能,不过crontab 默认也是通过调用vim编译器来实现的
注意事项
当普通用户使用at和crontab不起作用时,不一定是计划任务的原因
还可能是用户权限的问题
相关文章:
Linux Shell脚本讲解
目录 Shell脚本基础 Shell脚本组成 Shell脚本工作方式 编写简单的Shell脚本 Shell脚本参数 Shell脚本接收参数 Shell脚本判断用户参数 文件测试与逻辑测试语句 整数测试比较语句 字符串比较语句 Shell流程控制 if条件判断语句 单分支 双分支 多分支 for循环语句…...
Linux:用户空间非法指针coredump简析
1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 背景 本文分析基于 ARM32 架构,Linux-4.14 内核代码。 3. 问题分析 3.1 测试范例 void main(void) {*(int *)0 8; }运行程序会 …...
带你玩转Jetson之Deepstream简明教程(四)DeepstreamApp如何使用以及用于工程验证。
1.DeepstreamApp是什么? 如果你安装完毕deepstream整体框架,会在你的系统执行目录内有可执行文件,文件名字是deepstream-app。这是一个可执行脚本文件,通过deepstream框架中的代码在安装的时候编译后install到系统根目录内。 此脚…...
快速搭建个人在线书库,随时随地畅享阅读!
前边我们利用NAS部署了个人的导航页、小说站、云笔记,今天,我们再看看怎么部署一个个人的在线书库。 相信很多朋友都在自己的电脑中收藏了大量的PDF、MOBI等格式的电子书籍,但是一旦换了一台设备,要么是无法翻阅,要么…...
电子纸墨水屏的现实应用场景
电子纸挺好个东西,大家都把注意力集中在商超场景 其实还有更多有趣的场景方案可用,价值也不小,比如: 一、仓库场景 通过亮灯拣选,提高仓库作业效率 二、仓库循环使用标签 做NFC类发卡式应用,替代传统纸…...
常量const、引用、指针的大杂烩
文章目录1 普通引用1.1 对普通值的普通引用1.2 对常量值的普通引用1.3 对普通指针的普通引用1.4 对常量指针的普通引用1.5 对指针常量的普通引用1.6 对指向常量的指针常量的普通引用2 常量引用2.1 对普通值的常量引用2.2 对常量值的常量引用2.3 对普通指针的常量引用2.4 对常量…...
宝塔搭建实战php开源likeadmin通用管理移动端uniapp源码(四)
大家好啊,我是测评君,欢迎来到web测评。 上一期给大家分享了pc端的部署方式,今天来给大家分享uniapp端在本地搭建,与打包发布到宝塔的方法。感兴趣的朋友可以自行下载学习。 技术架构 vscode node16 vue3 uniapp vite types…...
Hive的分区表与分桶表内部表外部表
文章目录1 Hive分区表1.1 Hive分区表的概念?1.1.1 分区表注意事项1.2 分区表物理存储结构1.3 分区表使用场景1.4 静态分区表是什么?1.4.1 静态分区表案例1.4.2 分区表练习一1.4.3 分区操作1.5 动态分区表是什么?1.5.1 动态态分区表案例&#…...
和数集团打造《神念无界:源起山海》,诠释链游领域创新与责任
首先,根据网上资料显示,一部《传奇》,二十年热血依旧。 《传奇》所缔造的成绩,承载的是多少人的青春回忆,《传奇》无疑已经在游戏史上写下了浓墨重彩的一笔。 相比《传奇》及背后的研发运营公司娱美德名声大噪&#x…...
小白入门模拟IC设计,如何快速学习?
众所周知,模拟电路很难学。以最普遍的晶体管来说,我们分析它的时候必须首先分析直流偏置,其次在分析交流输出电压。可以说,确定工作点就是一项相当麻烦的工作(实际中来说),晶体管的参数多、参数…...
51单片机——中断系统之外部中断实验,小白讲解,相互学习
中断介绍 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一,是我们学些单片机必须要掌握的。 为了更容易的理解中断概念&…...
如何设计一个秒杀系统
秒杀系统要如何设计? 前言 高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。 秒杀一般出现在商城的促销活动中,指定…...
厄瓜多尔公司注册方案
简介: 经济概况与商机 厄瓜多尔是世界上第74大国家,是南美西部国家,与哥伦比亚,秘鲁和太平洋接壤。厄瓜多尔地处世界中心,地理位置优越,地理位置优越-赤道线零纬度,使其成为通往太平洋的理想枢…...
安全渗透环境准备(工具下载)
数据来源 01 一些VM虚拟机的安装 攻击机kali: kali官网 渗透测试工具Kali Linux安装与使用 kali汉化 虚拟机网络建议设置成NAT模式,桥接有时不稳定。 靶机OWASP_Broken_Web_Apps: 迅雷下载 网盘下载 安装教程 开机之后需要登录&am…...
118.(leaflet篇)leaflet空间判断-点与geojson面图层的空间关系(turf实现)
听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>...
目标检测与目标跟踪算法技术汇总
现如今chatgpt的爆火,我也使用了一段时间,问了许多关于人工智能技术的问题,基本是它能够回答了大部分的原理的,至于其人工智能涉及到的算法以及网络,考虑到也没有图,可能在给出这类回答上,是不太…...
Linux 系统启动过程
过去几十年,公用事业行业发生了重大变化。能源需求的转变导致企业利润率的波动,但不是运营成本的波动。 许多公用事业公司通过后勤部门流程自动化来削减成本,比如招采流程自动化。 在招采活动中,人工招采会产生盲点。由于公共事业…...
【每日一题Day118】LC1124表现良好的最长时间段 | 前缀和+单调栈/哈希表
表现良好的最长时间段【LC1124】 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」,意味在这段时间内&#…...
vue使用nprogress(进度条)
目录 1.安装 2.引入 3.配置 4.使用 5.使用场景 6.改变颜色 1.安装 npm install --save nprogress2.引入 import NProgress from nprogress import nprogress/nprogress.css3.配置 NProgress.configure({easing: ease, // 动画方式,和css动画属性一样&#…...
@NotNull 、@NotBlank、@NotEmpty区别和使用
引言 今天在使用validation校验的时候,发现了使用校验不起作用,一时间有点摸不到头绪,就看了一下同事提交的代码,发现了问题在用NotNull用法,用的有些错误,所以在这里讲一下NotNull、NotBlank、NotEmpty区…...
Nacos——Nacos简介以及Nacos Server安装
资料来源:02-Nacos配置管理-什么是配置中心_哔哩哔哩_bilibili nacos记得下载2.x版本的,负责以后新建配置的时候会出现“发布错误,请检查参数是否正确”错误!!!! 目录 一、Nacos简介 1.1 四…...
Presto 文档和笔记
1. Presto Presto 官网 Presto 文档 2. 配置 3.1 node 配置 cat etc/node.properties # Generated by Apache Ambari. Fri Feb 10 14:52:10 2023node.data-dir/mnt/bmr/presto/data node.environmentproduction node.idbmr-master-4b7cbaa3.2 jvm 配置 cat etc/jvm.confi…...
大尺度衰落与小尺度衰落
一. 大尺度衰落 无线电磁波信号在收发天线长距离(远大于传输波长)或长时间范围发生的功率变化,称为大尺度衰落,一般可以用路径损耗模型来描述,路径损耗是由发射功率在空间中的辐射扩散造成的,根据功率传输…...
完美解决:重新安装VMware Tools灰色。以及共享文件夹的创建(centos8)
解决:重新安装VMware Tools灰色问题:重新安装VMware Tools灰色解决方案-挂载VMware中的linux.iso1. vmtools的linux.iso挂载及安装2. 共享文件夹的创建及配置问题:重新安装VMware Tools灰色 发现一个小问题,我的vm虚拟机安装后发…...
达梦数据库作业管理
一、基本功能 作业系统大致包含作业,警报,操作员三部分。 作业可运行DMPL/SQL脚本,定期备份数据库,检查等。可定时执行,也可通过警报触发执行,可产生警报通知用户状态。一个作业由多个步骤组成,…...
数据结构-考研难点代码突破(C++实现树型查找-二叉搜索树(二叉排序树))
文章目录1.二叉搜索树基本操作二叉搜索树的效率分析2. C实现1.二叉搜索树基本操作 二叉排序树是具有下列特性的二叉树: 若左子树非空,则左子树上所有结点的值均小于根结点的值。若右子树非空,则右子树上所有结点的值均大于根结点的值。左、…...
emqx异常处理
启动异常 通过解压tar压缩包安装后通过 ./bin/emqx start 启动报错 WARNING: Default (insecure) Erlang cookie is in use. WARNING: Configure node.cookie in /opt/emqx/etc/emqx.conf or override from environment variable EMQX_NODE__COOKIE NOTE: Use the same config…...
Web前端:开始学习ReactJS需要知道什么?
毫无疑问,ReactJS是前端开发者中最著名的库之一,它的受欢迎程度与日俱增。用ReactJS构建的网站看起来非常棒,大多数开发新手都被它吸引住了。然而,许多新人和有经验的开发人员在没有首先了解先决条件的情况下,就直接用…...
卡诺图化简
1.相关概念 最小项:函数的某个乘积项包含了函数的全部变量(原变量或反变量的形式),且每个变量仅出现一次,则这个乘积项为该函数的一个标准积项。 最小项中的原变量记为1,反变量记为0,当变量顺序…...
带你了解软件测试是做什么的
软件测试是互联网技术中一门重要的学科,它是软件生命周期中不可或缺的一个环节,担负着把控、监督软件的质量的重任。 人才稀缺,对于求职者来说就意味着机会。但是很多想学习软件测试的人对这个学科并不了解,也不知道该如何学习&a…...
微信机器人 wordpress/山东建站
Java数据类型教程 - Java数字数据类型字节,短整数,整数,长整数,浮点数和双精度类是数字包装类。它们都继承自抽象的Number类。我们不能创建Number类的对象。然而,er可以声明Number类的引用变量。我们可以将六个数值包装…...
wordpress缓存网站首页/宁波网络推广联系方式
【参考文章】:01|基础架构:一条查询语句的执行流程 1. 基本架构 大体来说,MySQL可以分为Server层和存储引擎两部分。 Server层包括链接器,分析器,优化器,执行器等,涵盖大多数核心服务功能&#…...
如何做网站漂浮广告/今日热点新闻视频
关 于 叶 问《叶问》是知数堂新设计的互动栏目,不定期给大家提供技术知识小贴士,形式不限,或提问、或讨论均可,并在当天发布答案,让大家轻轻松松利用碎片时间就可以学到最实用的知识点。2020年01月02日,周四…...
星海湾建设中心网站/乔拓云智能建站系统
2019独角兽企业重金招聘Python工程师标准>>> 调侃哈哈,搞这个硬是把我整惨了,电信那帮人我就不想弹劾他们了,“请问你能给我下下行短信的SOAP head的xml格式吗?“,回”你这是指使我干活么?“,”…...
重点培育学科建设网站/北京seo优化
前言:在慕课网上学习剑指Java面试-Offer直通车时所做的笔记,供本人复习之用,比较难,我也没大懂,只记录大概意思以后有接触了再改,想要详细解说的不建议看这篇博客. 目录 第一章 对象在内存中的布局 第二章 Monitor 2.1 Monitor在字节码中的表示 第三章 锁的优化 3.1 自旋…...
泰安企业建站公司服务/郑州seo优化顾问
一直对抖音上的各种人脸处理算法很感兴趣,个别的我觉得目前的水平我能写个简单的实现方式,但是涉及复杂的,还是太菜了。但是之前在抖音上看到了一个用网页写的旋转汉字时钟的视频,感觉很好玩,而且我觉着写出来完全没问…...