shell編程

1、概念

  shell就是一個計算機應用程序,跟QQ、×××等類似,但是他主要是提供計算機的操作界面,例如我們所使用Windows操作系統的圖形操作界面和cmd.exe命令行操作界面。shell並不是操作系統內核,可以看成是內核外邊的殼,可以實現人機友好交互。

  shell同時也可以看成是一種命令語言,本身是用C語言編寫的,用shell命令可以編寫程序,即我們所說的腳本程序(shell script),所以shell與shell script並不是同一個概念,但通常說shell腳本時就直接說成shell了。在本節所說的shell編程其實就是用shell命令語言編寫的shell script。

2、分類

  主要分爲圖形界面shell和命令行式shell兩類

  圖形界面:Graphical User Interface shell 即 GUI shell,應用最常見,例如個人windows系統大部分都是GUI shell

  命令行式:Command Line Interface shell ,即CLI shell,個人應用較少,主要是在服務器領域,例如服務器領域的linux操作系統大部分都是CLI shell

3、發展歷史
shell編程

二、編程風格

1、編程範式

  面向對象:以數據爲中心,考慮先如何組織數據,指令服務於數據。

  面向過程:以指令爲中心,來進行寫程序,數據服務於指令。

2、編程語言

  低級:彙編語言

  高級:需要進行編譯解釋的語言

    編譯:高級語言-->編譯器-->目標代碼

        解釋:高級語言-->解釋器-->機器代碼

  可以看出shell腳本語言是高級語言,需要解釋器解釋後才能執行

  程序執行方式:程序最終都是要轉成機器代碼才能在計算機上執行,機器代碼就是二進制指令

3、執行模式

  順序執行

  循環執行 for while until

  選擇執行 if elsif case

三、編程結構

1、程序形式

  整個程序最終就以文本文件的形式存在,就是所說的一個腳本文件。

2、程序組成

  一般在腳本頂行添加解釋器路徑  #!/bin/bash

  變量、數組等基本元素

  構成一個表達式

  多個表達式構成一個語句

  多個語句構成整個腳本文件

  結構的核心就是調用指令(堆命令,嚴重依賴當前環境)

四、應用場景

  重複 批量事務處理 自動化運維 定期任務執行 (crontab) 服務器運行監控

五、程序執行

1、python程序的執行

  shell腳本的執行類似於python腳本的執行,我們先來看python文件的執行過程,python腳本的執行分爲兩類,每一類都有絕對路徑與相對路徑兩種執行方式。

  1、交互式shell環境下直接執行

shell編程
2、使用解釋器執行
shell編程
2、shell程序執行

  1、在交互式shell環境直接執行
shell編程
2、使用解釋器執行
shell編程

3、前面加點執行
shell編程
4、使用source執行
shell編程

5、bash的單步執行
shell編程

六、shell變量

1、概念

  變量:是一段內存空間的引用

  賦值:變量名=值

  注意>>變量在賦值是不能再前面帶$

2、命名規則

  變量名只能包含字母、數字和下劃線,並且不能以數字開頭

   變量名區分大小寫

   儘量能見名知義

  變量不能以數字開頭

3、變量分類

  局部變量:變量僅對當前Shell進程有效

       定義變量:Var_Name="Value"

  環境變量:對當前shell進程及其子shell進程有效(但不可跨終端)

       定義變量:export Var_Name=”Value”

            或 Var_Name="Value" export Var_Name

      環境變量對於當前shell和子shell都有效

      查看系統內置環境變量  env

4、引用變量

  ${Var_Name}:引用變量

  通常情況下大括號可以省略,可以簡寫成:$Var_Name

  echo $Var_Name :打印變量的值

5、撤銷變量  unset Var_Name

shell編程

6、變量替換

  通常情況下大括號可以省略 如果變量名後面要跟如下內容:字符串(包括大小字符串)、數字或下劃線,那麼變量名就一定要用大括號包起來

![](http://i2.51cto.com/images/blog/201809/16/cfd11105023ac11c2157947fd03ab674.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
7、命令替換

  1、$(命令1;命令2......) (有些shell不兼容,tsh)

  2、倒引號 `,命令1;命令2......` (兼容性好,但是可讀性差)

  括號或倒引號內命令的執行結果(標準輸出)返回給當前shell,相當於產生了一個新的命令,其標準輸出可被echo或者被當前shell的命令所使用
shell編程
8、變量在單雙引號中的引用

  ‘’ 單引號: 強引用,變量替換不會進行,變量名不會被替換成變量對應的值

  "" 雙引號:弱引用,能夠執行變量替換,變量名可以被替換成變量對應的值
shell編程

9、位置變量

  變量形式:$1, $2, $3, ......, $n ($9以後需要用${10})

  作用:用來接收給shell腳本所傳遞的參數,第一個參數用$1來獲取,第二個參數用$2來獲取,......

  例1:隨機在系統內找兩個文本文件,分別輸出它們空行的數量

![](http://i2.51cto.com/images/blog/201809/16/2fab90dc28aa74a9919a1407aedb2a76.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

10、特殊變量

  $0 : 腳本名稱自身

  $? : 上一條命令的執行狀態

    狀態用數字表示:0-255

          0:表示成功

          1-255:失敗,1.2.127.255預留

  $# : 記錄位置參數個數的總和

  $* : 詳細列出所有的位置參數

  $$ : 當前所在進程的進程號

shell編程

七、算術運算

1、declare

shell編程

2、expr
shell編程

3、let
shell編程

4、$[算數表達式]
shell編程

5、$((算術表達式))
shell編程

7、算數運算符

  單個運算符:+,- ,*,/,%(餘數)

  組合運算符:+= ,-=,*=,/=,%=

        a+=b -----> a=a+b

        a-=b ------> a=a-b

        a=b --------> a=ab

        a /=b ---------> a=a/b

  變量++:a++ ----> a=a+1

  變量--:a-- ------> a=a-1

  注意:除法只能使用整數部分

例2:隨機選擇兩個文本,計算出兩個文本生效的行數

shell編程

八、交互式輸入、輸出

  輸入:read [-p "提示信息"] 變量名

  輸出:echo $變量名

shell編程
九、條件判斷

1、比較運算符

  文件操作符

    -d:測試是否爲目錄(Directory)

    -e:測試目錄或文件是否存在(Exist)

    -f:測試是否爲文件(File)

    -r:測試當前用戶是否有權限讀取(Read)

    -w:測試當前用戶是否有權限寫入(Write)

    -x:測試當前用戶是否可執行(Excute)該文件

    -L:測試是否爲符號連接(Link)文件

    可以使用echo $?來判斷,0爲真,非0爲假

  數字操作符

    -eq  -gt  -ge -lt   -le -ne

          等於   大於 大於等於 小於  小於等於  不等於

    -eq = equals to =

    -gt = great than >

    -ge = great or equals to >=

    -lt = less than <

    -le = less or equals to <=

    -ne = not equals to !=,<>

  字符串操作符

    = :字符串內容相同

    != :字符串內容不同,! 號表示相反的意思

    -z :字符串內容爲空

2、邏輯運算符

與: &&

或:||

非:!

0:真

1:假

shell編程
3、判斷方法

  test 條件表達式

  [ 操作符 文件或目錄 ]或者[[ 操作符 文件或目錄 ]](中括號與表達式之間一定要有空格)

shell編程
十、循環結構

1、for循環

  格式:

    for var_Name in 列表; do

      循環體(正常執行的執行命令)

      語句1......

    done

  seq命令:類似於python裏的range函數

shell編程

例3:生成5個空文件,文件名從1到10,後綴”.txt”

shell編程

例4:添加user1到5用戶,每添加一個顯示/etc/passwd的最後一行信息

shell編程

例5:再把例4創建的5個新用戶和例3創建的5個空文件刪除

shell編程

例6:求從1加到100的結果
shell編程
2、while循環

  格式:

    while [條件]; do

      循環體(正常執行的執行命令)

      語句1......

    done

  退出循環:

    break:結束並退出循環

    continue:在循環中不執行continue下面的代碼,轉而進入下一輪循環

  退出腳本:

    exit:常帶一個整數給系統,如 exit 0

例7:計算所有參數的和
shell編程

3、until循環

條件測試不成功即進入循環體

  格式:

    until [條件]; do

      循環體(正常執行的執行命令)

      語句1......

      done

例8:求1到100所有整數的和

shell編程

十一、選擇結構

1、if條件判斷

  單分支:

             if condition; then

                statement1

                ......

     fi

例9:變量Name是zhangsan,打印歡迎你
shell編程
雙分支 :

  if condition; then

                statement1

  else

            statement2

  fi

例10:變量Name是zhangsan,打印歡迎你,否則打印不歡迎

shell編程
多分支:

  if condition; then

                statement1

  elif condition; then

                statement2

     ...

  else

                statementn

  fi

例11:變量score小於60,打印不及格;60到80之間,打印及格;80到100之間,打印優秀;否則打印分數有誤

shell編程
例12:創建用戶,如果創建成功,打印成功;如果失敗,打印已存在
shell編程

例13:for循環打印9*9乘法表

shell編程

2、case語句

  格式 :

    case 變量引用 in

    正則表達式1)

      分支1

      ;;

    正則表達式2)

      分支2

      ;;

    正則表達式n)

      分支n

      ;;

    *)

      默認分支

      ;;

    esac

例14:變量score 在1和9之間太低了,score小於60,打印不及格;60到80之間,打印及格;80到100之間,打印優秀;否則打印分數有誤
shell編程
十二、函數

格式:

  function 函數名() {

  命令序列

  ......

  return xxx

  }

調用:函數名 [ 參數1 ] [ 參數2 ] .....

例15:打印參數
shell編程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章