shell介绍
shell是工作中必备的技能,才能胜任运维的工作。它是一种脚本语言。它较于python、编程语言C、PHP来说算是比较简单的了。
shell其实是系统命令的集合,将一些命令写入到文件中,再去执行这个文件。它也有自己的语法规则,比如使用逻辑判断、循环等。
可以关注公众号aming_linux或者是blog。lishiming.net来练习
在shell中也是可以自定义函数的,目的是为了减少重复出现的代码。
shell脚本可以实现自动化运维,能大大增加我们的运维效率
Shell脚本结构和执行
编写shell脚本时,第一行必须写成
#!/bin/bash
,它的作用是后面语句是由/bin/bash 去解析的。因为有了它才能这样去执行./123.sh
或者/bin/bash 123.sh
给文件增加x权限,就可以
./123.sh
这样去执行,不然的话使用sh命令。例sh 123.sh
脚本中所有已#开头的行为解释说明。在系统中存在一个特殊的脚本,/etc/init.d/network中有2行是比较特殊的
chkconfig: 2345 10 90 /定义启动脚本的级别。第10个启动,第90个关闭
description: Activates/Deactivates all network interfaces configured to \ start at boot time. //针对该脚本的解释说明
这2行是必须存在的,如果没有这二行,那么启动脚本就不能加入开户启动项中。
所写的脚本最好是以.sh结尾,是为了以后方便查找,也为了后面的其他人员接手工作能知道它是什么。
执行方式有2种
(1)先增加x权限,再./123.sh
(2)bash 123.sh
查看脚本执行过程可以使用-x选项
sh -x 123.sh
- 查看脚本是否有语法错误
sh -n 123.sh
date命令用法
date命令单独使用用来显示系统的时间。在shell中它的作用很大,比如在脚本中标记一个日志,或者针对一个文件进行更改,可以使用date给它进行装饰。例如,每天备份mysql,生成一个.sql文件,就可以针对这个sql文件增加一个日期标记。这样就能很清晰的知道备份的sql文件是在哪一天生成的。还可以标记一个星期几,下周就会覆盖这一周的文件,这样就不用手动的去删除这些文件了
标记年月日
date +%Y-%m-%d //%Y表示4位数的年 比如2018
date +%y-%m-%d //%y 表示2位数的年 比如18
%m 表示月份 %M表示分钟
[root@zcy-1 ~]# date +%Y
2018
[root@zcy-1 ~]# date +%y /年
18
[root@zcy-1 ~]# date +%m /月份
04
[root@zcy-1 ~]# date +%M /分钟
09
[root@zcy-1 ~]# date +%d /年
18
[root@zcy-1 ~]# date +%D
04/18/18
[root@zcy-1 ~]# date +%Y%m%d
20180418
[root@zcy-1 ~]# date +%F
2018-04-18
[root@zcy-1 ~]# date +%H //小时
00
[root@zcy-1 ~]# date +%S //秒数
38
时间标记
[root@zcy-1 ~]# date +%T //0点16分12秒
00:16:12
[root@zcy-1 ~]# date +%H:%M:%S
00:18:26
周数或者星期几
[root@zcy-1 ~]# date +%w /周3
3
[root@zcy-1 ~]# date +%W / 今年的16周
16
cal用来显示日历
[root@zcy-1 ~]# 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
date表示之前的日期
[root@zcy-1 ~]# date
2018年 04月 18日 星期三 00:23:43 CST
[root@zcy-1 ~]# date -d "-1 day "
2018年 04月 17日 星期二 00:23:46 CST
[root@zcy-1 ~]# date -d "-1 day " +%F
2018-04-17
[root@zcy-1 ~]# date -d "-1 month " +%F
2018-03-18
[root@zcy-1 ~]# date -d "-1 years " +%F
2017-04-18
标记时间戳
[root@zcy-1 ~]# date +%s -d "2108-04-18 00:28:55"
4364123335
[root@zcy-1 ~]# date -d @4364123335
2108年 04月 18日 星期三 00:28:55 CST
shell脚中的变量
什么时候使用变量呢
当脚本中使用某个字符串较频繁并且字符串长度很长的时候就应该使用变量代替。它可以使脚本比较小巧,对于一些修改或者是其他的操作,也能很好的去修改。-使用条件语句时,常使用变量
if [$a -gt 1];then ...; fi
引用某个命令的结果时,用变量替代
n='wc -l 1.txt'
写和用户交互的脚本时,变量也是必不可少的
read -p "lnput a number:"n; echo $n
如果没有写这个n,可以直接使用$REPLY-在shell中是有内置变量的
1 表示第一个参数
# 表示参数的个数数学运算 中使用变量
a=1;b=2;c=$(($a+$b))
a=1;b=2;c=$[$a+$b]
2种表示方法输出的结果是一样的
- 变量简单的讲就是一个变化的参数、一个数值或者是一个字符串,可以引用它,调用它。
Shell脚本中的逻辑判断
在shell脚本中很多地方都是逻辑判断,比如判断数值、判断文件,针对判断的结果再去做一些操作。没有判断就不能去做一些操作,不然只能纯粹的去敲命令了。
shell 中逻辑判断的语法
(1)格式1:if 条件 ; then 语句 ; fi
这里if 与fi是相对应的,表示满足条件后又怎么样。
[root@zcy-2 ~]# a=5
[root@zcy-2 ~]# if [ $a -gt 4 ] ; then echo ok; fi
ok
[root@zcy-2 ~]# if [ $a -gt 6 ] ; then echo ok; fi
[root@zcy-2 ~]#
``` 这里-gt表示大于,当a大于4的时候就输出ok ,超过a变量的值的 时候没有任何输出。
编写一个简单的脚本if1.sh,并执行它
<div class="se-preview-section-delimiter"></div>
[root@zcy-2 shell]# cat if1.sh
!/bin/bash
a=8
if [ $a -gt 3 ]
then
echo ok
fi
[root@zcy-2 shell]#
[root@zcy-2 shell]# sh if1.sh
ok
[root@zcy-2 shell]#
该种格式使用较频繁
(2)格式2
<div class="se-preview-section-delimiter"></div>
if 条件; then 语句; else 语句; fi //表示满足条件这怎么样,不满足条件又怎么样
<div class="se-preview-section-delimiter"></div>
[root@zcy-2 shell]# cat if2.sh
!/bin/bash
a=2
if [ $a -gt 3 ]
then
echo ok
else
echo bad
fi
[root@zcy-2 shell]# sh -x if2.sh
+ a=2
+ ‘[’ 2 -gt 3 ‘]’
+ echo bad
bad
[root@zcy-2 shell]#
表示a的值大于3输出OK ,不大于3的时候输出bad
(3)格式3
<div class="se-preview-section-delimiter"></div>
if 条件; then 语句 ; elif 条件 ; then 语句 ; else 语句 ; fi
举个栗子
<div class="se-preview-section-delimiter"></div>
[root@zcy-2 shell]# !cat
cat if3.sh
!/bin/bash
a=4
if [
a -lt 6 ]
then
echo “ok”
else
echo bad
fi
[root@zcy-2 shell]# sh -x if3.sh
+ a=4
+ ‘[’ 4 -gt 5 ‘]’
+ ‘[’ 4 -lt 6 ‘]’
+ echo ok
ok
[root@zcy-2 shell]#
[root@zcy-2 shell]# cat if3.sh
!/bin/bash
a=4
if [
a -lt 3 ]
then
echo “ok”
else
echo bad
fi
[root@zcy-2 shell]# sh -x if3.sh
+ a=4
+ ‘[’ 4 -gt 5 ‘]’
+ ‘[’ 4 -lt 3 ‘]’
+ echo bad
bad
[root@zcy-2 shell]#
表示当满足a大于5的时候输出>1
当满足a小于6的时候输出OK
当2个条件都不满足时输出bad
(4)3种格式中第3种的格式是很少用到的,第一种是常用的
- 逻辑判断表达式
<div class="se-preview-section-delimiter"></div>
if [
b ] /a大于b
if [
b -eq 10 ] /b 等于10
<div class="se-preview-section-delimiter"></div>
-gt /表示> 大于
-lt /表示< 小于
-ge /表示>= 大于或等于
-le /表示<= 小与或等于
-eq /表示 == 等于
-ne /表示!= 不等于
- 可以使用&& 和 | | 结合多个条件
<div class="se-preview-section-delimiter"></div>
if [
a -lt 10 ]; then //需要同时满足这2个条件,并且的意思
if [
b -lt 4 ]; then //2个条件满足其中一个都可以 或者的意思
“`