20.1-20.4 shell:腳本,腳本結構與執行,date用法,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則表示周日。
[root@AliKvn shell]# date
Tue May 29 15:52:08 CST 2018
[root@AliKvn shell]# date +%Y 2018年
2018
[root@AliKvn shell]# date +%y 18年
18
[root@AliKvn shell]# date +%m 月
05
[root@AliKvn shell]# date +%M 分鐘
52
[root@AliKvn shell]# date +%d 日
29
[root@AliKvn shell]# date +%D 月-日-年
05/29/18
[root@AliKvn shell]# date +%F 年-月-日
2018-05-29
[root@AliKvn shell]# date +%s 時間戳,距離1970年1月1日0點0分0秒到現在有多少秒
1527580544
[root@AliKvn shell]# date +%T 當前的時間,精確到秒
15:59:37
[root@AliKvn shell]# date +%H:%M:%S 同上,跟date +%T一樣的效果
16:01:55
[root@AliKvn shell]# date +%w 星期2,周二,周日是0
2
[root@AliKvn shell]# date +%W 今年的第幾周,第22周
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
一天前
[root@AliKvn shell]# date -d "-1 day"
Mon May 28 16:09:17 CST 2018
日期可以組合+%F使用
[root@AliKvn shell]# date -d "-1 day" +%F
2018-05-28
一個月前
[root@AliKvn shell]# date -d "-1 month" +%F
2018-04-29
一年前
[root@AliKvn shell]# date -d "-1 year" +%F
2017-05-29
時間可以用+%T組合
[root@AliKvn shell]# date -d "-1 hour" +%T
15:13:01
date +%s 時間戳
時間戳換算標準時間格式
[root@AliKvn shell]# date +%s
1527581785
[root@AliKvn shell]# date -d @1527581785
Tue May 29 16:16:25 CST 2018
時間格式轉換時間戳
[root@AliKvn shell]# 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]
20.1-20.4 shell:腳本,腳本結構與執行,date用法,shell腳本的變量