shell腳本介紹
- shell是一種腳本語言 和傳統的開發語言比較,會比較簡單
- shell有本身的語法;可使用邏輯判斷、循環等語法
- 能夠自定義函數,目的就是爲了減小重複的代碼
- shell是系統命令的集合
- shell腳本能夠實現自動化運維,能大大增長咱們的運維效率
shell腳本結構和執行
- 開頭須要加#!/bin/bash
- 以#開頭的行做爲解釋說明
- 腳本的名字以.sh結尾,用於區分這是一個shell腳本
- 執行方法有兩種
- chmod +x 1.sh; ./1.sh
- bash 1.sh
- 查看腳本執行過程 bash -x 1.sh
- 查看腳本是否語法錯誤 bash -n 1.sh
實踐操做:
[root@yong-01 ~]# mkdir shell
[root@yong-01 ~]# cd shell/
[root@yong-01 shell]#
- 寫shell腳本
- #! /bin/bash //第一行必須這麼寫,固定格式,做用就是腳本如果在當臺機器上去執行,能夠不加這一行也不要緊,由於它知道下面若干條的命令能在這臺機器上去執行,去解析
[root@yong-01 shell]# vim 1.sh
#!/bin/bash
echo "abc"
w
ls
[root@yong-01 shell]# sh 1.sh
abc
22:52:59 up 2 min, 1 user, load average: 0.19, 0.22, 0.09
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.180.1 22:50 3.00s 0.06s 0.00s sh 1.sh
1.sh
- 在當前終端裏,把1.sh中的#! /bin/bash 去掉後在執行腳本,會看到獲得的結果相同,不會出現任何的問題,這就說明這臺機器是能識別裏面一條一條的命令的,去運行這裏面的命令;但如果換一臺機器,就不必定能執行了
- 在第一行,文件頭指定 #!/bin/bash ,接下來要運行的命令是經過哪個解釋器來操做的,一般都是 /bin/bash 解釋器來執行的
- 給1.sh文件一個執行權限 chmod a+x 1.sh
[root@yong-01 shell]# chmod a+x 1.sh
- 執行shell腳本 ./1.sh 能這樣執行,說明這些命令被解析了,被/bin/bash認識了
[root@yong-01 shell]# ./1.sh
abc
22:56:26 up 5 min, 1 user, load average: 0.01, 0.11, 0.07
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.180.1 22:50 2.00s 0.06s 0.00s /bin/bash ./1.sh
1.sh
- /bin/bash也是一條命令, /bin/bash 和 /bin/sh 是同一個文件
[root@yong-01 shell]# ll /bin/bash
-rwxr-xr-x. 1 root root 960472 8月 3 2017 /bin/bash
[root@yong-01 shell]# ll /bin/sh
lrwxrwxrwx. 1 root root 4 3月 6 20:09 /bin/sh -> bash
- 1.sh文件內容就是被/bin/bash所解析的
- 若沒有 /bin/bash ,可使用 /bin/bash 1.sh去執行
[root@yong-01 shell]# /bin/bash 1.sh
abc
22:57:50 up 7 min, 1 user, load average: 0.00, 0.08, 0.07
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.180.1 22:50 6.00s 0.10s 0.00s w
1.sh
- 如果在shell腳本中在寫入第二遍 #號開頭的行, 就表示解釋說明的做用
- 腳本的通常都是以.sh結尾,是爲了區分這是一個shell腳本,不然須要打開這個文件,才知道是shell腳本
- 運行shell腳本有兩種方法
- 一種是sh 1.sh運行shell腳本
- 另外一種方法
- 先 chmod a+x 1.sh 給文件加一個執行權限
- 再 ./1.sh 去執行
- 這裏的 ./ 就至關於一個相對路徑,相對當前一個路徑
- 也可使用絕對路徑去執行腳本 /root/shell/1.sh ,其實就是找到這個文件去執行
[root@yong-01 shell]# /root/shell/1.sh
abc
22:58:22 up 7 min, 1 user, load average: 0.00, 0.07, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.180.1 22:50 6.00s 0.10s 0.00s /bin/bash /root/shell/1.sh
1.sh
- 查看腳本執行過程 sh -x 1.sh 或者bash -x 1.sh
- -x,就是顯示腳本執行的過程
- 每個加號,表示一個操做步驟
[root@yong-01 shell]# sh -x 1.sh
+ echo abc
abc
+ w
22:58:45 up 8 min, 1 user, load average: 0.00, 0.07, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.180.1 22:50 5.00s 0.11s 0.00s w
+ ls
1.sh
- 查看腳本是否有錯誤 sh -n 1.sh
- 如果沒有任何的輸出,那麼腳本則沒有錯誤
- sh -n 1.sh命令是檢測是否存在語法錯誤
[root@yong-01 shell]# sh -n 1.sh
date命令用法
- date +%Y-%m-%d, date +%y-%m-%d 年月日
- date +%H:%M:%S = date +%T 時間
- date +%s 時間戳
- date -d @1504620492
- date -d "+1day" 一天後
- date -d "-1 day" 一天前
- date -d "-1 month" 一月前
- date -d "-1 min" 一分鐘前
- date +%w, date +%W 星期
date命令用法實踐
[root@yong-01 ~]# date
2018年 07月 11日 星期三 23:00:25 CST
- date命令,在shell中用處很是大;對文件後綴增長一個時間,以便後期管理
- date +%Y-%m-%d, date +%y-%m-%d 年月日
[root@yong-01 ~]# LANG=en 切換爲英文顯示
[root@yong-01 ~]# date
Wed Jul 11 23:01:05 CST 2018
[root@yong-01 ~]# date +%Y
2018 四位的年
[root@yong-01 ~]# date +%y
18 兩位的年
[root@yong-01 ~]# date +%m
07 月份
[root@yong-01 ~]# date +%M
02 分鐘
[root@yong-01 ~]# date +%d
11 日期
[root@yong-01 ~]# date +%D
07/11/18 直接標記年月日,不過格式比較特殊
[root@yong-01 ~]# date +%Y%m%d
20180711 年月日
[root@yong-01 ~]# date +%F
2018-07-11 年月日,這種帶橫槓的
[root@yong-01 ~]# date +%w
3 表示周幾
[root@yong-01 ~]# date +%W
28 今年的第幾周,今年的第28周
[root@yong-01 ~]# date +%h
Jul 英文的月份
[root@yong-01 ~]# date +%H
23 小時
[root@yong-01 ~]# date +%S
53 秒
[root@yong-01 ~]# date +%s
1531322044 這是一個時間戳,距離1970總共過去多少秒
- 時間其餘標記方法
- date +%H:%M:%S = date +%T 時間
[root@yong-01 ~]# date +%T
23:14:29
[root@yong-01 ~]# date +%H:%M:%S
23:14:57
[root@yong-01 ~]# cal
July 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
- 標記以前的日期
- 好比:在作nginx日誌切割的時候,到了凌晨切割日誌,到了零點零分切割的日誌是前一天的日誌。因此把日誌加一個時間標記的話,應標記爲昨天的日期
- 學會用date標記以前的日期
- day、month、year、hour、min後面能夠加 s 能夠不加 s
- 減號- 表示以前的日期,加號 + 表示從今日後的日期
- date -d "-1 day" +%F 顯示前一天的日期
- date -d "-1 month" +%F 顯示上個月的日期
- date -d "-1 years" +%F 顯示上一年的日期
- date -d "+1 hour" +%T 顯示下一小時
- date -d "+1 min" +%T 顯示下一分鐘
[root@yong-01 ~]# date -d "-1 day"
Tue Jul 10 23:16:11 CST 2018
[root@yong-01 ~]# date -d "-1 day" +%F
2018-07-10
[root@yong-01 ~]# date -d "+1 month" +%F
2018-08-11
[root@yong-01 ~]# date -d "+1 year" +%F
2019-07-11
[root@yong-01 ~]# date -d "-1 hour" +%T
22:17:14
[root@yong-01 ~]# date -d "-1 min" +%T
23:16:21
- 時間戳 date +%s
- 另外一種表現方法,表示時間戳
- date -d @1531322291就是@後跟時間戳
[root@yong-01 ~]# date +%s
1531322291
[root@yong-01 ~]# date -d @1531322291
Wed Jul 11 23:18:11 CST 2018
- 若想在linux系統中,把具體的日期換算成時間戳的時候,可使用date +%s -d "2018-07-11 23:18:11"
[root@yong-01 ~]# date +%s -d "2018-07-11 23:18:11"
1531322291
[root@yong-01 ~]# date -d @1531322291
Wed Jul 11 23:18:11 CST 2018
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]