shell腳本編程

Shell腳本是包含一些命令或聲明,并符合一定格式的文本文件。

程序:指令+數據

程序編程風格

過程式  以指令為中心,數據服務于指令。

對象式  以數據為中心,指令服務于數據。

Shell程序:提供了編寫和能力,解釋執行。

編程邏輯處理方式:

          順序執行

          循環執行

          選擇執行

Shell編程:過程式,解釋執行

編程語言的基本結構

          數據存儲:變量,數組

          表達式:  a+b

          語句:    if

創建shell腳本

第一步  使用文本編輯器來創建文本文件,第一行必須包括shell聲明序列:#!

          eg: #!/bin/bash

             #!author:

             #!version:

             #!descriptio:

             腳本正文

             :wq (保存)

第二步  運行腳本 

        給予執行權限,在命令行上指定腳本的絕對路徑或相對路徑。

        直接運行解釋器,將腳本最為解釋器程序的參數執行。

    

當執行shell腳本時,比如說將腳本存放在/testdir目錄中執行時要將該腳本的絕對路徑或相對路徑寫上。

          例如:

            絕對路徑     /testdir   test.sh

            相對路徑      ./test.sh

如果不寫腳本的路徑時,系統找的是$PATH變量的路徑,當前腳本的路徑不在$PATH變量的路徑中時,該腳本是不會運行的。

在linux中。系統執行程序時,是不去找當前路徑的,即便程序就在當前路徑中,也是只搜$PATH變量。

如果希望程序能在當前路徑下運行,我們可以用修改$PATH變量的方法來實現。

以修改root的$PATH變量為例,在root的家目錄下有一隱藏文件 .bash_profile。用vim打開.bash_profile文件,修改PATH=$PATH:$HOME/bin。在bin后面加“:.”后面的點表示當前路徑。

blob.png

在PATH=$PATH:$HOME/bin:.這條命令中,腳本的執行順序是:先找$PATH再找$HOME/bin,最后找當前路徑,所以將“· ”放到最前也是可以的。

當vim設置好保存退出后。$PATH不能及時生效,需要執行 . .bash_profile,$PATH才能生效。

最后在當前路徑下執行一個腳本測試是否運行,運行則修改成功,不運行則修改未成功。

但是一般不將當前路徑添加進$PATH這樣做不安全。

變量

   變量:命名的內存空間

   數據存儲的方式:

             字符

             數值:整型    浮點型

      命令執行優先級:別名→內部命令→hash到內存中的外部命令→外部命令

  變量類型:

          作用:

               數據存儲格式

               參與的運算

               表示的數據范圍

變量命名的法則:

              不能使用程序中的保留字,例如if    for

              可以使用數字、字母及下劃線,但是不能以數字開頭。

              見名知義。

              同一命名規則。 

          管理員自己定義$PATH變量

          例如:var1=test   這個var1變量的內容就是test,不區分大小寫。

               blob.png

變量的名稱可以隨便起。但是數字例外,組合也是可以的,但是數字不能開頭。

定義完成后,如果該變量不想要了也可以刪除,執行unset var1。不用再var1前面加”$”,因為unset是專門刪除變量的。

用echo $var1驗證,不會顯示結果。代表unset執行成功,但是系統會生成一個空的$var1。

變量用完后應及時用unset刪除,如果不刪除,則變量會一直存在于內存中,消耗內存資源。

Set命令可以查看所有變量

變量種類

   本地變量

       直接在當前的腳本或shell中直接寫一個變量的賦值,比如說:var1=test,var1這個

   變量是基于本地的,只能在本地終端中用,換個終端就無法執行了。

     

編寫第一個腳本   Var.sh

blob.png

當我們將在腳本中定義好的腳本中的變量var1=haha拿到外面echo $var1執行的時候,是沒有結果的,說明var1這個變量只能在腳本內起作用。執行var.sh這個腳本的時候,執行結果也是為空。

將var.sh腳本稍作修改

blob.png

當再去執行var.sh腳本的時候,顯示了$var1的變量結果:haha,所以該變量只能自己用。

blob.png

編寫第二個腳本  var2.sh

    blob.png

執行var2.sh腳本。顯示了$var2的變量結果:xixi

blob.png

這兩個腳本各自顯示各自的變量值,互不影響。

將var.sh這個變量稍作修改,讓其調用var2.sh

    

  blob.png

執行var.sh腳本  分別顯示了var.sh的值,也顯示了var2.sh的值

blob.png

將var2.sh腳本稍作修改

blob.png

執行var2.sh

blob.png

上圖顯示第二行var2.sh中顯示的是空。當var2.sh嘗試去調用$var1的變量結果的時候,沒有成功,因為$var1變量是在var.sh中定義的,var2,sh本身沒有,所以調用失敗。

可以講var.sh與var2.sh做個對比

blob.png

blob.png

從上圖的對比中可以看出,var.sh不僅顯示了自己的執行結果,還調用了var2.sh的執行結果。但是var2.sh顯示了自己的執行結果,但是當它嘗試去調用$var1變量的的結果的時候卻失敗了,因為$var1的變量是定義在var.sh腳本中的,其本身并沒有,所以無法直接調用。

Var.sh調用var1.sh,其調用的關系就是父子進程的關系。

本地變量的有效范圍是不能直接在當前shell中有效,甚至是子進程都不能使用。

環境變量

    環境變量具有繼承性,在變量前夾export就可以將$v1變量繼承下去。

新建腳本var1.sh

blob.png

    var1.sh腳本不僅顯示自己的結果,還去調用var2.sh的結果。

新建腳本var2.sh

blob.png

    var2.sh腳本不僅顯示自己的結果,還去調用$v2變量和var3.sh腳本的結果    

新建腳本var3.sh

blob.png

var3.sh腳本調用$v1變量的結果。

當執行var1.sh的時候,var2.sh  var3.sh都可以調用$v1變量的結果。

blob.png

只讀變量

也稱為常量,比如定義圓周率,P=3.14159。有可能會被修改。如果不想被修改,則用readonly將P定義為只讀變量,便無法修改。

只讀變量甚至刪業無法執行,除非程序退出,再進入,則只讀變量自動消失。

blob.png

位置變量

新建腳本test.sh

 blob.png   

執行test.sh腳本

blob.png

上圖中,$1相當于 aa ,$2相當于bb,$3想當于cc,$*相當于aa  bb  cc  dd。

在腳本代碼中,調用通過命令行傳遞給腳本的參數。

$1 、$2……….對應第一、第二個參數。Shift[n]表示換位置

             $0    代表命令本身

             $*    傳遞給腳本的所有參數,全部合為一個字符串

             $@   傳遞給腳本的所有參數,每個參數都為獨立的字符串

             $#    傳遞給腳本的參數的個數

邏輯運算

True      false

     1         0

?            與:                               或:   

           1 與 1 = 1                          1 或 1 = 1 

           1 與 0 = 0                          1 或 0 = 1

           0 與 1 = 0                          0 或 1 = 1

           0 與 0 = 0                          0 或 0 = 0

邏輯運算

? 非:!

! 1 = 0

! 0 = 1

? 短路運算:

短路與:

第一個為0,結果必定為0;

第一個為1,第二個必須要參與運算;

短路或:

第一個為1,結果必定為1;

第一個為0,第二個必須要參與運算;

異或: ^

異或的兩個值,相同為假,不同為真。

Exp1=exp2      假

Exp1!=exp2    真

原創文章,作者:zzd,如若轉載,請注明出處:http://www.www58058.com/35756

(0)
zzdzzd
上一篇 2016-08-15
下一篇 2016-08-15

相關推薦

  • awk命令詳解

    簡介: wak是一個強大的文本分析工具,也可以叫做報告生成工具。相對于grep的查找,sed的編輯,awk在對其數據分析并生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格 為默認分隔符將每行切片,切開的部分再進行各種分析處理。 awk有三個不同的版本:awk,nawk,gawk。我們目前所使用的awk一般指gawk,gawk是AWK和GN…

    Linux干貨 2016-11-28
  • 用戶和組的簡介

     在第二周的學習中,關于用戶和組是一個難點,也是重點,本篇博客則是對用戶和組的簡單闡述,如有錯誤或不足還請各位大牛指出,在此謝過! 1、用戶 # 1.1用戶的定義      通過前面對Linux 多用戶的理解,我們明白Linux 是真正意義上的多用戶操作系統,所以我們能在Linux系統中建若干用戶(…

    Linux干貨 2017-07-22
  • 磁盤管理(二)之swap、dd工具使用

    磁盤管理(二)之swap、dd工具使用   一、掛載點和/etc/fstab   (1)配置文件/etc/fstab,當系統啟動時,自動加載該文件,會把寫在配置文件里面的所有掛載點全部自動掛載上去,只要按照格式寫,就不會丟失。   (2)文件掛載配置文件,如下圖:    &nbs…

    Linux干貨 2016-08-29
  • 推薦-Linux Namespace的一點理解

        下文的原文來自: http://blog.csdn.net/preterhuman_peak/article/details/40857117    原文寫的非常好,下文中大部分文字描述來自原文,我僅做了一點理解性的插圖和實驗部分。    &…

    Linux干貨 2016-03-28
  • N25 – week 3 blog

    本周的blog開始使用了代碼語言格式,我原本以為自然的才是最好的,orginal的才是最美的,但是我錯了。。。我發現同學們都在各種markdown,各種排版。我說過我早已過了care這些的年紀,但是我不能脫離群體單獨存在,所以我底下了傲嬌的頭。 本周開始blog標題改為英文,逼格滿滿,麥滿分~ 下面開始第$wk_num周的作業 [root@dhcp-10-1…

    Linux干貨 2016-12-19
  • N24_huamao 學習計劃

       每天會安排好時間按順序看視頻進行學習,由于基礎比較差我會先進行筆記然后再做博客記錄。需要操作的知識點會跟著視頻和自己的理解去做,最后達到馬哥所說的“技能”所需的要求。運維的知識點很廣很多也很復雜。當然想學好后邊的就要先打好基礎從linux系統開始學習把重要的命令記牢應用靈活才可以。這第一步自己一定要邁好。

    Linux干貨 2016-10-26

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-15 10:21

    總結的很詳細,并且通過具體操作加深了自己對變量的理解,

欧美性久久久久