首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell脚本介绍,shell脚本结构和执行方式,date命令的用法,shell脚本中的变量简介

shell脚本介绍,shell脚本结构和执行方式,date命令的用法,shell脚本中的变量简介

作者头像
端碗吹水
发布2020-09-23 11:25:10
2.4K0
发布2020-09-23 11:25:10
举报

20.1 shell脚本介绍

5030
5030

  Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

换一种说法也就是,shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,然后用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的。

更明白地来说,shell script就像早期dos年代的.bat,最简单的功能就是将许多指令汇整写一起,让使用者很容易地就能够一个操作执行多个命令,而shell script更是提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。

概念区别:

  shell和shell脚本有什么区别?确切一点说,Shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向Linux发送请求以便运行程序的接口系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令型语言,又是一种程序设计语言(就是你所说的shell脚本)。作为命令型语言,它互动式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。它虽然不是 Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。

  Shell脚本最重要的一点是可以批量去执行Linux中的命令,这样的话就可以实现自动化运维。例如有一个需求,是要让你在凌晨3点的时候进行数据的备份,并且把大于50M的备份文件进行压缩。如果没有shell脚本的情况下,你要完成这个需求就只能凌晨3点爬起来敲命令。使用shell脚本的情况下,我只需要把命令写进脚本文件里,然后再设置一个任务计划,让系统在凌晨3点时自动执行这个脚本文件,还不是美滋滋。所以shell脚本不仅能够提升运维效率,还可以让我们的工作没有那么苦逼。

20.2 shell脚本结构和执行

5031
5031

  Shell脚本的第一行必须是:#!/bin/bash,"#!" 是一个约定的标记,后面跟着的/bin/bash是告诉系统这个脚本需要使用/bin/bash解释器来执行,即使用哪一种Shell。例如像python脚本就不一样了:#!/usr/bin/env python,因为不同语言所编写的脚本对应的解释器都不一样,但是都需要使用 "#!" 来作为标记。简单来说就是告诉系统这是一个什么语言写的脚本,是python是shell或者是其他的脚本语言所写的,然后系统才能使用相应的解释器去执行这个脚本。不过如果这个shell脚本是在本机执行的话,倒是可以省略掉:#!/bin/bash,因为能够识别本机的命令,但是如果到另一台机器就不一定能够执行了,所以文件的第一行才要写这样的声明。

Shell脚本的文件名称是以.sh为后缀,用于区分这是一个shell脚本,shell中的注释符是井号“#”,和其他编程语言一样,注释的那一行内容不会被解释器执行,但是要注意区别“#!”和“#”,前者是标记,后者才是注释符。

编写第一个shell脚本:

既然知道shell脚本的基本结构后,我们来编写第一个shell脚本吧:

vim Hello.sh

脚本内容如下:

5032
5032

执行shell脚本的方法有三种:

sh Hello.sh

chmod a+x Hello.sh; ./Hello.sh

bash Hello.sh

5033
5033

  第二种执行方法是给这个Hello.sh的脚本文件加上了可执行权限,所以可以当做一个二进制文件直接执行:

5034
5034

sh和bash实际上是同一个命令,因为sh是bash的软连接文件:

5035
5035

  要注意的是,#!/bin/bash写在文件的第一行才是被当做声明,如果写了两行#!/bin/bash,那么第二行就会被当做注释:

5036
5036

将系统命令写在脚本里就会被批量执行:

5037
5037

运行结果:

5038
5038

查看脚本执行过程 bash -x Hello.sh:

5039
5039

每一个“+”代表执行的命令,后面跟着命令的执行结果。

查看脚本是否语法错误 bash -n Hello.sh:

5041
5041

  没有任何的输出就代表这个脚本没有语法错误。

例如我把故意把脚本语法写错:

5042
5042

  如图,就会提示语法错误,并且还能告诉你错误出现在文件的第几行。

但是要注意的是,这只是检查脚本的语法错误,如果你系统命令写错了,是不会被检查到的。

20.3 date命令用法

5043
5043

date是一个与时间日期相关的命令,如果直接使用的话,是显示当前系统的日期时间:

5044
5044

date命令在shell脚本中作用很大,例如我在备份某个文件或者记录某些日志信息的时候,就可以使用这个命令给这些备份文件或日志信息标记一个时间。

以下介绍date命令的一些常见用法:

  1. 使用时间符号指定一个日期格式输出当前的年月日:
5045
5045

关于表示时间符号的解释:

%Y  4位的年份(Year)

%y  2位的年份

%M  表示当前的分钟(Minute)

%m  表示当前的月份(Month)

%D   以2位的格式输出当前的年月日

%d   表示当前的日期(Date)

%F   输出当前的年月日,以 - 为分隔

%H   输出当前的小时时间

%h   输出当前的月份

%s   输出时间戳

%S   输出秒

%T   输出当前时间,以 : 为分隔

%W   输出本周是今年的第几周

%w   输出本周是这个月的第几周

  1. 输出以冒号为分隔的时间:
5046
5046
  1. 把时间戳转换成当前日期:
5047
5047
  1. 打印一天后的日期:

date -d "+1 day" +%F

  1. 打印一天前的日期:

date -d "-1 day" +%F

  1. 打印一个月前的日期:

date -d "-1 month" +%F

  1. 打印一分钟前:

date -d "-1 min"

8. 打印一年前的日期:

date -d "-1 years" +%F

9. 打印一小时前:

date -d "-1 hour" +%T

10. 把一个日期转换成时间戳:

date +%s -d "2017-09-06 06:52:16"

另一个与时间相关的命令:cal,cal命令可以显示日历:

5048
5048

20.4 shell脚本中的变量

5049
5049

  shell脚本中的变量和其他编程语言中的变量含义是一样的,都是用来存储一个数据,然后使用变量名就可以进行调用了,shell脚本的语法和其他脚本的语法类似,都不需要使用分号作为语句的结束。

shell脚本定义变量的规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

定义一个变量:

a=10

name=”lisi”

调用变量时需要在变量名前面加上$:

echo $a

echo $name

只读变量:

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

5050
5050

运行脚本,结果如下:

5051
5051

删除变量:

使用 unset 命令可以删除变量里的数据。语法:

unset name

示例:

5052
5052

运行结果:

5053
5053

因为变量的内容被删除,所以输出的是空的。

变量类型:

运行shell时,会同时存在三种变量:

  1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

  2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

  3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-11-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档