20.1 shell脚本介绍
20.2 shell脚本结构和执行
20.3 date命令用法
20.4 shell脚本中的变量
20.1 shell脚本介绍:
~~1.shell是什么
shell是一种脚本语言 aming_linux blog.lishiming.net(shell的练习题)
#与传统的C语言、php语言相比,还是很简单的
可以使用逻辑判断、循环等语法
可以自定义函数
shell是系统命令的集合
#比如在凌晨三点的时候,去执行若干条命令。就可以把命令写入一个脚本,到点去执行就行了(批量的去执行这些命令)
shell脚本可以实现自动化运维,能大大增加我们的运维效率
#比如批量的去安装系统,直接在机器上运行这个脚本就可以了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.2 shell脚本结构和执行:
~1.开头需要加#!/bin/bash
#如果我们在这台机器上能够执行添加的命令,就可以不用写这一行。如果换一台可能不能执行
~2.以#开头的行作为解释说明
#就是说,我们接下来要执行的命令,是通过哪个解释器来操作的。通常都是/bin/bash,说明我们接下来需要运行的这些命令/语句,是通过/bin/bash这个解释器来执行的
~3.脚本的名字以.sh结尾,用于区分这是一个shell脚本
#也方便后期我们去找
~4.执行方法有两种
chmod +x 1.sh; ./1.sh
#先给这个文件执行权限。我们可以直接在目录下 ./1.sh 去执行(当然也可以写绝对路径、./是相对路径)
bash 1.sh #或者直接sh 1.sh
~5.查看脚本执行过程 bash -x 1.sh
#我们只能sh -x 1.sh,就不能相对或绝对路径了
~6.查看脚本是否语法错误 bash -n 1.sh
#没有任何的输出就代表没有错
实例:
[root@axinlinux-01 ~]# vim /etc/init.d/network
#! /bin/bash #这一行就是文件头,代表bin/bash解释的
# #一般情况下,除了文件头的#,其他的都代表解释说明
# network Bring up/down networking
#
# chkconfig: 2345 10 90 #这个比较特殊。用来定义启动脚本的级别(2345)。10代表顺序,第10个启动,第90个关闭
# description: Activates/Deactivates all network interfaces configured to \ #这个是代表脚本的解释说明
#以上这两行 chkconfig与description必须要有。不然这个启动脚本没办法加入到chkconfig列表里面去。这个脚本属于特殊的脚本
以下剩下的#都代表解释说明
# start at boot time.
#
### BEGIN INIT INFO
# Provides: $network
# Should-Start: iptables ip6tables NetworkManager-wait-online NetworkManager $network-pre
# Short-Description: Bring up/down networking
# Description: Bring up/down networking
### END INIT INFO
~5.
[root@axinlinux-01 shell]# sh -x 01.sh
+ echo $'\342\200\234123\342\200\235' #每一个+号表示一个操作,下面显示的是结果
“123”
+ w
22:21:04 up 20 min, 1 user, load average: 0.00, 0.02, 0.10
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.208.1 22:04 0.00s 3.20s 0.00s w
+ ls
01.sh
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.3 date命令用法:
date在shell当中作用很大。比如,针对某一个文件做更改。我们每天去备份一个文件(一个mysql),最终生成一个.sql的文件。那么我们可以针对这个sql文件加一个日期标记,这样就可以很清晰的额知道,备份的这个sql文件是哪一天生成的。
比如,我们还可以给他标记星期几。比如周一叫1.sql,周二叫2.sql,那么一周下来。下一周的周一他就可以把之前上一周的1.sql给覆盖。这样我们就不用手动的去删除这些文件了
~1.
date +%Y-%m-%d, date +%y-%m-%d 年月日
+%Y(year)表示2018,+%y表示18
+%m(month)表示月,+%M(minute)表示分钟
+%d(date)表示日期,+%D表示年月日
date +%Y%m%d
20180913
date +%F
2018-09-13
~2.
date +%H:%M:%S = date +%T 时间
+%H(hour)表示小时
+%M(minute)表示分钟
+%S(second)表示秒
+%T
22:48:12
~3.
date +%s 时间戳
距离1970-01-01-00-00到现在过去多少秒
~4.
date -d @1504620492
把具体的日期换算成时间戳:date +%s -d "2018-09-13 23:01:17"
把时间戳换算成具体的日期:date -d @1536850983
[root@axinlinux-01 shell]# date +%s
1536850933
[root@axinlinux-01 shell]# date +%s -d "2018-09-13 23:03:03"
1536850983
[root@axinlinux-01 shell]# date -d @1536850983
2018年 09月 13日 星期四 23:03:03 CST
以上是互相换算的方法
date -d "+1day" 一天后
date -d "-1 day" 一天前
#比如,我们删除昨天的日志
[root@axinlinux-01 shell]# date -d "-1 day"
2018年 09月 12日 星期三 22:57:08 CST
[root@axinlinux-01 shell]# date -d "-1 day" +%F
2018-09-12
date -d "-1 month" 一月前
date -d "-1 min" 一分钟前
date +%w, date +%W 星期
+%w(week)表示周几
+%W表示今年的第几周
~5.cal #查看日历
[root@axinlinux-01 shell]# cal
九月 2018
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.4 shell脚本中的变量:
shell当中到处都会使用变量。
变量可理解为 一个变化的参数,一个数值,又或者一个字符串。我们可以反复的去引用它,调用它
以下,为什么情况下用到变量
~1.当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替
#比如脚本中经常用到的全局路径
~2.使用条件语句时,常使用变量 if [ $a -gt 1 ]; then ... ; fi
~3.引用某个命令的结果时,用变量替代 n=`wc -l 1.txt`
~4.写和用户交互的脚本时,变量也是必不可少的 read -p "Input a number: " n; echo $n 如果没写这个n,可以直接使用$REPLY
~5.内置变量 $0, $1, $2… $0表示脚本本身,$1 第一个参数,$2 第二个 .... $#表示参数个数
#比如脚本的名字叫1.sh,那么$0就代表1.sh
~6.数学运算a=1;b=2; c=$(($a+$b))或者$[$a+$b]