十六週二次課

一、 shell腳本介紹

Shell是什麼php

Shell是一種腳本語言,和傳統語言C,Python...相比仍是比較簡單的。java

可使用邏輯判斷,循環等語法shell

能夠自定義函數編程

shell是系統命令的集合vim

shell腳本能夠實現自動化運維,能大大增長咱們的運維效率數組

shell腳本概念bash

編輯運維

shell和shell腳本有什麼區別?確切一點說,Shell就是一個命令行解釋器,它的做用就是遵循必定的語法將輸入的命令加以解釋並傳給系統。它爲用戶提供了一個向Linux發送請求以便運行程序的接口系統級程序,用戶能夠用Shell來啓動、掛起、中止甚至是編寫一些程序。 Shell自己是一個用C語言編寫的程序,它是用戶使用Linux的橋樑。Shell既是一種命令語言,又是一種程序設計語言(就是你所說的shell腳本)。做爲命令語言,它互動式地解釋和執行用戶輸入的命令;做爲程序設計語言,它定義了各類變量和參數,並提供了許多在高階語言中才具備的控制結構,包括循環和分支。它雖然不是 Linux系統內核的一部分,但它調用了系統內核的大部分功能來執行程序、建立文檔並以並行的方式協調各個程序的運行。編程語言

腳本簡介編輯器

shell腳本

打開文本編輯器(可使用vi/vim命令來建立文件),新建一個文件test.sh,擴展名爲sh(sh表明shell),擴展名並不影響腳本執行,見名知意就好,若是你用php寫shell 腳本,擴展名就用php好了。

輸入一些代碼,第一行通常是這樣: [1] 

1

2

#!/bin/bash

echo "Hello World !"

"#!" 是一個約定的標記,它告訴系統這個腳本須要什麼解釋器來執行,即便用哪種Shell。

echo命令用於向窗口輸出文本。


二、 shell腳本結構和執行

1.  Shell腳本的第一行必須是:#!/bin/bash

#!/bin/bash,由於可以識別本機的命令。這樣才能另外一臺機器就也可以執行了,因此文件的第一行纔要寫這樣的聲明,

shell腳本是在本機執行的話,卻是能夠省略掉"#!" 是一個約定的標記,後面跟着的/bin/bash是告訴系統這個腳本須要使用/bin/bash解釋器來執行。由於不一樣語言所編寫的腳本對應的解釋器都不同,可是都須要使用 "#!" 來做爲標記。簡單來講就是告訴系統這是一個什麼語言寫的腳本。

      Shell腳本的文件名稱是以.sh爲後綴,shell中的註釋符是井號「#」,,注意區別「#!」和「#」,前者是標記,後者纔是註釋符。除第一行外,剩下以#開頭的大多隻是做爲解釋說明用。要注意的是,#!/bin/bash寫在文件的第一行纔是被當作聲明,若是寫了兩行#!/bin/bash,那麼第二行就會被當作註釋

 

二、執行shell腳本的方法有四種:

(1)sh Hello.sh =bash Hello.sh                                            #查看並執行用bash(sh)來執行腳本

(2)./script.sh                                                                #利用小數點來執行shell腳本

(3)chmod a+x Hello.sh; ./Hello.sh                       #賦予執行的權限,並查看shell腳本。能夠當作一個二進制文件直接執行。

(4)source script.sh                                                # 利用source來執行hell腳本

 

注意:前面兩種方式其實都是同樣的:都是在當前父進程下的子進程中執行,子進程完成後,子進程中的各項變量或操做將會結束而不會傳回到父進程中。

例子:

建立一個shell目錄便於接下來的操做。寫一個shell腳本1.sh.並在終端裏執行她。/bin/bash編輯器,指定shell編輯器。寫入兩個命令:ls和w命令。

刪除註釋,不指定編輯器。在本機器中,能夠直接使用sh 1.sh執行。

命令:chmod a+x 1.sh賦予腳本執行權限。並執行他。執行成功,說明這條命令已經解析了。被bin/bash這條命令解析了。      ./至關於絕對路徑

執行shell腳本時,並執行ls和w命令。經過sh -n 1.sh查看shell腳本的語法錯誤。-x:顯示執行的過程

 

 

能夠看到,執行後再看腳本中兩個變量,在父進程中不起做用!

備註: 若是在script2.sh文件裏面執行script1.sh的腳本,那麼就是執行.  ./script1.sh   [中間有空格]

而經過第四種方式執行(source test.sh)的話,在父進程中就起做用了:

這就是直接執行與用source命令執行的區別,前者只做用於子進程自己,後者則做用於整個父進程

所以:如要想不註銷系統,並讓全局配置文件生效,則必須用source命令:

 

好比說: 在全局配置文件中/etc/profile添加了JAVA_HOME,要讓他對整個環境生效

export JAVA_HOME=/usr/java/jdk1.7.0_75

就必須執行source /etc/profile

 

3. 查看腳本執行過程 bash -x 1.sh      # 每個「+」表明執行的命令,後面跟着命令的執行結果。
 查看腳本是否語法錯誤  bash -n 1.sh

 

四、sh和bash其實是同一個命令,由於sh是bash的軟鏈接文件。

執行命令ll /bin/sh,發現sh其實只是bash的軟鏈接。

[root@localhost shell]# ll /bin/sh

lrwxrwxrwx. 1 root root 4 10月 20 08:08 /bin/sh -> bash

[root@localhost shell]# ll /bin/bash

-rwxr-xr-x. 1 root root 960392 8月   3 2016 /bin/bash

 

5.通配符 再shell中比較特殊意義,它們被稱做是shell元字符或通配符。

*、?和[]經常使用語文件名擴展;      

 !是歷史命令符;

<、>、>>、<&和|符則用於標準I/O重定向管道。
爲了防止這些字符被shell解釋,他們必須用反斜槓或者引號進行引用。
如:rm *; ls ??; cat file [1-3];!!
echo 「how are you?」
echo oh boy\!

 

顯示輸出
echo命令用戶向屏幕顯示輸出。
echo 「hello word \!」


局部變量 局部變量的做用域被限定在當前的shell中。
set ariable_name = value
set name = 「Admin」

 

6.變量在shell中的使用案例。

局部變量 局部變量的做用域被限定在當前的shell中。
set ariable_name = value
set name = 「Admin」


全局變量 全局變量又稱環境變量。
setenv VARIABLE_NAME value
setenv PRINTER Shakespeare


提取變量值 可使用$從變量中提取數值;
echo $variable_name
echo $name
echo $PRINTER


讀取用戶輸入 特殊變量$<從用戶輸入中讀取一行並將它賦值給一個變量
echo 「who are you?」
set name = $<

參數 能夠從命令中傳遞參數給腳本;獲得它們的值有兩種方法:位置參數和argv數組。
% scriptname arg1 arg2 arg3 ……
使用位置:
echo $1 $2 $3 arg1賦給$1,arg2賦給$2等;
echo $* 全部參數
使用argv數組:
echo $argv[1] $argv[2] $argv[3] 
echo $argv[*] 全部參數  
echo $#argv 參數個數

 

7.查看腳本是否語法錯誤 bash -n 01.sh

(咱們爲了看到實驗效果,故意寫一個錯的腳本,在for循環的結尾少寫一個done)

[root@congji shell]# cat 01.sh 

1  #!/bin/bash

2  for i in `seq 1 10`

3  do

4     echo $i

[root@congji shell]# sh -n 01.sh                 

01.sh:行6: 語法錯誤: 未預期的文件結尾

 

它提示報錯,那咱們加上done試試,

[root@congji shell]# sh -n 01.sh          (執行後沒有報錯,也沒有返回值)

[root@congji shell]# sh  01.sh 

1  #!/bin/bash

2  for i in `seq 1 10`

3  do

4     echo $i

 


三、 date命令用法

date是一個與時間日期相關的命令,若是直接使用的話,是顯示當前系統的日期時間

[root@congji ~]# date 

2018年 01月 11日 星期四 00:00:07 CST

 

關於表示時間符號的解釋:

%Y  4位的年份(Year)

%y  2位的年份

%M  表示當前的分鐘(Minute)

%m  表示當前的月份(Month)

%D   以2位的格式輸出當前的年月日

%d   表示當前的日期(Date)

%F   輸出當前的年月日,以 - 爲分隔

%H   輸出當前的小時時間

%h   輸出當前的月份

%s   輸出時間戳

%S   輸出秒

%T   輸出當前時間,以 : 爲分隔

%W   輸出本週是今年的第幾周

%w   輸出本週是這個月的第幾周

 

那麼加上參數他會怎麼顯示呢

[root@localhost ~]# date +%Y                   (顯示4位數年)

2018

[root@localhost~]# date +%y                    (顯示2位數年)

18

[root@localhost~]# date +%m                    (顯示月份)

01

[root@localhost~]# date +%d                    (顯示日期)

11

[root@localhost ~]# date +%Y%m%d                  (把他們綜合在一塊兒就會顯示當前日期)

20180111

[root@localhost ~]# date +%D                    (以月,日,年的方式顯示時間)

01/11/18

[root@localhost ~]# date +%F                     (以年-月-日的方式顯示時間)


2018-04-26

 

既然有年月日,那就有分鐘和小時

[root@localhost~]# date +%H                      (顯示當前的小時)

00

[root@localhost~]# date +%M                       (顯示當前的分鐘)

20

[root@localhost~]# date +%S                        (顯示當前多少秒)

36

[root@localhost ~]# date +%s                       (這是一個時間戳,舉例1970年1月1日0點過去了多少秒)

1515601302

 

咱們能夠把全部的參數組合起來顯示多少秒,也能夠直接加T顯示多少秒,用T顯示的更爲清楚

[root@localhost shell]# date +%H%M%S
193016
[root@localhost shell]# date +%H:%M:%S
19:30:33
 

[root@localhost~]# date +%T        =====       date +%H:%M:%S

00:29:16

 

把所有的參數組合起來:

[root@localhost ~]# date +%Y-%m-%d/%H:%M:%S     (爲了更清晰的看到結果,咱們給中間加上了分隔符)

2018-01-11/00:35:58

[root@localhost~]# date +%F/%T              (一樣咱們用F和T也能顯示出一樣的效果)

2018-01-11/00:36:45

因此咱們得出結論

date +%Y-%m-%d = date +%F

date  +/%H:%M:%S = date +%T

 

[root@localhost ~]# date +%w        (顯示今天是周幾)

4

[root@localhost ~]# date +%W        (顯示今天是今年的第幾周)

02

 

用cal命令,像日曆同樣顯示時間,會顯示日期。

[root@localhost~]# 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

 

如今有一個實例,今天是1月11日,你要寫一個切割日誌腳本,在天天的0點切割日誌,可是咱們都知道,一到0點,時間就會顯示後一天。因此咱們要學會增長減小,咱們以減小爲例。

[root@localhost ~]# date

2018年 01月 11日 星期四 00:54:00 CST

 

[root@localhost~]# date -d "-1 day"                    (顯示當前時間提早一天)

2018年 01月 10日 星期三 00:54:02 CST

 

lhost shell]# date -d "-1 day" +%F                            (查看前一天的日期)
2018-04-25
 

[root@localhost~]# date -d "-1 month"                    (顯示當前時間提早一月)

2017年 12月 11日 星期一 00:54:12 CST

 

[root@localhost ~]# date -d "-1 min"                     (顯示當前時間提早一分鐘)

2018年 01月 11日 星期四 00:53:19 CST

 

[root@localhost ~]# date -d "2 hour" +%s

這個表示2小時後

 

[root@localhost ~]# date -d "+1 day" +%F                      打印一天後的日期

2018-04-27

[root@localhost ~]# date -d "-1 day" +%F                       打印一天前的日期:

2018-04-25

[root@localhost ~]# date -d "-1 month" +%F                              打印一個月前的日期

2018-03-25

[root@localhost ~]#date -d "-1 min"                                      打印一分鐘前

 

[root@localhost ~]#date -d "-1 years" +%F                             打印一年前的日期

2018-03-25

[root@localhost ~]#date -d "-1 hour" +%T                                       打印一小時前

10:52:42

[root@localhost ~]#date +%s -d "2017-09-06 06:52:16"                                  把一個日期轉換成時間戳

 

顯示時間戳是%s,讓時間戳顯示成日期,使用date命令。

[root@localhost~]# date +%s

1515603280

[root@localhost ~]# date -d @1515603280 

2018年 01月 11日 星期四 00:54:40 CST

 

把時間戳換成具體的時間

[root@localhost shell]# date -d  @1524797641                         #查看具體的時間
2018年 04月 26日 星期四 19:54:01 PDT
[root@localhost shell]# date +%s  -d "2018-4-27 19:54:01"                   #換成具體的時間
1524884041

 

設置英文顯示,使用名咯LANG=en。

 


四、 shell腳本中的變量

      shell腳本中的變量和其餘編程語言中的變量含義是同樣的,都是用來存儲一個數據,而後使用變量名就能夠進行調用了,shell腳本的語法和其餘腳本的語法相似,都不須要使用分號做爲語句的結束。

 

shell腳本定義變量的規則:

  • 首個字符必須爲字母(a-z,A-Z)。

  • 中間不能有空格,可使用下劃線(_)。

  • 不能使用標點符號。

  • 不能使用bash裏的關鍵字(可用help命令查看保留關鍵字)。

定義一個變量:

a=10

name=」lisi」

調用變量時須要在變量名前面加上$:

echo $a

echo $name

只讀變量:

使用 readonly 命令能夠將變量定義爲只讀變量,只讀變量的值不能被改變。

刪除變量:

使用 unset 命令能夠刪除變量裏的數據。語法:unset name,由於變量的內容被刪除,因此輸出的是空的。

 

變量類型:

運行shell時,會同時存在三種變量:

  1) 局部變量    局部變量在腳本或命令中定義,僅在當前shell實例中有效,其餘shell啓動的程序不能訪問局部變量。

  2) 環境變量    全部的程序,包括shell啓動的程序,都能訪問環境變量,有些程序須要環境變量來保證其正常運行。必要的時候shell腳本也能夠定義環境變量。

  3) shell變量    shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了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] 

實例:

執行條件語句的方法:

[root@localhost ~]# if [ $a -gt 3 ] 

> then

> echo ok

> fi

ok

第二種方法:

[root@localhost ~]#  if [ $a -gt 3 ]; then echo ok; fi

 

格式:if.......then....

知足於a大於3,輸出OK(-g:表明大於)

[root@localhost shell]# vi 4.sh

#!/bin/bash
a=5
if [ $a -gt 3 ]
then
   echo ok
fi

[root@localhost shell]# sh -x 4.sh
+ a=5
+ '[' 5 -gt 3 ']'
+ echo ok
ok
 

知足於a小於3,輸出OK(-l:表明小於)

[root@localhost shell]# vi 4.sh

#!/bin/bash
a=5
if [ $a -lt 3 ]
then
   echo ok

else

     echo nook
fi

 

不知足於a大於1,小於6,輸出nook(-l:表明小於)

[root@localhost shell]# vi 4.sh

#!/bin/bash
a=5
if [ $a -gt 1 ]
then

       echo ">1"

elif [ $a -lt 6 ]

then

       echo "<6 && >1"

else

     echo nook
fi

[root@localhost shell]# sh 4.sh
nook
[root@localhost shell]# sh -x 4.sh
+ a=3
+ '[' 3 -gt 4 ']'
+ '[' 3 -gt 6 ']'
+ echo nook
nook
 

 

 

 

 

 

 

連接:http://blog.51cto.com/zero01/1983828

    另外一個版本的介紹:http://blog.51cto.com/13407306/2069395

 

常見問題:

[root@localhost ~]# date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%M:%S"
2009-02-13 23:31:30

[root@localhost ~]# date -d @1234567890  +"%Y-%m-%d %H:%M:%S"
2009-02-14 07:31:30

答:正好差8小時。 這和時區有關係。

CST,CET,UTC,GMT,DST,Unix時間戳幾種常見時間概述與關係:https://blog.csdn.net/kongjiea/article/details/44061117

 

date -d "2 hours ago" +%s         表示2小時前        
date -d "2 hour" +%s         表示2小時後

這兩個值會相差4小時的

相關文章
相關標籤/搜索