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脚本可以实现自动化运维,能大大增加我们的运维效率
#比如批量的去安装系统,直接在机器上运行这个脚本就可以了
12.1脚本
-
shell脚本并不能作为正式的变成语言,因为它是在linux的shell中运行的,所以称为shell脚本。shell脚本就是一些命令的集合。把所有的操作都记录到一个文档中,然后去调用文档中的命令,这样一部操作就可以完成。这个文档就是shell脚本,只是这个shell脚本有它的特殊的格式。
-
shell脚本能帮助我们很方便地管理服务器,因为我们可以指定一个任务计划,定时去执行某个shell脚本以满足需求。
凡是自定义的脚本都放到/user/local/sbin/目录下。这样做的目的是:一来可以更好地管理文档;二来是以后接管你的管理员都知道自定义脚本放在哪里,方便维护。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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.
12.1.1 shell脚本的创建和执行
编写第一个shell脚本
[root@afeilinux-01 test1]# cd /usr/local/sbin
[root@afeilinux-01 sbin]# vim first.sh
#! /bin/bash
##This is my first shell script
## Writen by Afei 2019-09-03.
date
s is my first shell script
## Writen by Afei 2019-09-03.
date
echo "Hello world"
shell脚本通常都以.sh为后缀名。这并不是说不加.sh的脚本就不能执行,只是大家的一个习惯而已。本例中,脚本文件first.sh的第1行要以#! /bin/bash开头,表示该文件使用的是bash语法。如果不设置改行,你的shell脚本也能执行,但是不符合规范。#表示注释,后面跟一些该脚本的相关注释内容。因为随着工作时间的逐渐过渡,写的shell脚本也会越来越多,如果有一天你回头查看自己写过的某个脚本,很有可能忘记改脚本是用来干什么的以及什么时候写的。所以写上注释是有必要的。别的管理员也可以查看你的脚本。
执行这个脚本,如下所示:
[root@afeilinux-01 sbin]#sh -x first.sh
每一个+号表示一个操作,下面显示的是结果
+ date
2019年 09月 03日 星期二 17:05:51 CST
+ s is my first shell script
first.sh:行5: s: 未找到命令
+ date
2019年 09月 03日 星期二 17:05:51 CST
+ echo 'Hello world'
Hello world
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
1567504194
[root@axinlinux-01 shell]# date +%s -d "2019-09-03 18:05:05"
1567505105
[root@afeilinux-01 sbin]# date -d @1567505105
2019年 09月 03日 星期二 18:05:05 CST
date -d "+1day" 一天后
date -d "-1 day" 一天前
#比如,我们删除昨天的日志
[root@axinlinux-01 shell]# date -d "-1 day"
2019年 09月 02日 星期一 18:10:04 CST
[root@axinlinux-01 shell]# date -d "-1 day" +%F
2019-09-02
date -d "-1 month" 一月前
date -d "-1 min" 一分钟前
date +%w, date +%W 星期
+%w(week)表示周几
+%W表示今年的第几周
~5.cal #查看日历
[root@axinlinux-01 shell]# cal
九月 2019
日 一 二 三 四 五 六
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]
[root@afeilinux-01 sbin]# vim variable.sh
#! /bin/bash
## In this script we will use variables.
## Writen by Aming 2017-02-2
d='date +%H:%M:%S'
echo "The script begin at $d."
echo "Now we'll sleep 2 seconds."
sleep 2
d1='date +%H:%M:%S'
echo "The script end at $d1."
[root@afeilinux-01 sbin]# sh variable.sh
The script begin at date +%H:%M:%S.
Now we'll sleep 2 seconds.
The script end at date +%H:%M:%S.
数学计算
[root@afeilinux-01 sbin]# vim sum.sh
#! /bin/bash
## For get the sum of two numbers.
## Writen by Afei 2019-09-03.
a=1
b=2
sum=$[$a+$b]
echo "$a+$b=$sum"
[root@afeilinux-01 sbin]# sh sum.sh
1+2=3
数学计算要用【】括起来,而且前面要加符号$.
和用户交互
[root@afeilinux-01 sbin]# vim read.sh
#! /bin/bash
## Using 'read' in shell script.
## Aming 2019-09-04
read -p "Please input a number: "x
read -p "Please input another number: "y
sum=$[$x+$y]
echo "The sum of the two numbers is: $sum"
shell脚本预设变量
shell脚本在执行时,后面可以跟一个或者多个参数。
[root@afeilinux-01 sbin]# vim option.sh
#! /bin/bash
sum=$[$1+$2]
echo "sum=$sum"
该脚本的执行结果:
+ sum=3
+ echo sum=3
sum=3
$0代表脚本本身的名字
#! /bin/bash
sum=$[$1+$2]
echo "$1 $2 $0"
脚本执行的结果
1 2 option.sh