一、shell腳本介紹:linux
shell是一種腳本語言和傳統的開發語言相比,會比較簡單:shell
shell有本身語法,能夠支持邏輯判斷、循環等語法:bash
能夠自定義函數,目的是減小重複的代碼:運維
shell是系統命令的集合:函數
shell腳本能夠實現自動化運維,能大大增長咱們的運維效率:spa
二、shell腳本結構和執行:.net
開頭須要加#!bin/bashcode
#號開頭註釋,解釋說明:ip
腳本須要以.sh結尾,用以區分是shell腳本:開發
執行的方法有兩種:
chmod +x 1.sh ; sh 1.sh
bash 1.sh
查看腳本的執行過程: sh -x 1.sh
查看腳本的是否語法錯誤: sh -n 1.sh
三、shell腳本操做:
建立一個shell目錄,用於寫shell腳本: mkdir shell ; cd shell
#!bin/bash 第一行必需要這樣寫,固定的格式,表示在當前機器上用什麼命令去執行這個腳本:
[root@localhost_02 shell]# cat 1.sh #!/bin/bash echo "123" w ls
執行腳本: sh 1.sh
[root@localhost_02 shell]# sh 1.sh 123 14:47:01 up 1:28, 1 user, load average: 0.03, 0.03, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.149.135 13:20 5.00s 0.04s 0.00s w 1.sh :q!
註釋:在當前機器上,不加"#!/bin/bash"也是能夠執行的,獲得的結果也相同,說明機器能夠識別到每一條命令,可是換一臺機器就不必定能能夠執行。
一般指定"#!/bin/bash"後,接下來要運行的這些命令是經過哪個解釋器來操做的,一般都是/bin/bash這個解釋器來執行的,它的做用都在於此:
3:經過給文件一個執行權限: chmod a+x 1.sh
執行./1.sh ,說明它的這行命令已經解析,被bin/bash認識了:
[root@localhost_02 shell]# chmod a+x 1.sh [root@localhost_02 shell]# ./1.sh 123 14:50:13 up 1:31, 1 user, load average: 0.01, 0.02, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.149.135 13:20 5.00s 0.05s 0.00s /bin/bash ./1.sh 1.sh :q!
其實/bin/bash和bin/sh是同一個文件: 鏈接文件:
[root@localhost_02 shell]# ls -l /bin/bash -rwxr-xr-x. 1 root root 960472 8月 3 2017 /bin/bash [root@localhost_02 shell]# ls -l /bin/sh lrwxrwxrwx. 1 root root 4 5月 31 22:04 /bin/sh -> bash
若沒有/bin/sh這個文件:則可使用/bin/bash這個命令來執行:
[root@localhost_02 shell]# /bin/bash 1.sh 123 14:53:19 up 1:34, 1 user, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.149.135 13:20 7.00s 0.09s 0.03s w 1.sh :q!
註釋:若以"#"開頭的則表示解釋說明,在腳本中第二行開始開頭的:
腳本通常都是以sh結尾的,用於區分是shell腳本,如若沒有,則須要查看這個文件才能知道是shell腳本:
shell有兩種執行方式:
1) sh 1.sh 運行shell腳本:
2) chmod a+x 1.sh 先給腳本添加一個執行權限,
而後 ./1.sh 來執行.
這裏的 ./ 是一個相對路徑的目錄,表示當前目錄:
也可使用絕對路徑來執行: /root/shell/1.sh #其實就是找到這個文件再執行:
[root@localhost_02 shell]# /root/shell/1.sh 123 15:04:11 up 1:45, 1 user, load average: 0.01, 0.03, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.149.135 13:20 3.00s 0.07s 0.01s w 1.sh :q!
查看腳本的執行過程: 註釋:每個加號,則表示一個操做步驟:
sh -x 1.sh 或者 /bin/bash -x 1.sh
[root@localhost_02 shell]# sh -x 1.sh + echo 123 123 + w 15:06:37 up 1:47, 1 user, load average: 0.02, 0.03, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.149.135 13:20 5.00s 0.06s 0.00s sh -x 1.sh + ls 1.sh :q!
查看腳本是否有錯誤: 註釋:若沒有錯誤,則不會有任何的輸出:
sh -n 1.sh
[root@localhost_02 shell]# sh -n 1.sh
二、data 命令語法: 通常用法前面須要"+"號:
%y-%m-%d ==== 年 月 日
%H:%M:%S ==== 小時 分鐘 秒
小s:表示時間戳: | 大S:表示秒:
date +%Y-%m-%d 表示年月日(大Y表示四位的年):
date +%y-%m-%d 表示年月日(小y表示兩位的年):
date +%s 表示時間戳:(距離1970年過去了多少秒):
date -d @1537515069 (數字是時間戳顯示出來的數字): 顯示出來的也是當前日期:
date -d "+1 day" 表示一天前:
date -d "-1 day" 表示一天後:
date -d "+1 month" 表示一月前:
date -d "-1 month" 表示一月後:
date -d "+1 min" 表示一分鐘前:
date -d "-1 min" 表示一分後:
date +%w 表示周幾:
date +%W 表示一年的第幾周:
date語法實踐:
date 命令,會顯示當前的系統的日期和時間:
[root@localhost_02 shell]# date 2018年 09月 21日 星期五 15:39:22 CST
date命令在shell中的做用很是大,通常用於對文件的後綴名增長一個時間:
1:表示年 月 日 date +%Y-%m-%d date +%y-%m-%d
[root@localhost_02 shell]# LANG=en_US.UTF-8 #設定字符集: [root@localhost_02 shell]# date +%Y-%m-%d #表示年月日,四位的年: 2018-09-21 [root@localhost_02 shell]# date +%y-%m-%d #表示年月日,兩位的年: 18-09-21 [root@localhost_02 shell]# date +%Y #表示四位的年: 2018 [root@localhost_02 shell]# date +%y #表示兩位的年: 1 [root@localhost_02 shell]# date +%m # m 表示月份: 09 [root@localhost_02 shell]# date +%d # d 表示日期: 21 [root@localhost_02 shell]# date +%D # D 表示一種特殊格式的年月份: 09/21/18 [root@localhost_02 shell]# date +%F # 表示年月日的簡寫: 2018-09-21 [root@localhost_02 shell]# date +%Y%m%d #表示年月日,不加杆也能夠的: 20180921
註釋:其實x表示年月日的寫法: data +%F === date +%Y-%m-%d === date +%D(特殊格式)
註釋:在表示年月日的時候:默認是用" - "來區分的(如 date +%F), 不加也是能夠的,如上例子:
2:時間單位(小時 分鐘 秒 週末) #默認使用冒號分割:
[root@localhost_02 shell]# date +%T # T 表示簡寫的小時 分鐘 秒: 15:53:08 [root@localhost_02 shell]# date +%H:%M:%S # 表示小時 分鐘 秒: 15:54:30 [root@localhost_02 shell]# date +%H # H 表示小時: 15 [root@localhost_02 shell]# date +%M # M 表示分鐘: 55 [root@localhost_02 shell]# date +%S # S 表示秒: 06 [root@localhost_02 shell]# date +%s #表示時間戳(距1970年過去了多少秒): 1537516549 [root@localhost_02 shell]# date +%w # w 表示周幾: 5 [root@localhost_02 shell]# date +%W # W 表示今年的第幾周: 38
註釋:表示時間的方式: date +%T === date +%H:%M:%S
註釋:表示日期的方式: date +%F === date +%Y-%m-%h
三、date還用來標記以前的日期:會用來標記日記(前一天的日期):
year month day hour min second week (後面的s可加能夠不加):
用加減標記(" - "減號標記以前的日期) (" + "加號標記以後的日期)
day -1 "-1 year" #顯示上一年的日期:
day -1 "-1 month" #顯示上一個月的日期:
day +1 "+1 day" #顯示明天的日期:
day +1 "+1 hour" #顯示下一個小時的日期:
day +1 「+1 min」 #顯示下一個分鐘的日期:
day +1 "+1 sec" #顯示下一秒的日期:
[root@localhost_02 shell]# date -d "-1 year" #顯示上一年的日期: 2017年 09月 22日 星期五 07:49:09 CST [root@localhost_02 shell]# date -d "-1 month" #顯示上一個月的日期: 2018年 08月 22日 星期三 07:49:16 CST [root@localhost_02 shell]# date -d "-1 day" #顯示昨天的日期: 2018年 09月 21日 星期五 07:49:20 CST [root@localhost_02 shell]# date -d "+1 hour" #顯示一小時後的日期: 2018年 09月 22日 星期六 08:49:28 CST [root@localhost_02 shell]# date -d "+1 min" #顯示一分鐘後的日期: 2018年 09月 22日 星期六 07:50:32 CST [root@localhost_02 shell]# date -d "+1 sec" #顯示一秒後的日期: 2018年 09月 22日 星期六 07:49:37 CST [root@localhost_02 shell]# date -d "+1 week" #顯示一週後的日期: 2018年 09月 29日 星期六 07:49:40 CST
四、時間戳: date +%s date -d @時間戳
date +%s 表示顯示出時間戳
[root@localhost_02 shell]# date +%s 1537574033 [root@localhost_02 shell]# date -d @1537574033 @後面跟的就是時間戳: 2018年 09月 22日 星期六 07:53:53 CST
註釋:若想在linux系統中,把當前日期換算成時間戳,可使用: date +%s -d"2018-09-22 07:56:53"
[root@localhost_02 shell]# date +%F-%T 2018-09-22-07:56:53 [root@localhost_02 shell]# date +%s -d"2018-09-22 07:56:53" 1537574213
五、在linux下還能夠編輯日期: cal
[root@localhost_01 network-scripts]# 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
三、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]