1. 程式人生 > 其它 >Linux之Shell程式設計

Linux之Shell程式設計

3.Shell程式設計

1.shell是什麼

shell是一個命令列直譯器,它為使用者提供了一個向Linux核心傳送請求以便執行程式的介面系統級程式,使用者可以用shell來啟動、掛起、停止一些程式。

2. shell指令碼的執行方式

  • 指令碼格式要求

    • 1.指令碼以#!/bin/bash開頭

    • 2.指令碼需要可執行許可權

  • 編寫一個shell指令碼,輸出hello shell

    • mkdir /root/shcode

    • cd /root/shcode

    • vim hello.sh

    • 輸入

      • #!/bin/bash
      • echo "hello shell "
  • 指令碼的常用執行方式

    • 方式1:(輸入指令碼的絕對路徑或相對路徑)

      • 說明:首先要賦予helloshell.sh指令碼的 +x 許可權,

      • 再執行指令碼chmod u+x hello.sh

      • ./hello.sh或者 /root/shcode/hello.sh

    • 方式2:(sh+指令碼)

      說明:不用賦予指令碼+x許可權,直接執行即可。
      sh hello.sh

3.shell的變數

  • shell變數介紹
    1.Linux shell 中的變數分為,系統變數和使用者自定義變數。

    2.系統變數: $HOME $PWD $SHELL $USER

    3.顯示當前shell中所有變數:set

  • shell變數的定義

    • 基本語法
      1.定義變數: 變數名=值

      2.撤銷變數: unset 變數

      3.宣告靜態變數:readonly 變數 ,但是不能unset

  • 案例

    • 案例1:宣告變數A

      • vim var.sh
      • #!/bin/bash
      • A=100
      • echo "A=$A"
    • 案例2:撤銷變數A

      unset A

    • 案例3:宣告靜態的變數B,不能unset

      readonly B

  • shell變數的定義

    • 定義變數的規則
      1.變數名稱可以由字母、數字、和下劃線組成,但是不能以數字開頭。 5A=100 (x)

      2.等號兩側不能有空格

      3.變數名稱一般習慣為大寫,這是一個規範

    • 將命令的返回值賦給變數
      1.A=date

      反引號, 執行命令,並把結果返回給變數A

      2.A=$(date) 等價於反引號

4.設定環境變數

  • 基本語法

    1. export 變數名=變數值 功能描述:將shell變數輸出為環境變數/全域性變數

    2. source 配置檔案 功能描述:讓修改後的配置資訊立即生效

    3. echo $變數名 功能描述:查詢環境變數的值

  • 案例

    1. 在/etc/profile檔案中定義TOMCAT_HOME環境變數
      ....
    2. 檢視環境變數TOMCAT_HOME的值
      ....
    3. 在另一個shell程式中使用 TOME_HOME
      ....
  • 注意:
    在輸出TOMCAT_HOME環境變數前,需要讓其生效
    source /etc/profile

  • shell指令碼的註釋

    • shell指令碼單行註釋 採用 #開頭

    • shell指令碼多行註釋 :<<! 多行註釋內容 !

5.位置引數變數

當我們執行一個shell指令碼時,如果希望獲取到命令列的引數資訊,就可以使用到位置引數變數。
比如: ./myshell.sh 100 200 這就是一個執行shell的命令列,就可以在myshell指令碼中獲取到引數資訊

  • 基本語法
    1.$n 功能描述:n為數字,$0代表命令本身,$1-$9代表第一到第九個引數,十以上的引數需要使用大括號包含,如${10}

    2.$* 功能描述:這個變數代表命令列中的所有引數 ,此命令把所有引數看成一個整體

    3.$@ 功能描述:這個變數也代表命令列中的所有的引數,但是此命令把每個引數區分對待

    4.$# 功能描述:這個變數代表命令列中的所有引數的個數

  • 位置引數變數

    • 案例:編寫一個shell指令碼position.sh,在指令碼中獲取到命令列的各個引數資訊
      • #!/bin/bash

      • echo "0=$0 1=$1 2=$2"

      • echo "所有的引數=$*"

      • echo "$@"

      • echo "引數的個數=$#"

      • 執行 sh position.sh 100 200

      • 輸出結果

        • 0=./position.sh 1=100 2=200
        • 所有的引數=100 200
        • 100 200
        • 引數的個數=2

6.預定義變數

就是shell指令碼設計者事先已經定義好的變數,可以直接在shell指令碼中使用

  • 基本語法

    1. $$ 功能描述:當前程序的程序號(PID)

    2. $! 功能描述:後天執行的最後一個程序的程序號(PID)

    3. $? 功能描述:最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值非0(具體的數字由命令本身來決定),則證明上一條命令執行不正確。

  • 應用案例

    在一個shell指令碼中簡單使用預定義變數
    prevar.sh

7.運算子

  • 基本語法

    1. "$((運算式))""$[運算式]" 推薦使用 或者 expr m + n

    2. 注意expr運算子間要有空格

    3. expr m-n

    4. expr \*, / , % 乘,除,取餘

  • 應用例項

    • 案例1:計算(2+3)*4
      1.$(((2+3)*4))

      2.$[(2+3)*4]

      3.TEMP=expr (2 + 3)`

      4.RES=expr TEMP * 4``

    • 案例2:求出命令列的兩個引數[整數]的和

      • vim oper.sh

      • #!/bin/bash

      • SUM=$[$1+$2]

      • echo "sum=$SUM"

      • ./oper.sh 20 50

8.條件判斷

  • 判斷語句

    • 基本語法
      [ condition ] 注意condition前後要有空格

      非空返回true,可使用$?驗證(0為true,>1為false)

  • 應用例項

    [] true

    [] false

    [ condition ] && echo OK || echo notok 條件滿足,執行後邊語句

  • 常用判斷條件

    1. = 字串比較

    2. 兩個整數的比較

      -lt 小於

      -le 小於等於 little equal

      -eq 等於

      -gt 大於

      -ge 大於等於

      -ne 不等於

    3. 按照檔案許可權進行判斷

      -r 有讀的許可權

      -w 有寫的許可權

      -x 有執行的許可權

    4. 按照檔案型別進行判斷

      -f 檔案存在並且是一個常規的檔案

      -e 檔案存在

      -d 檔案存在且是一個目錄

  • 使用案例

    • 案例1: 判斷"ok" 是否等"ok"

      判斷語句 =

    • 案例2: 23是否大於等於22

      判斷語句 -ge

    • 案例3: /root/shcode/aaa.txt目錄中的檔案是否存在

      判斷語句 -f

9.流程控制

  • if判斷

    • 基本語法
      • if [條件判斷式] then 程式碼 fi

      • if [條件判斷表示式] then 程式碼 elseif [條件判斷表示式] 程式碼 fi

      • [ 條件判斷式 ] ,中括號和條件判斷式之間必須有空格

  • 應用例項 ifcase.sh
    編寫shell程式,如果輸入的引數大於等於60,輸出及格了,如果輸入小於60,輸出不及格。

    #!/bin/bash
    if [ $1 -ge 60 ]
    then
    echo "及格"
    elif [ $1 -lt 60 ]
    then
    echo "不及格"
    fi

  • case語句

    • 基本語法
      • case $變數名 in "1")

        如果變數的值等於值1,則執行程式1

      • ;; "2")

        如果變數的值等於值2,則執行程式2

      • ;; "* ")

        如果變數的值都不是以上的值,則執行此程式

      • ;; esac

  • 應用案例

    當命令列引數是1時,輸出週一,當是2時,輸出週二,其他情況輸出other

    #!/bin/bash
    case $1 in
    "1")
    echo "週一"
    ;;
    "2")
    echo "週二"
    ;;
    *)
    echo "other"
    ;;
    esac

  • for 迴圈

    • 基本語法1
      for 變數 in 值1 值2 值3 ... do 程式/程式碼 done

    • 基本語法2

    for ((初始值;迴圈控制條件;變數變化)) do 程式 done

  • while迴圈

    • 基本語法1

      while [ 條件判斷式 ] do 程式 done

10.read讀取控制檯輸入

  • 基本語法
    read(選項)(引數)

    1. 選項
      -p 功能:指定讀取值時的提示符;

      -t 功能:指定讀取值時等待的時間(秒),如果沒有在指定的時間輸入,就不再等待了。

    2. 引數
      變數: 指定讀取值的變數名

  • 應用例項 testRead.sh

    案例1:讀取控制檯輸入一個num值

    案例2:讀取控制檯輸入一個num值,在10秒內輸入

    #!/bin/bash
    read -p "請輸入一個數NUM1=" NUM1
    echo "你輸入的數NUM1=$NUM1"
    read -t 10 -p "請輸入一個數NUM2=" NUM2
    echo "你輸入的數NUM2=$NUM2"

11. 函式

shell程式設計和其他程式語言一樣,有系統函式,也可以自定義函式。

  • 系統函式

    1. basename基本語法 功能:返回完整路徑最後/的部分,常用於獲取檔名

      basename pathname suffix

      basename string suffix 功能描述:basename命令會刪掉所有的字首包括最後一個'/'字元,然後將字串顯示出來。

      選項:suffix為字尾,如果指定了suffix,basename會將pathname或string中的suffix去掉

  • 應用例項
    請返回/home/aaa/test.txt的test.txt的部分

    指令:

    • basename /home/aaa/test.txt
      執行結果: test.txt
    • basename /home/aaa/test.txt .txt

    執行結果: test

  1. dirname基本語法
    功能:返回完整路徑最後/的前面的部分,常用於返回路徑部分

    dirname 檔案絕對路徑 功能描述:從給定的包含絕對路徑的檔名中去除檔名(非目錄的部分),然後返回剩下的路徑(目錄的部分)

    應用案例
    案例1:請返回/home/aaa/test.txt的/home/aaa

    指令: dirname /home/aaa/test.txt

  2. 自定義函式

    1. 基本語法
      [function] funname[()] { action; [return int;] }

    2. 呼叫直接寫函式名 funname [值]

    3. 應用例項
      1. 計算輸入兩個引數的和,getSum

      #!/bin/bash
      #計算輸入兩個引數的和,getSum

      # 定義函式getSum
      function getSum()
      {
      SUM=$[ $n1+$n2 ]
      echo "和是=$SUM"
      }

      #輸入兩個值
      read -p "請輸入一個值n1=" n1

      read -p "請輸入一個值n2=" n2