笔记内容:

  • 20.1 shell脚本介绍

  • 20.2 shell脚本结构和执行

  • 20.3 date命令用法

  • 20.4 shell脚本中的变量

笔记日期:2017-11-21


20.1 shell脚本介绍

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

  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


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

sh Hello.sh

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

bash Hello.sh

5033


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

5034


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

5035


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

5036


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

5037


运行结果:

5038


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

5039

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


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

5041

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

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

5042

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

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




20.3 date命令用法

5043

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

5044


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


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

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

5045

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

%Y  4位的年份(Year)

%y  2位的年份

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

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

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

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

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

%H   输出当前的小时时间

%h   输出当前的月份

%s   输出时间戳

%S   输出秒

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

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

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


  1. 输出以冒号为分隔的时间:

5046


  1. 把时间戳转换成当前日期:

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






20.4 shell脚本中的变量

5049

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

shell脚本定义变量的规则:

  • 首个字符必须为字母(a-z,A-Z)。

  • 中间不能有空格,可以使用下划线(_)。

  • 不能使用标点符号。

  • 不能使用bash里的关键字(可用help命令查看保留关键字)。


定义一个变量:

a=10

name=”lisi”


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

echo $a

echo $name


只读变量:

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

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

5050


运行脚本,结果如下:

5051



删除变量:

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

unset name


示例:

5052


运行结果:

5053

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


变量类型:

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

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

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

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





如果文中图片失效,请点击以下链接查看:

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