20.1 shell腳本介紹
• shell是一種腳本語言 aming_linux blog.lishiming.net
• 可以使用邏輯判斷、循環等文法
• 可以自定義函數
• shell是系統指令的集合
• shell腳本可以實作自動化運維,能大大增加我們的運維效率
20.2 shell腳本結構和執行
shell腳本結構
開頭
開頭需要加#!/bin/bash
[root@linux-5 ~]# mkdir shell
[root@linux-5 ~]# cd shell
[root@linux-5 shell]# vim lem01.sh
#!/bin/bash
寫shell腳本,第一行必須寫#! /bin/bash,固定格式,作用是指定腳本中指令所需的解釋器,腳本若是在當台機器上去執行,可以不加這一行也沒關系,因為它知道下面若幹條的指令能在這台機器上去執行,去解析,通常都是 /bin/bash 解釋器來執行的
/bin/bash也是一條指令, /bin/bash 和 /bin/sh 是同一個檔案
[root@linux-5 shell]# ll /bin/bash
-rwxr-xr-x. 1 root root 960472 8月 3 2017 /bin/bash
[root@linux-5 shell]# ll /bin/sh
lrwxrwxrwx. 1 root root 4 3月 4 05:42 /bin/sh -> bash
lem01.sh檔案内容就是被/bin/bash所解析的
若shell腳本中首行沒有/bin/bash ,可以使用 /bin/bash lem01.sh去執行
解釋說明
以#開頭的行作為解釋說明,除了腳本首行的特殊性以外,若是在shell腳本中的第二行寫入#号開頭的行, 就表示解釋說明的作用
shell腳本執行
運作shell腳本有兩種方法
一種是sh lem01.sh運作shell腳本
另一種方法
先 chmod a+x lem01.sh 給檔案加一個執行權限
再 ./lem01.sh 去執行
[root@linux-5 shell]# chmod a+x lem01.sh
[root@linux-5 shell]# ./lem01.sh
這裡的 ./ 就相當于一個相對路徑,相對目前一個路徑
也可以使用絕對路徑去執行腳本 /root/shell/lem01.sh ,其實就是找到這個檔案去執行
檢視腳本執行過程
執行時加入-x,-x就是顯示腳本執行的過程
[root@linux-5 shell]# sh -x lem01.sh
+ w
11:36:51 up 33 min, 1 user, load average: 0.01, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.88.1 11:06 3.00s 0.04s 0.00s sh -x lem01.sh
每一個加号,表示一個操作步驟
檢視腳本是否有文法錯誤
執行時加入-n,-n就是檢測腳本執行是否有文法錯誤
[root@linux-5 shell]# sh -n lem01.sh
[root@linux-5 shell]#
若是沒有任何的輸出,那麼腳本則沒有錯誤
20.3 date指令用法
date指令,可以顯示目前系統時間日期
[root@linux-5 shell]# date
2018年 07月 12日 星期四 11:58:05 CST
date指令在shell中的作用
date指令,在shell中用處非常大;對檔案字尾增加一個時間,以便後期管理
常見的日期機關
[root@linux-5 shell]# date +%Y
2018 //四位的年
[root@linux-5 shell]# date +%y
18 //兩位的年
[root@linux-5 shell]# date +%m
07 //月份
[root@linux-5 shell]# date +%h
7月 //月份
[root@linux-5 shell]# date +%w
4 //表示周幾
[root@linux-5 shell]# date +%W
28 //今年的第幾周,今年的第28周
[root@linux-5 shell]# date +%d
12 //日期
[root@linux-5 shell]# date +%D
07/12/18 //直接标記年月日,不過格式比較特殊
[root@linux-5 shell]# date +%Y%m%d
20180711 //年月日
[root@linux-5 shell]# date +%F
2018-07-11 //年月日,這種帶橫杠的
常見的時間機關
[root@linux-5 shell]# date +%H
12 //小時
[root@linux-5 shell]# date +%M
32 //分鐘
[root@linux-5 shell]# date +%S
53 //秒
[root@linux-5 shell]# date +%T
13:41:37 //整體時間
[root@linux-5 shell]# date +%s
1531322044 //這是一個時間戳,距離1970年1月1日0點0分總共過去多少秒
顯示月曆
[root@linux-5 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 31
标記指定的日期
在做nginx日志切割的時候,到了淩晨切割日志,到了零點零分切割的日志是前一天的日志。是以把日志加一個時間标記的話,應标記為昨天的日期
減号- 表示之前的日期,加号 + 表示從今往後的日期
date -d "-1 day" +%F ##顯示前一天的日期
date -d "-1 month" +%F ##顯示上個月的日期
date -d "-1 years" +%F ##顯示上一年的日期
date -d "+1 hour" +%T ##顯示下一小時
時間戳換算
[root@linux-5 shell]# date +%s -d "2018-07-12 13:48:11"
1531374491
[root@linux-5 shell]# date -d @1531374491
2018年 07月 12日 星期四 13:48:11 CST
20.4 shell腳本中的變量
•當腳本中使用某個字元串較頻繁并且字元串長度很長時就應該使用變量代替
• 使用條件語句時,常使用變量 if [ $a -gt 1 ]; then ... ; fi
• 引用某個指令的結果時,用變量替代 n=`wc -l 1.txt`