Shell編程基礎篇

1.變量
    用戶自定義變量
        用戶可以按照下面的語法規則定義自己的變量:變量名=變量值 。要注意的一點是,在定義變量時,變量名前不應加符號“$”,在引用變量的內容時則應在變量名前加“$”;在給變量賦值時,等號兩邊一定不能留空格,若變量中本身就包含了空格,則整個字符串都要用雙引號括起來。
    位置變量
        通過命令行給程序傳遞執行參數。
            $0:當前執行的進程/程序名
            $n:(n爲1-9的數字)第幾個位置參數
    預定義變量
        $#:命令行中位置參數的個數
        $*:所有位置參數的內容
        $?:上一條命令執行後返回的狀態,當執行成功時返回0,不成功返回非0
        $n:位置參數變量
        $$:當前進程的id
        $!:最後一個後臺進程的id
    環境變量
        在開始執行時就已經定義了一些和系統的工作環境有關的變量,這些變量用戶還可以重新定義。
            HOME:用於保存註冊目錄的完全路徑名。
            PATH:用於保存用冒號分隔的目錄路徑名,shell將按PATH變量中給出的順序搜索這些目錄,找到的第一個與命令名稱一致的可執行文件將被執行。
            TERM:終端的類型。
            UID:當前用戶的標識符,取值是由數字構成的字符串。
            PWD:當前工作目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化。
            PS1:主提示符,在特權用戶下,缺省的主提示符是“#”,在普通用戶下,缺省的主提示符是“$”。

            PS2:在shell接收用戶輸入命令的過程中,如果用戶在輸入行的末尾輸入“\”然後回車,或者當用戶按回車鍵時shell判斷出用戶輸入的命令沒有結束時,顯示這個輔助提示符,提示用戶繼續輸入命令的其餘部分,缺省的輔助提示符是“>”。

2.算數運算符
    (())
        例如
            1.((i=$j+$k))     等價於   i=`expr $j + $k`  
            2.((i=$j-$k))     等價於   i=`expr $j - $k`
            3.((i=$j*$k))     等價於   i=`expr $j \* $k`
            4.((i=$j/$k))     等價於   i=`expr $j / $k`
    $(())
        例如
            1.echo $((1+2))
            2.echo $((1-2))
            3.echo $((1*2))
            4.echo $((1/2))
    let
        例如
            1.let i=1+2
            2.let i=1-2
            3.let i=1*2
            4.let i=1*
            5.let "i=1+1"
            6.let "i = 1 + 1"
            7.let i=1+1
            8.let "i = i + 1"
            9.let i=i+1
    expr
        例如:
            1.sum=$(expr $num1 + $num2)
    declare
        例如:
            1.num1=123
              num2=456
              declare -i sum=$num1+$num2
    注意:
        1.在括號運算中((i=$j+$k))運算符號兩邊可以有空格也可以沒有空格,但是expr運算i=`expr $j + $k`中運算符號兩邊必須要有空格!
        2.乘法運算符號是 \* ,而不是 *
        3.除法運算 / 表示整除,1/2=0
        4.let表達式中的變量前不必有$
        5.如果表達式中包含了空格或其他特殊字符,則必須引起來。(let i=i+1中除了let後面有一個空格外,其他地方不能有一個空格!)

3.條件測試
    test
        用途:測試特定的表達式是否成熟,當條件成立時,命令執行後的返回值爲0,否則爲其他數字。
        格式: test 條件表達式 或者 [ 條件表達式 ]
        常見的測試操作符
            -d:測試是否爲目錄
            -e:測試目錄或者文件是否存在
            -f:測試是否爲文件
            -r:測試當前用戶是否有權限讀取
            -w:測試當前用戶是否有權限寫入
            -x:測試當前用戶是否可執行該文件
           -L:測試是否爲符號連接文件
    例如:
        if [ -f ./file ];then
            echo "exists!"
        else
            echo "not exists!"
        fi
     整數值比較
        格式:[ 整數1 操作符 整數2 ]
        常用的測試操作符
            -eq:等於
            -ne:不大於
            -gt:大於
            -lt:小於
            -le:小於或等於
            -ge:大於或等於
    例如:
        if [ 30 -ge 12 ];then
            echo '30 > 12'
        else
            echo '30 < 12'
        fi
    字符串比較
        格式:[ 字符串1 = 字符串2 ] [ 字符串1 != 字符串2 ] [ -z 字符串 ]
        常用的測試操作符
             =: 字符串內容相同
            !=: 字符串內容不同,
            -z: 字符串內容爲空
    例如:
        if [ 'admin' = 'admin' ];then
            echo '相等'
        else
            echo ‘不相等’
        fi
    邏輯測試
        格式:[ 表達式1 ] 操作符 [ 表達式2 ] ...
        常用的操作符
            -a或者&&:邏輯與,前後兩個表達式都成立時整個測試結果才爲真,否則爲假
            -o或者||:邏輯或,操作符兩邊至少一個爲真時測試結果才爲真,否則爲假
            !:邏輯否,當指定的條件不成立時,返回結果爲真
    例如:
        if [ 'admin' = 'admin' ] && [ 'pass' = 'pass' ];then
            echo '相等'
        else
            echo ‘不相等’
        fi流程判斷
if
    例如:
        1.年齡判斷
        if [ $age -lt 18 ];then
            echo '未成年'
        else
            echo '已成年'
        fi
        2.成績級別
        if [ $score -lt 60 ];then
            echo '60以下'
        elif [ $score -lt 70 ];then
            echo '60-70'
        elif [ $score -lt 80 ];then
            echo '70-80'
        elif [ $score -lt 90 ];then
            echo '80-90'
        else
            echo '90-100'
        fi
case
    例如:
        1.星期幾的判斷
        case $week in
            1)
                echo '週一'
                ;;
            2)
                echo '週二'
                ;;
            3)
                echo '週三'
                ;;
            4)
                echo '週四'
                ;;
            5)
                echo '週五'
                ;;
            6)
                echo '週六'
                ;;
            7)
                echo '周七'
                ;;
            *)
                echo '其他'
                ;;
        esac

5.循環控制
   while
    例如;
    1.
        while [ $num -gt 0 ]
        do
            echo $num
            num=$(($num-1))
        done
        echo $num
    2.
  for in
    例如:
    1.
        for i in user0 user1 user2
        do
            echo $i
        done
    2.
        for((i=0;i<10;i++))
        do
            echo $i
        done
    3.
        for i in `ls /etc`
        do
            echo $i
        done

6.shift、break、continue、exit

   shift
        例如:
        1.
            while [ $# -gt 0 ]
            do
                tot = $(($tot+$1))
                shift
            done
    break
        命令可以帶一個參數,一個不帶參數的break 循環只能退出最內層的循環,而break N可以退出N層循環。
        例如:
            1.
                #!/bin/sh  
                for i in "a b c d"
                do   
                echo "$i "
                 for j in `seq 10`  
                    do  
                      if [ $j -eq 5 ];then
                        break  
                      fi  
                      echo "$j "
                    done
                echo  
                done
            2.
                #!/bin/sh  
                for i in "a b c d"
                do   
                echo "$i "
                 for j in `seq 10`  
                    do  
                      if [ $j -eq 5 ];then
                        break 2
                      fi  
                      echo "$j "
                    done
                echo  
                done
    continue
        命令也可以帶一個參數,一個不帶參數的continue 命令只去掉本次循環的剩餘代碼,而continue N 將會把N層循環剩餘的代碼都去掉,但是循環的次數不變。
        例如:
            1.
                #!/bin/sh  
                for i in "a b c d"
                do   
                echo "$i "
                 for j in `seq 10`  
                    do  
                      if [ $j -eq 5 ];then
                        continue  
                      fi  
                      echo "$j "
                    done
                echo  
                done
            2.
                #!/bin/sh  
                for i in "a b c d"
                do   
                echo "$i "
                 for j in `seq 10`  
                    do  
                      if [ $j -eq 5 ];then
                        continue 2
                      fi  
                      echo "$j "
                    done
                echo  
                done

   exit

    在shell腳本中可以終止當前腳本執行。
    格式:exit n
    例如:
        1.exit 0
        2.
            if [ "$#" -ne "2" ]; then  
                echo "usage: $0 <area> <hours>"  
                exit 2  
            fi  
    注意:
        1.n爲退出碼
        2.退出碼的約定:0表示成功;非0表示失敗(2表示用法不當、127表示命令沒有找到、126表示不是可執行的、>=128 信號產生)。

7.函數
    例如:
    1.
        // 函數定義
        function add(){
            echo 'aaaaaaaa'
        }
        // 函數調用
        add
    2.
        // 函數定義及傳參
        function add(){
            num=$1 // 參數的調用類似於位置變量
            for((i=1;i<=$num;i++))
            do
                tot = $(($tot+$i))
            done
        }
        // 調用傳參的函數
        add 100
    3.
        // 函數定義
        function add(){
            return 'aaaaaaaa'
        }
        // 函數調用
        add
        // 獲取函數返回值
        echo $?
    注意:
        1、必須在調用函數地方之前,聲明函數,因爲shell腳本是逐行運行。不會像其它語言一樣先預編譯。所以必須在使用函數前先聲明函數。

        2、total=$(add 100);  通過這種調用方法,我們清楚知道,在shell中單括號裏面,可以是:命令語句。 因此,我們可以將shell中函數,看作是定義一個新的命令,它是命令,因此各個輸入參數直接用空格分隔。命令裏面獲得參數方法可以通過:$0…$n得到。 $0代表函數本身。
        3、函數返回值,只能通過$? 系統變量獲得,直接通過=,獲得是空值。其實,我們按照上面一條理解,知道函數是一個命令,在shell獲得命令返回值,都需要通過$?獲得。

8.文件引用
    1. . filename
    2. source filename
    注意:
        兩種方式的效果相同,簡單起見,一般使用點號(.),但是注意點號(.)和文件名中間有一空格。

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