首页 > 自考资讯 > 高考百科

一步一步了解并搞懂shell脚本(shell脚本基础教程)

小条 2024-10-14

d73f0450362e460693699cb615a610aa~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1729511741&x-signature=b1FOWnbHEWDjbTtQg%2FZG6ZWpm%2FA%3D 注:本文为文章合集,会持续更新。

关注我,持续进步!

Shell脚本之所以被称为shell脚本,是因为它们运行在Linux shell内部,不能作为正式的编程语言使用。事实上,shell 脚本是命令的集合。例如,假设您要实现以下操作:

(1) 进入/tmp/目录。

(2) 列出当前目录下的所有文件名。

(3) 将当前所有文件复制到/root/目录下。

(4) 删除当前目录下的所有文件。

要完成上述四个简单步骤,您需要在shell 窗口中键入命令四次并按Enter 键四次。这并不难。然而,当输入复杂的命令时,在键盘上一一输入可能会很乏味。您还可以将所有操作记录在一个文档中,并调用文档内的命令,一步完成操作。这个文件实际上是一个shell脚本,但是这个shell脚本有它自己特殊的格式。

Shell 脚本使服务器管理变得非常方便,因为您可以指定任务计划并定期运行特定的shell 脚本以满足您的需要。这是Linux系统管理员应该感到非常自豪的事情。您可以在Linux 服务器上部署监控shell 脚本,并向脚本添加电子邮件通知以通知您发生故障。例如,如果网卡流量异常或您的Web 服务器停止服务,您可以向管理员发送电子邮件。这可以让管理员立即知道服务器存在问题。

A. Ming建议在正式编写shell脚本之前将所有自定义脚本放在/usr/local/sbin/目录中。这样做的目的首先是为了更好地管理您的文档,其次是为了使维护更容易,因为未来的管理员将知道您的自定义脚本的位置。

13.1.1 创建并运行shell 脚本

跟随阿明,编写你的第一个shell 脚本,如下所示:

# cd /usr/local/sbin/# vim first.sh //添加以下内容#! /bin/bash## 这是我的第一个shell 脚本。 ## 作者:Aming 2022-12-02.dateecho 'Hello world ' Shell 脚本通常具有.sh 后缀。这并不意味着没有.sh 的脚本无法运行,这只是每个人的习惯。因此,如果以后发现有.sh后缀的文件,那么它可能是一个shell脚本。本例中,脚本文件first.sh的第一行以#!/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 22:16:56 CST 2022Hello world! 使用此方法运行shell 脚本先决条件是:它本身有执行权限,所以需要给脚本添加x权限。另外,当使用sh命令运行shell脚本时,可以添加-x选项来查看脚本的执行过程,这对于调试脚本很有用。如下图:

# sh -x first.sh+ dateFri Dec 2 22:17:43 CST 2022+ echo 'Hello world!'Hello world! 这个例子有一个阿明以前从未介绍过的日期命令。该命令在shell 脚本中经常使用。因此,我们需要介绍一下如何使用。

13.1.2 命令日期

shell 脚本中date 命令最常用的一些用法是:

date +%Y:表示以4位数字格式打印年份。 date +%y:表示以两位数格式打印年份。 date +%m:表示月份。日期+%d:表示日期。日期+%H:表示时间。 date +%M:表示分钟。日期+%S:表示秒。 date +%w:表示星期几。结果为0 表示星期日。阿明提供了一些实际示例来帮助您学习如何使用date 命令。示例代码如下。

# date +'%Y-%m-%d %H:%M:%S'2022-12-02 22:18:03 脚本中可以使用一天前的日期,如下所示。

# date -d '-1 day' +%d01,即1小时前,如下所示:

# date -d '-1 hour' +%H21 甚至1 分钟前:

# 日期-d '-1 分钟' +%M17

13.2 shell脚本中的变量

在shell 脚本中使用变量使它们更加专业并且更像一种语言。如果你有一个长达1000 行的shell 脚本,并且某个特定的命令或路径在脚本中多次出现,并且你觉得该路径不正确并且想要更改它,你可以一一更改它或使用以下命令:必须使用。使用批量替换命令更改它。这很乏味并且使得脚本非常臃肿。变量就是用来解决这个问题的。变量的定义格式为“变量名=变量值”。在脚本中引用变量时,必须添加符号$。这与前面介绍的shell 自定义变量相匹配。

接下来,创建第一个与变量相关的脚本,如下所示。

# vim variable.sh#! /bin/bash## 该脚本使用变量。 ## 作者:Aming 2022-12-02.d=`date +%H:%M:%S`echo '脚本以$d 开头。'echo '现在休眠2 秒。 'sleep 2d1=`date +%H:%M:%S`echo '脚本于$d1 结束。 ' 本例中使用了反引号,其作用如下:将带引号的字符串作为shell 命令执行并返回命令的结果。 d 和d1 在脚本中显示为变量。

我们来看看运行这个脚本的结果,如下所示。

# sh Variables.sh 脚本以22:23:04 开头。现在睡眠2 秒钟。该脚本以22:23:06 结尾。

13.2.1 数学运算

一个示例命令是:

# vim sum.sh#! /bin/bash## 获取两个数字的和。 ## Aming 2022-12-02.a=1b=2sum=$[$a+$b]echo '$a+$b=$sum' 数学计算必须用[ ] 括起来,并在前面加上符号$ 。该脚本的结果将是:

# sh 总计.sh1+2=3

13.2.2 用户交互

一个示例脚本是:

# cat read.sh#! /bin/bash## 在shell 脚本中使用“read”。 ## AMING 2022-12-02.read -p '输入数字:' xread -p '输入另一个数字:' ysum=$[$x+$y]echo '两个数字合计为: $sum'读取命令使用用户输入的字符串作为变量值。脚本执行流程如下:

# sh read.sh请输入一个数字: 2请输入另一个数字: 10 两个数字之和为: 12 你可能还想添加-x 选项,看一下执行过程。

# sh -x read.sh+ read -p '输入一个数字:' x输入一个数字: 22+ read -p '输入另一个数字:' y输入另一个数字Please: 13+ sum=35+ echo '两个数字的和是:35'两个数字之和为: 35

13.2.3 shell 脚本中的默认变量

您还可以使用/etc/init.d/iptables restart 等命令(该命令来自早期的CentOS 系统)。旧的/etc/init.d/iptables 文件实际上是一个shell 脚本。为什么脚本后面有一个重启字符串呢?这涉及到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/bashcho '$1 $2 $0' 该脚本运行结果如下。

# sh 选项.sh 1 21 2 选项.sh

13.3 shell脚本中的逻辑决策

如果你学过C这样的语言,我想没有人不熟悉if。 Shell脚本还可以使用if逻辑判断。

13.3.1 如果没有使用其他东西

具体格式如下。

if 决策语句的示例脚本是:

# cat if1.sh#! /bin/bashread -p 'score: ' aif ((a60)); thenecho '你没有通过考试。 ' ((a60)) 显示在fiif1.sh 表单中。是特定于shell 脚本的格式。如果仅使用一个括号,则会报告错误。请记住这个格式。阿明还使用了另一种格式,我们稍后会介绍。

运行该脚本的结果如下:

# sh if1.sh 请输入你的分数: 90 # sh if1.sh 请输入你的分数: 33 我没有通过考试。

13.3.2 何时使用else

具体格式如下。

if 决策语句的示例脚本是:

# vim if2.sh //内容如下#! /bin/bashread -p 'score: ' aif ((a60)); thenecho '你没有通过考试。 “elseecho”过去了。运行该脚本的结果是:

# sh if2.sh 请输入您的分数: 80 您通过了考试。 # sh if2.sh输入你的分数: 25脚本if2.sh和脚本if1.sh的唯一区别是:系统将提示您输入大于或等于60 的数字。

13.3.3 与Elif

具体格式如下。

if 决策语句1; thencommandelif 决策语句2; thencommandelsecommandfi 示例脚本如下。

# vim if3.sh //内容如下#! /bin/bashread -p 'score: ' aif ((a60)); thenecho '你没有通过考试。 'elif ((a=60) )) ( (a85)); thenecho ``很好!我通过了考试。'' elsecho ``很好!你的分数非常高!'' 的意思是“和”。当然,它也可以表示“或”。

运行该脚本的结果如下:

# sh if3.sh 请输入你的分数: 90 很好!你的分数很高! # sh if3.sh 请输入你的分数: 60 好! 以上是一个if 语句的结构这是一个简单的解释。除了使用格式(()) 之外,还可以使用[] 来确定值的大小。但是,不允许使用、 和=等符号。必须使用-lt(小于)、-gt(大于)、-le(小于或等于)、-ge(大于或等于)、-eq。 (等于),-ne(不等于)。接下来,阿明以命令行的形式进行快速对比,无需编写shell脚本。示例代码如下。

# a=10; 如果[ $a -lt 5 ]; 那么echo fi# a=10; 如果[ $a -gt 5 ]; 那么echo fiok# a=10;使用eq 10 ]; 然后echo ok 的示例代码是:

# a=10; if [ $a -lt 1 ] || [ $a -gt 5 ]; if [ $a -gt 1 ] || ;

13.3.4 对文件的判断

在shell 脚本中,if 经常用于确定文档的属性。例如判断文档是普通文件还是目录,文件是否有读、写、执行权限。 if 的常用选项包括:

-e:检查文件或目录是否存在。 -d:检查是否是目录以及该目录是否存在。 -f:判断文件是否为普通文件以及是否存在。 -r:判断是否有读权限。 -w:判断是否有写权限。 -x:判断是否可执行。使用if判断时的具体格式如下。

if [ -e filename ] ; thencommandfi 的示例代码是:

# if [ -d /home/]; then echo ok; # if [ -f /home/]; then echo ok 不会显示,因为/home/是目录,而不是文件。其他示例包括:

# if [ -f /root/test.txt ]; then fiok# if [ -r /root/test.txt ]; then echo fiok# if [ -w /root/test.txt ]; echo fiok# [ -x /root/test.txt ]; 然后回显确定;

感谢您的阅读。请大家关注我未来的进步。

版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。

猜你喜欢