shell脚本并不能作为正式的编程语言,因为它是在linux的shell中运行的,所以称为shell脚本。事实上,shell脚本就是一些命令的集合。比如,我想实现这样的操作:
(1) 进入/tmp/目录;
(2) 列出当前目录中所有的文件名;
(3) 把所有当前的文件复制到/root/目录下;
(4) 删除当前目录下所有的文件。
完成以上简单的4步需要在shell窗口中输入4次命令,按4次回车,这不算太难。但如果是输入复杂的命令,一次一次敲键盘会很麻烦。我们不妨把所有的操作都记录到一个文档中,然后去调用文档中的命令,这样一
步操作就可以完成。其实这个文档就是shell脚本,只是这个shell脚本有它特殊的格式。
shell脚本能帮助我们很方便地管理服务器,因为我们可以指定一个任务计划,定时去执行某个shell脚本以满足需求。这对于linux系统管理员来说是一件非常值得自豪的事情。我们可以在linux服务器上部署监控的
shell脚本,然后脚本中可以加上邮件通知来告之出现故障。比如,网卡流量出现异常或者web服务器停止服务,就可以发一封邮件给管理员。这样可以让管理员及时知道服务器出问题了。
在正式编写shell脚本之前,阿铭建议凡是自定义的脚本都放到/usr/local/sbin/目录下。这样做的目的是:一来可以更好地管理文档;二来以后接管你工作的管理员都知道自定义脚本放在哪里,方便维护。
13.1.1 shell脚本的创建和执行
下面请跟着阿铭编写第一个shell脚本,如下所示:# cd /usr/local/sbin/# vim first.sh //加入如下内容#! /bin/bash## this is my first shell script.## writen by aming 2022-12-02.dateecho hello world! shell脚本通常都以.sh为后缀名。这并不是说不加.sh的脚本就不能执行,只是大家的一个习惯而已。所以,以后如果发现了以.sh为后缀的文件,那么它可能是一个shell脚本。本例中,脚本文件first.sh的第1行要以#! /bin/bash开头,表示该文件使用的是bash语法。如果不设置该行,你的shell脚本也可以执行,但是不符合规范。#表示注释,后面跟一些该脚本的相关注释内容,以及作者、创建日期或者版本等。当然,这些注释并
非必需的,但阿铭不建议省略。因为随着工作时间的逐渐过渡,写的shell脚本也会越来越多,如果有一天你回头查看自己写过的某个脚本,很有可能忘记该脚本是用来干什么的以及什么时候写的。所以写上注释是有
必要的。另外,系统管理员并非只有你一个,写上注释有助于其他管理员查看你的脚本。
下面我们执行一下这个脚本,如下所示:# sh first.shfri dec 2 22:16:56 cst 2022hello world! 其实shell脚本还有一种执行方法,如下所示:# ./first.sh-bash: ./first.sh: 权限不够# chmod +x first.sh# ./first.shfri dec 2 2256 cst 2022hello world! 使用该方法运行shell脚本的前提是脚本本身有执行权限,所以需要给脚本加一个x权限。另外,使用sh命令执行一个shell脚本时,可以加-x选项来查看这个脚本的执行过程,这样有利于我们调试这个脚本。如下所示:# sh -x first.sh+ datefri dec 2 2243 cst 2022+ echo 'hello world!'hello world! 本例中有一个date命令,之前阿铭从未介绍过,这个命令在shell脚本中使用非常频繁,因此有必要介绍一下它的用法。
13.1.2 命令date
date命令在shell脚本中最常用的几个用法如下。 date +%y:表示以四位数字格式打印年份。 date +%y:表示以两位数字格式打印年份。 date +%m:表示月份。 date +%d:表示日期。 date +%h:表示小时。 date +%m:表示分钟。 date +%s:表示秒。 date +%w:表示星期。结果显示0则表示周日。 下面阿铭举几个比较实用的例子来帮助你掌握date命令的用法,示例代码如下:# date +%y-%m-%d %h:%m:%s2022-12-02 2203 有时,在脚本中会用到一天前的日期,如下所示:# date -d -1 day +%d01 或者一小时前,如下所示:# date -d -1 hour +%h21 甚至一分钟前,如下所示:# date -d -1 min +%m17 13.2 shell脚本中的变量
在shell脚本中使用变量会使我们的脚本更加专业,更像是一门语言。如果你写了一个长达1000行的shell脚本,并且脚本中多次出现某一个命令或者路径,而你觉得路径不对想修改一下,就得一个一个修改,或者使用批量替换的命令修改。这样做很麻烦,并且脚本也显得臃肿了很多。变量就是用来解决这个问题的。定义变量的格式为:“变量名=变量的值”。在脚本中引用变量时需要加上符号$,这跟前面介绍的在shell中自定义变量是一致的。
下面我们编写第一个与变量相关的脚本,如下所示: # vim variable.sh#! /bin/bash## in this script we will use variables.## writen by aming 2022-12-02.d=`date +%h:%m:%s`echo the script begin at $d.echo now we'll sleep 2 seconds.sleep 2d1=`date +%h:%m:%s`echo the script end at $d1. 本例中使用到了反引号,它的作用是将引号中的字符串当成shell命令执行,返回命令的执行结果。d和d1在脚本中作为变量出现。下面来看看该脚本的执行结果,如下所示:# sh variable.shthe script begin at 2204.now we'll sleep 2 seconds.the script end at 2206.
13.2.1 数学运算
示例命令如下:# vim sum.sh#! /bin/bash## for get the sum of two numbers.## aming 2022-12-02.a=1b=2sum=$[$a+$b]echo $a+$b=$sum 数学计算要用[ ]括起来,并且前面要加符号$。该脚本的结果如下:# sh sum.sh1+2=3 13.2.2 和用户交互示例脚本如下:# cat read.sh#! /bin/bash## using 'read' in shell script.## aming 2022-12-02.read -p please input a number: xread -p please input another number: ysum=$[$x+$y]echo the sum of the two numbers is: $sum read命令用于和用户交互,它把用户输入的字符串作为变量值。该脚本的执行过程如下:# sh read.shplease input a number: 2please input another number: 10the sum of the two numbers is: 12 我们不妨加上-x选项再来看看这个执行过程:# sh -x read.sh+ read -p 'please input a number: ' xplease input a number: 22+ read -p 'please input another number: ' yplease input another number: 13+ sum=35+ echo 'the sum of the two numbers is: 35'the sum of the two numbers is: 35 13.2.3 shell脚本预设变量
有时我们会用到类似/etc/init.d/iptables restart(该命令来源于早期centos系统)命令,前面的/etc/init.d/iptables文件其实就是一个shell脚本。脚本后面为什么可以跟一个restart字符串呢?这就涉及shell脚本的预设变量了。实际上,shell脚本在执行时,后面可以跟一个或者多个参数。比如下面的脚本:# vim option.sh //内容如下#! /bin/bashsum=$[$1+$2]echo sum=$sum 该脚本的执行结果如下:# sh -x option.sh 1 2+ sum=3+ echo sum=3sum=3
你可能会问:脚本中的$1和$2是从哪里来的?这其实就是shell脚本的预设变量。本例中,$1和$2的值就是在执行时分别输入的1和2,$1就是脚本的第一个参数,$2是脚本的第二个参数,以此类推。当然一个shell脚本的预设变量是没有限制的。
另外还有一个$0,它代表脚本本身的名字。我们不妨把脚本修改一下,如下所示:#! /bin/bashecho $1 $2 $0 该脚本的执行结果如下:# sh option.sh 1 21 2 option.sh 13.3 shell脚本中的逻辑判断
如果你学过c等语言,相信你不会对if感到陌生。在shell脚本中,我们同样可以使用if逻辑判断。
13.3.1 不带else
具体格式如下:if 判断语句; thencommandfi 示例脚本如下:# cat if1.sh#! /bin/bashread -p please input your score: aif ((a<60)); thenecho you didn't pass the exam.fi
if1.sh中出现了((a<60))这样的形式,这是shell脚本中特有的格式,只用一个小括号或者不用都会报错,请记住这个格式。阿铭还会用另外一种格式,后面会介绍到。该脚本的执行结果如下:# sh if1.shplease input your score: 90# sh if1.shplease input your score: 33you didn't pass the exam. 13.3.2 带有else
具体格式如下:if 判断语句; thencommandelsecommandfi 示例脚本如下:# vim if2.sh //内容如下#! /bin/bashread -p please input your score: aif ((a<60)); thenecho you didn't pass the exam.elseecho good! you passed the exam.fi 该脚本的执行结果如下:# sh if2.shplease input your score: 80good! you passed the exam.# sh if2.shplease input your score: 25you didn't pass the exam. 脚本if2.sh和脚本if1.sh唯一的区别是:如果输入大于或等于60的数字会有提示。
机器人惯导如何发展
车小米发布基于IIFAA数字车钥匙的两款解决方案
华为公布了安卓Q首批升级机型共有8款机型可以升级到正式版新系统
五端稳压器原理及结构解析
FlyHongOS通过 OpenHarmony 兼容性认证
一步一步了解并搞懂shell脚本
【回顾往年CES】诺基亚回归手机市场后发布首款机型—Nokia 6
美图t8和美图m8哪个值得买?除了拍照还有什么理由让你选择美图?
收发器的最大传输距离
即使将负载电缆与设备断开连接,进行空载运行时,也会发生故障吗?
国内陆芯划片机:晶圆加工第七篇—如何对半导体芯片进行测试
创想三维光固化3D打印机 让你在家实现手办自由
小米即将发布的小米8青春版确认用渐变色
嵌入式工程师如何玩转GitHub
ESP32+TFT 手把手教你学会黑客帝国的数字特效
葡萄牙光伏发电量成功突破了1GW大关
IBM用人工智能研发香水 AI真的能有创造力?
基于使用Atmega328P和ULN2003步进驱动器制造绘图仪机器人
如何用R处理进行数据清洗
三星存储大师新品系列面世,无论是在实用性能还是持久力上都无可挑剔