笔记内容:
20.1 shell脚本介绍
20.2 shell脚本结构和执行
20.3 date命令用法
20.4 shell脚本中的变量
笔记日期:2017-11-21
20.1 shell脚本介绍
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脚本结构和执行
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
脚本内容如下:
执行shell脚本的方法有三种:
sh Hello.sh
chmod a+x Hello.sh; ./Hello.sh
bash Hello.sh
第二种执行方法是给这个Hello.sh的脚本文件加上了可执行权限,所以可以当做一个二进制文件直接执行:
502414B558881FC7674261B72/5034">
sh和bash实际上是同一个命令,因为sh是bash的软连接文件:
要注意的是,#!/bin/bash写在文件的第一行才是被当做声明,如果写了两行#!/bin/bash,那么第二行就会被当做注释:
将系统命令写在脚本里就会被批量执行:
运行结果:
查看脚本执行过程 bash -x Hello.sh:
每一个“+”代表执行的命令,后面跟着命令的执行结果。
查看脚本是否语法错误 bash -n Hello.sh:
例如我把故意把脚本语法写错:
如图,就会提示语法错误,并且还能告诉你错误出现在文件的第几行。
但是要注意的是,这只是检查脚本的语法错误,如果你系统命令写错了,是不会被检查到的。
20.3 date命令用法
date是一个与时间日期相关的命令,如果直接使用的话,是显示当前系统的日期时间:
date命令在shell脚本中作用很大,例如我在备份某个文件或者记录某些日志信息的时候,就可以使用这个命令给这些备份文件或日志信息标记一个时间。
以下介绍date命令的一些常见用法:
使用时间符号指定一个日期格式输出当前的年月日:
关于表示时间符号的解释:
%Y 4位的年份(Year)
%y 2位的年份
%M 表示当前的分钟(Minute)
%m 表示当前的月份(Month)
%D 以2位的格式输出当前的年月日
%d 表示当前的日期(Date)
%F 输出当前的年月日,以 - 为分隔
%H 输出当前的小时时间
%h 输出当前的月份
%s 输出时间戳
%S 输出秒
%T 输出当前时间,以 : 为分隔
%W 输出本周是今年的第几周
%w 输出本周是这个月的第几周
输出以冒号为分隔的时间:
把时间戳转换成当前日期:
打印一天后的日期:
date -d "+1 day" +%F
打印一天前的日期:
date -d "-1 day" +%F
打印一个月前的日期:
date -d "-1 month" +%F
打印一分钟前:
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命令可以显示日历:
20.4 shell脚本中的变量
shell脚本中的变量和其他编程语言中的变量含义是一样的,都是用来存储一个数据,然后使用变量名就可以进行调用了,shell脚本的语法和其他脚本的语法类似,都不需要使用分号作为语句的结束。
shell脚本定义变量的规则:
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
定义一个变量:
a=10
name=”lisi”
echo $a
echo $name
只读变量:
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
运行脚本,结果如下:
删除变量:
使用 unset 命令可以删除变量里的数据。语法:
unset name
示例:
运行结果:
变量类型:
运行shell时,会同时存在三种变量:
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行