Linux Shell脚本讲解

news2024/11/25 4:48:27

目录

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不起作用时,不一定是计划任务的原因

还可能是用户权限的问题

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

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

相关文章

第五章.与学习相关技巧—参数更新的最优化方法(SGD,Momentum,AdaGrad,Adam)

第五章.与学习相关技巧 5.1 参数更新的最优化方法 神经网络学习的目的是找到使损失函数的值尽可能小的参数&#xff0c;这是寻找最优参数的问题&#xff0c;解决这个问题的过程称为最优化。很多深度学习框架都实现了各种最优化方法&#xff0c;比如Lasagne深度学习框架&#xf…

Vue中使用天地图

Vue项目引入天地图 在vue的静态资源目录下的index.html中引入天地图的底图&#xff0c;开发天地图源码路径&#xff1a;天地图API 方法一&#xff1a;加载天地图&#xff0c;引用&#xff1a;public/index.html <script type"text/javascript" src"http:/…

来来来,手摸手写一个hook

hello&#xff0c;这里是潇晨&#xff0c;今天就带着大家一起来手写一个迷你版的hooks&#xff0c;方便大家理解hook在源码中的运行机制&#xff0c;配有图解&#xff0c;保姆级的教程&#xff0c;只求同学一个小小的&#x1f44d;&#xff0c;&#x1f436;。 第一步&#xf…

【软件测试】团队测试技术体现,遇到不可复现bug处理方式......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试技术带来的是PP…

ThingsBoard-规则链-check alarm status

1、概述 从今天开始,专门讲解ThingsBoard的规则链,每一个节点都会详细讲解,并且配套案例,让大家都能理解,喜欢请点个关注。今天讲的是筛选器的第第一个节点【check alarm status】,意思是检测告警状态。 2、节点理解 2.1、概述 【check alarm status】节点如图所示:…

解立方根-蓝桥杯

题目 分析 主要是运用二分法使复杂度减低。 代码 #include<iostream> #include<iomanip> #include<cmath> using namespace std; #define double long double const double eps 1e-12; int main() {int T 1;cin >> T;while (T--){double n;cin &g…

LMS 最佳实践:学习管理系统中的知识管理!

企业需要在整个组织中收集、存储和传播知识。我们被信息淹没了&#xff0c;因此应该充分利用学习管理系统&#xff08;LMS&#xff09;来组织业务资产并支持知识管理&#xff08;KM&#xff09;战略。LMS 不仅仅是一个捕获电子学习单元和多项选择题的系统。它很可能没有充分发挥…

代码随想录算法训练营第二十八天 | 491.递增子序列,46.全排列,47.全排列 II

一、参考资料递增子序列题目链接/文章讲解&#xff1a;https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1EG4y1h78v 全排列题目链接/文章讲解&#xff1a;https://programmercarl.…

从零学架构-基础部分

一、架构的基础将学习的架构设计知识总结出来&#xff0c;分享给大家。1.1什么是架构架构和框架是什么关系&#xff1f;有什么区别?Linux有架构&#xff0c;MySQL有架构&#xff0c;JVM也有架构&#xff0c;应该关注哪个架构&#xff1f;金融有架构&#xff0c;支付有架构&…

【排序算法】数据结构排序详解

前言&#xff1a; 今天我们将讲解我们数据结构初阶的最后一部分知识的学习&#xff0c;也是最为“炸裂”的知识---------排序算法的讲解&#xff01;&#xff01;&#xff01;&#xff01; 目录1.排序的概念及其运用1.1排序的概念1.2排序运用2.常见排序算法的实现2.1 插入排序2…

Java 基础面试题——集合

目录1.Java 有哪些常用容器&#xff08;集合&#xff09;&#xff1f;2.Collection 和 Collections 有什么区别&#xff1f;3.List、Set、Map 之间的区别是什么&#xff1f;4.HashMap 的长度为什么是 2 的 N 次方&#xff1f;源码中是如何保证的&#xff1f;5.HashMap 和 Hasht…

ChatGPT 下一步,分配对象脱单有望

ChatGPT 火了&#xff0c;上一次这么热闹还是上一次……那时最紧俏的概念叫元宇宙。 混沌时期&#xff0c;鱼龙混杂。资本市场靠新故事造梦&#xff0c;科技巨头争相加入竞赛&#xff0c;也有脑子活泛的已经利用它的巨大热度搞上了小钱钱——活跃在某宝某鱼上&#xff0c;贩卖…

2023版Java面试汇总!全面对标阿里P7,学完,化身offer收割机

最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;本文主要是为了帮大家快速回顾Java中知识点&#xff0c;这套&#xff08;详细笔记/面试题&#xff09;它几乎涵盖了所有的Java技术栈面试题和答案&#xff0c;相信可以帮助大家在金三银四&#xff0c;最短的时间内用作学习和面…

基于微信小程序的优选驾考小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…

SpringBoot查询接口传入参数为List,XML的写法

✉️ 查询业务 ➿ 目前互联网项目的诸多业务中数查询业务居多&#xff0c;而查询业务中又数展示类接口、报表类接口是我们接触最多的查询类接口。在实际项目中&#xff0c;不是全局查询数据就做完了业务&#xff0c;这样的需求也没有意义。条件查询因此作为最普遍的查询业务&am…

软件测试之优秀的产品质量评估模型的特征

产品质量评估中的几个场景&#xff1a; 场景1&#xff1a;项目计划的时间到了&#xff0c;就发布产品。 场景2&#xff1a;将缺陷修复率作为产品的质量目标。产品必须达到一定的缺陷修复率&#xff0c;才能发布。 场景3&#xff1a;我们为产品建立了很多指标来作为质量目标&…

报表开发工具FastReport .Net 如何在移动端生成Web报表应用?

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。专业版和企业版包括Fast…

软件测试1-测试就是找茬游戏

软件测试是找茬游戏以前有一个很火的游戏叫《大家来找茬》&#xff0c;我玩这个游戏很厉害&#xff0c;在这个游戏中&#xff0c;两幅图中有几个不一样的地方&#xff0c;有些地方很明显&#xff0c;一眼就能看到&#xff0c;有的地方隐藏得比较深&#xff0c;要仔细看才能看清…

2PC(两阶段提交)方案

XA方案2PC的传统方案是在数据库层面实现的&#xff0c;如Oracle、MySQL都支持2PC协议&#xff0c;为了统一标准减少行业内不必要的对接成本&#xff0c;需要制定标准化的处理模型及接口标准&#xff0c;国际开放标准组织Open Group定义了分布式事务处理模型DTP&#xff08;Dist…

“遥感+”蓝碳储量估算、红树林信息提取

大气温室气体浓度不断增加&#xff0c;导致气候变暖加剧&#xff0c;随之会引发一系列气象、生态和环境灾害。如何降低温室气体浓度和应对气候变化已成为全球关注的焦点。海洋是地球上最大的“碳库”,“蓝碳”即海洋活动以及海洋生物&#xff08;特别是红树林、盐沼和海草&…