Linux--shell

Shell终端解释器当作人与计算机硬件之间的“翻译官”,能够支持各种变量与参数,还提供了诸如循环、分支等高级编程语言才有的控制结构特性。Shell脚本命令的工作方式有两种:交互式和批处理。

脚本格式要求:

1)脚本以#!/bin/bash  开头

2)脚本需要有可执行权限

脚本的常用执行形式

方式1:输入脚本的绝对路径或者相对路径

  1. .xxxxx.sh(但默认会因为权限不足而提示报错信息,只需要为其增加权限即可)

方式2:(sh+脚本)

  1. 说明:不用赋予脚本权限,直接执行即可

编写第一个shell脚本

使用vim创建example.sh,然后输入上图代码,保存退出后,使用“bash example.sh”执行该脚本;第一行用来告诉系统使用哪种Shell解释器来执行该脚本,第二行是对脚本功能和某些命令的介绍信息,第三第四行就是基本的Linux指令了。

扫描二维码关注公众号,回复: 6193060 查看本文章

接受用户参数

像上面的脚本程序只能执行一些预定义好的功能,太过于死板。因此,为了灵活工作,必须让脚本程序能像之前执行命令时那样,接受用户输入的参数。Shell脚本语言已经内设了用于接受参数的变量,变量之间采用空格间隔。

$0对应是当前脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,$1、$2、$3.....则分别对应着第n个位置的参数值。

判断用户参数

条件测试语法的执行格式如下:

按照测试对象来划分,条件测试语句可以分为4种:

  1. 文件测试语句;
  2. 逻辑测试语句;
  3. 整数值比较语句;
  4. 字符串比较语句;

文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符,具体参数如下:

下面使用文件测试语句判断/etc/fstab是否为一个目录类型文件,然后通过shell解释器内设$?变量显示上一条命令执行后的返回值。如果返回0,则目录存在;否则不存在。

逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果。例如在shell终端中逻辑“与”的符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令,因此可以判断/dev/cdrom文件是否存在,若存在则输出Exist字样。

同样的,还有:

  1. 逻辑“或”------->||【前面命令执行失败后才会执行它后面的命令】;
  2. 逻辑“非”------->!【把条件测试中的判断结果取相反值】;

判断10与10之间是否相等?

 

流程控制语句

if条件测试语句

if语句分为单分支结构、双分支结构、多分支结构。

单分支结构由if、then、fi关键字组成,只在条件成立后才执行预设的命令,其语法格式如下:

使用单分支的if条件语句来判断/media/cdrom文件是否存在,若存在就结束条件判断和整个shell脚本,反之则去创建这个目录:

双分支结构由if、then、else、fi关键字组成,它进行一次条件匹配判断,如果匹配,则去执行预设的命令;反之则执行不匹配时的预设命令,语法格式如下:

下面使用双分支的 if 条件语句来验证某台主机是否在线,然后根据返回值的结果,要么显示主机在线信息,要么显示主机不在线信息。这里的脚本主要使用 ping 命令来测试与对方主机的网络联通性,而 Linux 系统中的 ping 命令不像 Windows 一样尝试 4 次就结束,因此为了避免用户等待时间过长,需要通过-c 参数来规定尝试的次数,并使用-i 参数定义每个数据包的发送间隔,以及使用-W 参数定义等待超时时间。

多分支结构由if、then、else、elif、fi关键字组成,它进行多次匹配,在多次判断中的任何一项在匹配成功后都会执行相应的预设命令。语法格式如下:

实现上图的功能:

for条件循环语句

for循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据有范围时,使用for循环语句。语法格式如下:

使用for循环从列表文件中读取多个用户名,然后为其逐一创建用户账户并设置密码。

  • 首先创建用户名称的列表文件users.txt

  • 接下来编写Shell脚本Example.sh。在脚本中使用 read 命令读取用户输入的密码值,然后赋值给 PASSWD 变量,并通过-p 参数向用户显示一段提示信息,告诉用户正在输入的内容即将作为账户密码。在执行该脚本后,会自动使用从列表文件users.txt 中获取到所有的用户名称,然后逐一使用“id 用户名”命令查看用户的信息,并使用$?判断这条命令是否执行成功,也就是判断该用户是否已经存在。
  • 【注】/dev/null 是一个被称作 Linux 黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。

【注】&的符号表示将前面的命令放到后台去执行

while条件循环语句

while条件循环语句是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数。语法格式如下:

接下来结合使用多分支的 if 条件测试语句与 while 条件循环语句,编写一个用来猜测数值大小的脚本 Guess.sh。该脚本使用$RANDOM 变量来调取出一个随机的数值(范围为 0~32767),将这个随机数对 1000 进行取余操作,并使用 expr 命令取得其结果,再用这个数值与用户通过 read命令输入的数值进行比较判断。这个判断语句分为三种情况,分别是判断用户输入的数值是等于、大于还是小于使用 expr 命令取得的数值。

 

case条件测试语句

case如同switch语句相似,case语句在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试。语法格式如下:

计划任务服务程序

计划任务分为一次性计划任务与长期性计划任务,也就是说:

  1. 一次性:今晚11点30分开启网站服务
  2. 长期性:每周一的凌晨3点25分把/home/wwwroot目录打包备份为backup.tar.gz

我们可以用at命令实现这种功能,语法格式:at 时间;如果想要查看已设置好但未执行的一次性计划任务,可以使用“at -l(L的小写)”;想要将其删除,可以用“atrm 任务序号”。

如果我们希望Linux系统能够周期地、有规律地执行某些具体的任务,那么Linux中默认开启的crond服务简直再适合不过了。闯将、编辑计划任务的命令为“rontab -e”,查看当前计划任务的命令为“crontab -l”,删除某条计划任务的命令为"crontab -r".。如果是以管理员身份进行登录,可以在crontab命令中加上-u来编辑他人的计划任务。

【注1】除了用逗号( ,)来分别表示多个时间段,例如“8,9,12”表示 8 月、 9 月和 12 月。还可以用减号( - )来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的 12~15 日)。以及用除号( / )表示执行任务的间隔时间(例如“*/2”表示每隔2分钟执行一次任务)。

【注2】如果在 crond 服务中需要同时包含多条计划任务的命令语句,应每行仅写一条。例如我们再添加一条计划任务,它的功能是每周一至周五的凌晨 1 点钟自动清空/tmp 目录内的所有文件。尤其需要注意的是,在 crond 服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用 whereis 命令进行查询。

【注3】可以使用“#”来进行注释;分字段必须要由数值;日和星期字段不能同时使用,否则发生冲突。

猜你喜欢

转载自blog.csdn.net/weixin_37160123/article/details/89257661
今日推荐