Linux中的shell腳本編程——基礎篇

概述:

      shell腳本在Linux系統管理員的運維工作中非常重要。shell腳本能夠幫助我們很方便的管理服務器,因為我們可以指定一個任務計劃,定時的去執行某一個腳本以滿足我們的需求。本篇將從編程基礎、腳本基本格式、變量、運算、條件測試這幾個方面詳細介紹shell腳本編程的基礎內容,也是我們必須要掌握熟練的內容。


一、編程環境

      1.程序:指令+數據

         程序編程的風格有兩種:

             過程式:以指令為中心,數據服務與指令

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

      2.程序的執行方式:

       □計算機:只能識別二進制文件,所以運行的是二進制指令(機器語言)

       □計算機語言:

             低級:  機器語言、匯編語言

             高級:  編譯過程 :高級語言–>編譯器–>目標代碼,如 c、c++、jave

                     解釋過程: 高級語言–>解釋器–>機器代碼, 如 shell、perl、python

     3.編程的基本概念

       □過程式編程有以下幾個特點:

            順序執行

            循環執行

            選擇執行

       ?shell編程:是一個過程式的解釋器,提供了編程能力,然后解釋執行。

            編程語言的基本結構:

            數據存儲:變量、數組

            表達式: a + b

            語句:if語句

        shell腳本其實就是以一系列命令組合起來的文本文件,這些命令組合起來完成一個或者一項功能。

二、shell腳本基礎

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

       ?格式要求:程序開頭的環境指定 shebang機制

            #!/bin/bash

            #!/usr/bin/python

            #!/usr/bin/perl

       ?shell腳本的用途有:

            自動化常用命令

            執行系統管理和故障排除

            創建簡單的應用程序

            處理文本或文件

     2.創建shell腳本

       shell腳本通常都是以 .sh 為后綴名的

       ?第一步:使用(vim)文本編輯器來創建文本文件

            ?第一行必須包括shell聲明序列:#!

                  #!/bin/bash

            ?添加注釋

                  注釋以#開頭,后面跟一些相關注釋內容、作者、創建日期或版本等

shell.png

       ?第二步:運行腳本(相當于開了一個子進程,bash–bash-)

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

            ?直接運行解釋器,將腳本作為解釋器程序的參數運行

shell1.png

   □腳本調試

        bash -n /path/to/some_script   檢測腳本中的語法錯誤

       bash -x /path/to/some_script   調試執行

三、shell腳本中的變量

      1.變量:命名的內存空間

         □數據存儲方式:ASCII

             字符:

             數值:整型,浮點型

         ?變量:變量類型及作用

            作用: 1、數據存儲格式

                     2、參與的運算

                     3、表示的數據范圍

            類型: 字符

                    數值:整型、浮點型

      2.編程語言分類

        □強類型:定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤

              如:java,python

        ?弱類型:無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用

              如:bash 不支持浮點數

        ?變量命名法則

               ?不能使程序中的保留字:例如if, for;

               ?只能使用數字、字母及下劃線,且不能以數字開頭

               ?見名知義

               ?統一命名規則:駝峰命名法(多單詞)大駝峰是每個單詞的第一個字母大寫,小駝峰是第一個單詞的字母小寫,后面的單詞大寫  (jave中用的較多)

    3.變量的種類

      根據變量的生效范圍等標準可分為:

         本地變量:生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效

         環境變量:生效范圍為當前shell進程及其子進程(父進程,和子進程)

         局部變量:生效范圍為當前shell進程中某代碼片斷(通常指函數)

         位置變量:$1, $2, …來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數

         特殊變量:$?, $0, $*, $@, $#

四、變量詳述

      1.本地變量

      □變量賦值:name=‘value’,

      ?可以使用引用value:

           (1) 可以是直接字串; name=“root" (定義變量的格式:變量名=變量的值)

           (2) 變量引用:name="$USER" (引用變量時需要加上符號$,)

           (3) 命令引用:name=`COMMAND`, name=$(COMMAND)

      ?變量引用:${name}, $name

            "":弱引用,其中的變量引用會被替換為變量值

            '':強引用,其中的變量引用不會被替換為變量值,而保持原字符串

      ?顯示已定義的所有變量:set

      ?刪除變量:unset name

   2.環境變量

      □變量聲明、賦值:

            export name=VALUE

            declare -x name=VALUE

      ?變量引用:$name, ${name} (大括號必要情況系下要添加,為了區分誰是變量)

{}.png

      ?顯示所有環境變量:

            export

            env

            printenv

      ?刪除:unset name

      ?bash有許多內建的環境變量:PATH, SHELL, USRE,UID, HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1

       注意:環境變量和本地變量都是針對于當前終端有效,一但退出當前終端,再登錄之后,之前定義的環境變量就消失了。

     3.只讀和位置變量

      □只讀變量:只能聲名,但不能修改和刪除(一般針對常量,可以再次聲明為一個環境變量)

            readonly name

            declare -r name       declare -rx name(即是一個常量又是一個環境變量)

      

      ?位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數

            $1, $2, …:對應第1、第2等參數,shift [n]換位置

            $0: 命令本身

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

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

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

            $@ $* 只在被雙引號包起來的時候才會有差異

$.png

$-1.png

        示例:判斷給出的文件的行數

             linecount="$(wc-l $1| cut -d' ' -f1)"

             echo "$1 has $linecountlines

示例.png

五、算數運算:

     1.bash中的算術運算:help let

             +, -, *, /, %取模(取余), **(乘方)

乘方.png

       □實現算術運算:

            (1) let var=算術表達式

            (2) var=$[算術表達式]

            (3) var=$((算術表達式))

算數.png

            (4) var=$(expr arg1 arg2 arg3 …)

            (5) declare –i var= 數值(提前聲明為數字的整數類型)

declar.png

            (6) echo ‘算術表達式’ | bc

算法多種.png

      ?乘法符號有些場景中需要轉義,如*

      ?bash有內建的隨機數生成器:$RANDOM(1-32767)

            echo $[$RANDOM%50] :0-49之間隨機數

隨機數.png

    2.賦值

       □增強型賦值:

              +=, -=, *=, /=, %=

       ?let varOPERvalue

             例如:let count+=3

             自加3后自賦值

       ?自增,自減:

             let var+=1

             let var++

             let var-=1

             let var–

六、邏輯運算

       true(真), false(假)

       1, 0

    ?與(&)

          1 與1 = 1

          1 與0 = 0

          0與1 = 0

          0與0 = 0

    ?或(|):

          1 或1 = 1

          1 或0 = 1

          0 或1 = 1

          0 或0 = 0

     :(?。?/span>

          ! 1 = 0

          ! 0 = 1

    ?短路運算:

     短路與(&&):

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

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

     短路或(||):

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

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

     ?異或:^

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

七、聚集命令

     ?有兩種聚集命令的方法:

         ?復合式:date; who | wc -l

              命令會一個接一個地運行

         ?子shell:(date; who | wc -l ) >>/tmp/trace

              所有的輸出都被發送給單個STDOUT和STDER

順序.png

八、退出狀態

     1.進程使用退出狀態來報告成功或失敗

          0 代表成功,1-255代表失敗 

          $? 變量保存最近的命令退出狀態 (echo $?)存的是最后一條命令的結果,中間即使有錯誤,也不管。 

     ?例如:

          $ping-c1-W1hostdown&>/dev/null

          $echo$?

jj.png

     2.bash自定義退出狀態碼

         exit [n]:自定義退出狀態碼;(exit退出的是當前shell)

      注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決于exit命令后面的數字

      注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行的最后一條命令的狀態碼


九、條件測試      

     1.□判斷某需求是否滿足,需要由測試機制來實現;

          專用的測試表達式需要由測試命令輔助完成測試過程;

       ?評估布爾聲明,以便用在條件性執行中

             ?若真,則返回0

             ?若假,則返回1

       ?測試命令:

             ?test EXPRESSION

             ?[ EXPRESSION ]

             ?[[ EXPRESSION ]]  特定情況下使用。最穩妥

          注意:EXPRESSION前后必須有空白字符

測試.png

     2.條件性的執行操作符

       □根據退出狀態而定,命令可以有條件地運行

            ?&& 代表條件性的AND THEN

            ?|| 代表條件性的OR ELSE

與或.png

       ?例如:

             $grep-qno_such_user/etc/passwd\

             ||echo'Nosuchuser'

             Nosuchuser

             $ping-c1-W2station1&>/dev/null\

             >&&echo"station1isup"\

             >||(echo'station1isunreachable';exit1)

             station1isup

ping.png

    3.test命令

       □長格式的例子:

             $test"$A"=="$B"&&echo"Stringsareequal"

             $test“$A”-eq“$B”\

             &&echo"Integersareequal"

       ?簡寫格式的例子:

             $["$A"=="$B"]&&echo"Stringsareequal"

             $["$A"-eq"$B"]&&echo"Integersareequal

-eq.png


十、bash的測試類型

   1.數值測試:

             -gt: 是否大于;

             -ge: 是否大于等于;

             -eq: 是否等于;

             -ne: 是否不等于;

             -lt: 是否小于;

             -le: 是否小于等于;

      2.字符串測試:

             ==:是否等于;

              >: ascii碼是否大于ascii碼

              <: 是否小于

             !=: 是否不等于

             =~: 左側字符串是否能夠被右側的PATTERN所匹配

匹配.png

        注意: 此表達式一般用于[[ ]]中;

             -z "STRING":字符串是否為空,空為真,不空為假

             -n "STRING":字符串是否不空,不空為真,空為假

        注意:用于字符串比較時的用到的操作數都應該使用引號

-n,-z.png

【】【】.png

   3.文件測試

     □存在性測試

           -a FILE:同-e

           -e FILE: 文件存在性測試,存在為真,否則為假;

-a.png

     ?存在性及類別測試

           -b FILE:是否存在且為塊設備文件;

           -c FILE:是否存在且為字符設備文件;

           -d FILE:是否存在且為目錄文件;

           -f FILE:是否存在且為普通文件;

           -h FILE 或-L FILE:存在且為符號鏈接文件;

           -p FILE:是否存在且為命名管道文件;

           -S FILE:是否存在且為套接字文件;

文件測試.png

     4.文件權限測試

     □文件權限測試:

          -r FILE:是否存在且可讀

          -w FILE: 是否存在且可寫

          -x FILE: 是否存在且可執行

權限.png

     ?文件特殊權限測試:

          -g FILE:是否存在且擁有sgid權限;

          -u FILE:是否存在且擁有suid權限;

          -k FILE:是否存在且擁有sticky權限;

特殊權限.png

     5.文件大小測試

   □文件大小測試:

          -s FILE: 是否存在且非空;

     ?文件是否打開:

          -t fd: fd表示文件描述符是否已經打開且與某終端相關

          -N FILE:文件自動上一次被讀取之后是否被修改過

          -O FILE:當前有效用戶是否為文件屬主

          -G FILE:當前有效用戶是否為文件屬組

     6.雙目測試:

          FILE1 -efFILE2: FILE1與FILE2是否指向同一個設備上的相同inode

-ef.png

          FILE1 -ntFILE2: FILE1是否新于FILE2;(修改時間)

          FILE1 -otFILE2: FILE1是否舊于FILE2;

   7.組合測試條件

    □第一種方式:

          COMMAND1 && COMMAND2 并且

          COMMAND1 || COMMAND2 或者

          ! COMMAND 非

             如:[ -e FILE ] && [ -r FILE ]

    ?第二種方式:

          EXPRESSION1 -a EXPRESSION2 并且

-arw.png

          EXPRESSION1 -o EXPRESSION2 或者

          ! EXPRESSION

-o.png

     必須使用測試命令進行;

          # [ -z “$HOSTNAME” -o $HOSTNAME "==\

          "localhost.localdomain" ] && hostname www.magedu.com

          # [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

        


練習:

    1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。

練習1.png

練習1-2.png

    2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中

練習2.png

練習2-2.png

    3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值

練習3.png

練習3-1.png

    4、編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序

練習4.png

練習4-2.png

    5、寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和

練習2 2.png

練習2 1-1.png

    6、寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和

練習2 2.png

練習2 2-1.png

    7、寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件

練習2 3.png

練習2 3-1.png

    8、寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數

練習一.png1.png

    9、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”

2.png

2-2.png

   10、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫

3.png

4.png

   11、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。

5.png

5-1.png

    12、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,否,提示IP格式不合法,并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”

    13、計算1+2+3+4+…+100的值

6.png

6-1.png

    14、計算從腳本的第一個參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,是計算,否提示錯誤并退出。

end.png

end-1.png

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

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

相關推薦

  • OpenSSH的應用和利用OpenSSL創建私有CA簽證給httpd服務器開起https

    一、OpenSSH     OpenSSH與SSH協議是遠程登錄的首選連接工具。它加密所有流量,以消除竊聽,連接劫持和其它攻擊。OpenSSH常常被誤認以為與OpenSSL有關系,但實際上這兩個項目的有不同的目的,不同的發展團隊,名稱相近只是因為兩者有同樣的軟件發展目標──提供開放源代碼的加密通訊軟件。  &…

    Linux干貨 2016-04-24
  • Linux 文件系統權限

    一、簡述權限  文件系統的權限管理機制的建立,約束了用戶對數據的操作。 1、對系統安全而言  管理員的操作權限非常大,足以破壞系統,權限機制將管理員與普通用戶之間區分開,防止系統被隨意破壞。 2、對用戶而言  Linux是一個多用戶的操作系統,不同用戶間為了防止其他人破壞數據或訪問數據,文件系統的權限管理是非常必要的。 二、文件…

    Linux干貨 2016-08-04
  • 馬哥教育網絡班22期第2周課程作業

    一、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。     1、cp 文件復制 [選項]源文件 目標文件         -r 遞歸復制    …

    Linux干貨 2016-08-31
  • 使用ext_skel和phpize構建php5擴展

    首先聲明:我們要構建的是擴展或者模塊名為hello_module.該模塊提供一個方法:hello_word. 1、php環境的搭建 我們一般使用源碼包編譯安裝,而不是binary包安裝。因為使用PHP的二進制分發包安裝有些冒險,這些版本傾向于忽略./configure的兩個重要選項,它們在開發過程中很便利: 第一個–enable-debug。這個…

    Linux干貨 2015-05-28
  • 下載編譯安裝httpd 2.4最新版本

    關于這個問題分三步講:1.下載最新版本;2.編譯;3.安裝 一:下載httpd 2.4的最新版本:(這里以Centos 7為例,Centos 6里用的是2.2版本的) 下載的話如何找下載路徑—–>下載后是存在windows下,如何將其移進linux中  1.下載路徑: 當然我們現在只要是碰到不會或者不知道的東西,通常會…

    2017-08-26
  • 文件權限

    文件權限 文件屬性       rw-r–r–表示文件權限     Root 表示文件所有者     Root 表示文件所屬組     0 表示文件的大小 …

    Linux干貨 2016-08-11

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-16 17:15

    文章結構清晰,思路順暢,內容飽滿,圖文并貌,排版精美再接再厲哦。

欧美性久久久久