20.1 shell是什么

  • shell是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。

  • 实际上,他在shell和计算机硬件之间还有一层东西——系统硬核。如果把计算机硬件比作一个人的躯体,那系统内核就是人的电脑。至于shell,把它比作人的五官似乎更贴切些。

  • 用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。


  • shell是一种脚本语言  微信公众号:aming_linux  博客:blog.lishiming.net shell从今天开始每天一看

  • 可以使用逻辑判断(if,if else),循环(for,while)等语法

  • 可以自定义函数

  • shell是系统命令的集合

  • shell脚本可以实现自动化运维,能大大增加我们的运维效率


  • shell应该怎么写?

  • 拿到需求,要有具体的思路,展开需求关联,开始写shell



20.2 Shell脚本结构和执行


1 创建shell目录,后面都把脚本写在里面

[root@AliKvn ~]# mkdir shell
[root@AliKvn ~]# ls

2 编写shell脚本

[root@AliKvn ~]# vim 01.sh
#!/bin/bash 
echo "123"
w
ls


参数解释:

#!/bin/bash 第一行必须要这么写,如果脚本只在本机执行可以负略这行,

但要考虑到在其他机器上运行的话,必须要加上,因为后面的命令是通过#!/bin/bash命令来解析命令的。


3 shell脚本执行方法有两种,

3.1 第一种是,给予脚本x执行权限

给予脚本x权限,可以./脚本名称 直接执行,或者是直接执行它(绝对路径)

[root@AliKvn shell]# chmod a+x 01.sh 
[root@AliKvn shell]# !ls
ls -ll 01.sh 
-rwxr-xr-x 1 root root 29 May 29 15:02 01.sh


[root@AliKvn shell]# ./01.sh 
123
 16:40:08 up 40 days,  2:15,  1 user,  load average: 0.03, 0.06, 0.06
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/1    211.148.147.194  14:52    0.00s  0.11s  0.00s w


而且还可以cat查看脚本内容,因为已经脚本已经有执行权限,并可以被/bin/bash解析

[root@AliKvn shell]# cat 01.sh 
#! /bin/bash 
echo "123"
w
ls


3.2 第二种

#bash 01.sh 或者#sh 01.sh

因为bash和sh是同一个文件输出


4 bash解析器的地址

实际上,/bin/sh/bin/bash是同一个文件,/bin/sh是链接于/bin/bash

[root@AliKvn shell]# ls -l /bin/bash
-rwxr-xr-x 1 root root 960608 Sep  7  2017 /bin/bash
[root@AliKvn shell]# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Oct 15  2017 /bin/sh -> bash


5 以#开头的行作为解释说明(第二行开始),它的作用仅仅是用来解释,并无任何执行意义。 

有些特殊脚本#是可以有效的,但不代表全部。


6 脚本的名字以.sh结尾,用于区分这是一个shell脚本


7 查看脚本执行过程 #bash -x 01.sh

[root@AliKvn shell]# bash -x 01.sh 
+ echo 123
123
+ w
 15:19:49 up 40 days, 55 min,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/1    211.148.147.194  14:52    5.00s  0.07s  0.00s bash -x 01.s
+ ls
01.sh

每个+表示一个操作,一个动作。


8 查看脚本是否语法错误,如果没有任何输出表示脚本没问题。

[root@AliKvn shell]# bash -n 01.sh

8.1 相反,如果有问题(只检测shell语法错误),会有错误信息输出

例如把脚本修改错误,添加有问题的for循环语法,故意不把for的结尾参数写上

[root@AliKvn shell]# vim 01.sh
#! /bin/bash 
for i in `seq 1 10`
do
 echo $i
echo "123"
w
ls

8.2 执行语法检查命令,把done补上,可以看到有报错

[root@AliKvn shell]# bash -n 01.sh

01.sh: line 9: syntax error: unexpected end of file

8.3 写入正确的参数 再检查

#! /bin/bash 
for i in `seq 1 10`
do
 echo $i
done
echo "123"
w
ls


录入正确参数后,无错误输出

[root@AliKvn shell]# bash -n 01.sh

*****以上用了#bash的命令都可以用#sh,因为指向同一个命令文件



20.3 date命令用法

date命令在shell脚本中常用的几个用法如下

date +%Y 表示以四位数字格式打印年份

date +%y 表示以两位数字格式打印年份

date +%m 表示月份

date +%d 表示日期

date +%H 表示小时

date +%h 表示月(英文)

date +%M 表示分钟

date +%S 表示秒

date +%w 表示星期。结果显示0则表示周日。


date
Tue May 29 15:52:08 CST 2018
#2018年
date +%Y   
2018
#18年
date +%y   
18
#月
date +%m    
05
#分钟
date +%M    
52
#日
date +%d   
29
#月-日-年
date +%D    
05/29/18
#年-月-日
date +%F   
2018-05-29
#时间戳,距离1970年1月1日0点0分0秒到现在有多少秒
date +%s    
1527580544
#当前的时间,精确到秒
date +%T   
15:59:37
#同上,跟date +%T一样的效果
date +%H:%M:%S    
16:01:55
#星期2,周二,周日是0
date +%w   
2
#今年的第几周,第22周
date +%W    
22



日期格式支持组合

年月日表示:20180529

[root@AliKvn shell]# date +%Y%m%d
20180529

日历形式查看日期

[root@AliKvn shell]# cal
      May 2018      
Su Mo Tu We Th Fr Sa
  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 31


#一天前
 date -d "-1 day"
Mon May 28 16:09:17 CST 2018
#日期可以组合+%F使用
 date -d "-1 day" +%F
2018-05-28
#一个月前
 date -d "-1 month" +%F
2018-04-29
#一年前
 date -d "-1 year" +%F
2017-05-29
#时间可以用+%T组合
 date -d "-1 hour" +%T
15:13:01
#date +%s 时间戳
#时间戳换算标准时间格式
date +%s
1527581785
date -d @1527581785
Tue May 29 16:16:25 CST 2018
#时间格式转换时间戳
date +%s -d  "2018-05-29 16:19:00"
1527581940


20.4 Shell脚本中的变量


  • 当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替

  • 使用条件语句时,常使用变量    if [ $a -gt 1 ]; then ... ; fi

  • 引用某个命令的结果时,用变量替代   n=`wc -l 1.txt`

  • 写和用户交互的脚本时,变量也是必不可少的  read -p "Input a number: " n; echo $n   如果没写这个n,可以直接使用$REPLY

  • 内置变量 $0, $1, $2…    $0表示脚本本身,$1 第一个参数,$2 第二个 ....       $#表示参数个数

  • 数学运算a=1;b=2; c=$(($a+$b))或者$[$a+$b]