shell總結

守護進程:運行在後臺的進程,稱之爲守護進程也叫服務進程(提供某種特定的服務),多數會被設置爲開機時自動啓動;
交互式進程:與用戶有交互方能實現功能的,shell應用程序
   
        GUI:圖形化的交互進程
        CLI:命令形式交互進程
            COMMANDshell

                    shell程序會進行詞法分析區分哪些字符串是命令,哪些字符串是選項,哪些字符                     串是參數
                        shell程序內建一部分命令(shell內建命令)
                        shell程序也能調用外部命令,外部命令的二進制源碼存放在環境變量PATH指                         定的路徑中(外部命令)編程

                  fork() shell爲每個要執行的命令建立爲一個子進程;centos

       

    腳本或程序源文件:把要運行的一系列命令,寫在文件中;bash

        兩種方式:
            編譯執行:預處理-->編譯-->彙編-->連接;必須事先完成整個文本文件內容的語言轉換爲             二進制,處理後獲得二進制程序文件提交給cpu執行
                C, C++
            解釋執行:由解釋器全程參與運行過程,每次讀取一行並解釋一行得到二進制,將結果提             交給cpu運行;
                Python:編程庫
                    程序控制結構,調用編程庫完成程序編寫;
                    能夠調用庫文件:功能模塊,在編程中可調用;經過其API;
                Bash:編程
                    程序控制結構,調用機器上命令程序文件進行程序編寫;
                    調用外部命令:各應用程序提供;ide


        bash過程式編程:
            順序執行:逐個執行文本文件中的命令
            選擇執行:只執行其中符合選擇條件的一個分支
            循環執行:一段代碼要執行0,1或多遍模塊化

   變量:一個命名了的內存空間,變量名能夠理解爲某內存空間的地址門牌號。經過 $變量名 能夠獲    得該變量表明的內存空間中所存放的值 函數


        bash環境中有以下幾種變量:
            本地變量:只在當前shell進程中生效的變量;
            環境變量:在當前shell進程及其子進程生效的變量;
            局部變量:某個函數執行過程當中,該函數外無效;
            位置參數變量:在腳本中引用傳遞給腳本的參數;在函數中引用傳遞給函數的參數;
            特殊變量:$?:上一條命令的執行狀態結果
                      $*:統計傳遞給腳本文件的參數列表
                      $@:統計傳遞給腳本文件的參數列表
                      $#:統計傳遞給腳本文件的參數數量
                      $$:表示當前進程的編號測試


        變量類型:該變量所表明的內存空間所存放的值類型
            數值,字符;
                數值:
                    整數
                    浮點數
                字符:
                    ASCIIspa

                    120:
                        字符:1, 2, 0-->一個1表明一個字符用一個字節表示0000 0001
                        數值:120 --> 一個字節便能表示數值120,1111 10003d

            變量類型的做用:
                存儲空間:聲明變量類型有利於節省存儲空間的節省
                運算:聲明變量類型爲數值型才能進行變量運算
                存儲格式:聲明變量肯定變量是以字符仍是數值存儲

            語言對變量類型的支持力度:
                強類型:嚴格區分變量類型,必須事先聲明
                弱類型:變量類型不嚴格區分;
                    bash默認存儲機制:存儲爲字符

            bash的變量使用特色:弱類型、無須事先聲明;
           
        凡是自定義的變量儘可能小寫 避開系統自身的變量名
       
        本地變量:
            name=value
                name: 變量名
                =:賦值符號
                value:值

                變量名:只能包含數字、字母和下劃線;且不能以數字開頭
                引用變量:$name
                         ${name}(用在變量內容後面加字符修飾)例如 :name=dog 想表示dogs時                          引用${name}s  

            引用:
                弱引用: "", 其內部的變量引用會被替換爲變量值;
                強引用:'',其內部的變量引用會保持原有字符;
                命令引用:`COMMAND`, $(COMMAND),引用命令的執行結果;
               
                示例

[root@pks ~]# s1=dog                    ##設定本地變量s1 
[root@pks ~]# echo "$s1"                ##使用弱引用「」變量,替換成變量值 
dog 
[root@pks ~]# echo '$s1'                ##使用強引用‘’變量,保留變量名稱的字符 
$s1 
[root@pks ~]# echo $(ls /mnt)            ##使用命令替換 取得命令的執行結果 
a centos 
gcc-4.8.3-9.el7.x86_64.rpm gcc5-5.1.1+r225724-1.1.x86_64.rpm grub.conf host.conf 
hosts hosts-test k p prelink.cache prelink.conf y 
[root@pks ~]# echo "${s1}s"                ##爲變量值後跟字符使用${變量}  
dogs

            聲明爲整型:
                declare -i name[=value]
                let name=value
                聲明整數類型和在沒有聲明整數類型的狀況下其結果同樣,這是由於bash爲弱類型、                 無須事先聲明,在使用變量進行運算的時候會進行隱式轉行。
            查看全部當前的本地變量:set

            生命週期:
                建立:從變量賦值開始
                銷燬:
                    自動銷燬:shell進程終止;
                    手動銷燬:unset name

                    [root@pks ~]# unset s1                     
                    [root@pks ~]# echo "$s1"
                    [root@pks ~]#

       
        環境變量:
                用」導出「的方式使本地變量升級爲環境變量
                export name[=value]
                declare -x name[=value]
                             

[root@pks ~]# s1=dog 
[root@pks ~]# echo "$s1"                 
dog 
[root@pks ~]# bash                      ##開一個子bash進程 
[root@pks ~]# echo "$s1"                ##在子bash進程查無s1變量
[root@pks ~]# exit                        ##退出bash子進程 
[root@pks ~]# export s1                    ##在當前進程中聲明s1爲環境變量 
[root@pks ~]# bash                 
[root@pks ~]# echo "$s1"                ##在子bash進程查有s1變量,其值也爲dog            dog

               
            查看全部環境變量:env, printenv, export

            生命週期:
                建立:從變量賦值開始
                銷燬:unset name


    腳本:文本文件
       運行腳本:事實上是建立一個bash子進程,此進程負責從腳本文件中讀取一個執行邏輯,然後由        bash進程負責解析並運行此邏輯;
        啓動腳本:
            (1) # bash /PATH/TO/SCRIPT_FILE
            (2)  給予腳本文件執行權限,使用以下命令
                # ./PATH/TO/SCRIPT_FILE

                腳本文件的開頭shebang:
                    #!/bin/bash,指明解釋器的路徑

        第一行:頂格給出shebang
        註釋行:#爲註釋所用不會被bash進程解析該段字符

        bash的經常使用選項:
            -n: 檢查腳本中的語法錯誤;
            -x:調試執行腳本;(會將執行過程一步步顯示出來,便於邏輯調試)


    命令狀態結果:
        bash進程使用特殊變量#?用於追蹤執行的命令成功與否的狀態:
            0: 成功
            1-255:失敗

        布爾型:
            「真」:成功
            「假」:失敗

        能夠自定義腳本的執行狀態狀態結果:
            exit [n]

            注意:腳本中任何位置執行了exit命令即會終止當前shell進程,若是有自定義的執行狀態             值並將該值提交給特殊變量;


    特殊設備:
        /dev/null: 空,bit buckets,吞下全部數據,並直接丟棄; 
        取命令執行結果狀態而不須要命令的執行結果時,能夠輸出重定向&> /dev/null

        /dev/zero:吐出一堆0;


    腳本參數(位置參數變量):
        # ./script.sh  /etc/fstab /etc/grub2.cfg
              $0(腳本自己)         
              $1(腳本的第一個參數  /etc/fstab )           
              $2(腳本的第一個參數  /etc/grub2.cfg)

        位置參數變量:$1, $2, ...
            ${10},雙位數以上的變量引用時需用{}包裹數值

[root@pks var]# cat cat.sh
#!/bin/bash
#
cat $1 
echo "----------"
cat $2
[root@pks var]# ./cat.sh /etc/fstab /etc/host.conf 
#
# /etc/fstab
# Created by anaconda on Wed Aug 19 21:28:16 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=f745eac2-6b4c-48e8-bae5-aa43cd3d313a /                       ext4    defaults        1 1
UUID=baaa7f26-f28c-4db8-91fd-10c0d14ea07d /boot                   ext4    defaults        1 2
UUID=6becb873-32d7-4c9a-bfb8-838f021ca0e3 swap                    swap    defaults        0 0
/dev/sdb2                                 /mydata                 ext4    defaults        1 0 
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
----------
multi on

    特殊變量:
            $?: 命令的執行狀態結果;
            $#: 傳遞給腳本或函數的參數的個數;
            $*和$@: 引用傳遞給腳本或函數的參數列表;

        shift [n]:表明一次輪替掉n個參數,(默認輪替掉一個參數) 例如$1是a,$2是b,$3爲c
            shift後$1爲b ,shift 2後$1爲c

[root@pks var]# cat cat1.sh 
#!/bin/bash
#
echo "$#"
echo "----------"
echo "$*"
echo "----------"
echo "$@"
echo "----------"
echo "$1"
shift 
echo "----------"
echo "$1"
[root@pks var]# chmod +x cat1.sh 
[root@pks var]# bash cat1.sh /etc/fstab /etc/host.conf 
2                    ##echo "$#"
----------
/etc/fstab /etc/host.conf    ##echo "$*"
----------
/etc/fstab /etc/host.conf    ##echo "$@"
----------
/etc/fstab                   ##echo "$1"
----------
/etc/host.conf                ## shift 以後第一個變量被替換


   與用戶交互:接受用戶輸入參數
        read命令:
            read [options] VAR...
                -p "PROMPT" (用於作說明提示)
                -t timeout (說明若是多長時間沒輸入將會結束腳本)
               
        當輸入超過參數數量時,按空格依次賦值參數,以後輸入所剩的部分全賦值給最後一個參數

        當參數數量多餘輸入時,按空格依次賦值參數,沒有被賦值的變量值爲空
       

[root@pks var]# read f1 f2
hou are you
[root@pks var]# echo "$f1"
hou
[root@pks var]# echo "$f2"
are you
[root@pks var]# read f1 f2 f3
hello you
[root@pks var]# echo "$f1"
hello
[root@pks var]# echo "$f2"
you
[root@pks var]# echo "$f3"
[root@pks var]#


    命令引用:
        `COMMAND`, $(COMMAND)

        引用命令的執行結果;

        (1) ls `which cat`
        (2) lines=$(wc -l /etc/fstab | cut -d' ' -f1)


  

    算術運算:
        +, -, *, /, %, **
       
        (1) $[$A+$B]
        (2) $(($A+$B))
        (3) let VARIABLE=$A+$B
        (4) VARIABLE=$(expr $A + $B)     

[root@pks var]# A=5
[root@pks var]# B=7
[root@pks var]# C=$[$A+$B]
[root@pks var]# echo "$C"
12
[root@pks var]# D=$(($A+$B))
[root@pks var]# echo "$D"
12
[root@pks var]# let E=$A+$B
[root@pks var]# echo "$E"
12
[root@pks var]# F=$(expr $A+$B)
[root@pks var]# echo "$F"
5+7
[root@pks var]# F=$(expr $A + $B)         ##加號之間必須有空格
[root@pks var]# echo "$F"
12

    
    加強型賦值:
        +=
            let sum+=$i至關於sum=$[$sum+$i]

        -=, *=, /=, %=等用法和+=是同樣的

            let count=$[$count+1]   --> let count+=1 --> let count++
            let count=$[$count-1] --> let count-=1 --> let count--

        示例:顯示/etc目錄下全部普通文件列表,然後統計一共有多少個文件;

        #!/bin/bash
        #
        declare -i count=0                      ##定義計數器 整型變量count

        for file in /etc/*; do                  ##使用通配方法生產/etc文件目錄下的文件列表
            if [ -f $file ]; then                   
                 let count++                    ##當是普通文件時計數器變量count本身+1
                echo "$count $file"
            fi
        done

        echo "Total: $count files."


    測試表達式:
        整數測試:-gt, -lt, -ge, -le, -eq, -ne
        字符串測試:==, >, <, !=, -z, -n, =~

        注意:
            (1) 字符串等值比較測試:[ "$hostname" == 'localhost'  ]
            (2) 模式匹配測試:[[ "STRING" =~ PATTERN ]]

[root@pks var]# str1=hello
[root@pks var]# [ "$str1" == 'hello' ]
[root@pks var]# echo "$?"
0
[root@pks var]# [[ "$str1" =~ hel* ]]
[root@pks var]# echo "$?"
0
[root@pks var]# [ "$str1" != 'hel' ]
[root@pks var]# echo "$?"
0
[root@pks var]# [ "$str1" = 'hel' ]
[root@pks var]# echo "$?"
1
[root@pks var]#

        組合測試條件:
            條件間邏輯運算:
                與:多個條件要同時知足;
                或:多個條件知足其一便可;
                非:對指定的條件取反;

            表達式組合:
                與:` CONDITION1 -a CONDITION2 `
                或:` CONDITION1 -o CONDITION2 `
                非:[ ! CONDITION ]

            命令組合:
                與:COMMAND1 && COMMAND2  <-- [ EXPR1 ] && [ EXPR2 ]
                或:COMMAND1 || COMMAND2
                非:! COMMAND

                短路操做符:&&
                    false && true = false
                    false && false = false

                    true && false = false
                    true && true = true
                   
                    COMMAND1 && COMMAND2 只有當COMMAND1成立時,纔會執行COMMAND2;效果等同下                     面的if
                    if COMMAND1; then
                        COMMAND2
                    fi

                短路操做符:||
                    true || true = true
                    true || false = true

                    false || true = true
                    false || false = false
                   
                    COMMAND1 && COMMAND2 只有當COMMAND1不成立時,纔會執行COMMAND2;效果等同                 下面的if
                if ! COMMAND1; then
                    COMMAND2
                fi

                COMMAND1 && COMMAND2 || COMMAND3  只有當COMMAND1成立時,纔會執行COMMAND2;                 若是COMMADN1不成立則是COMMAND1 && COMMAND2整個不成立,便會執行command3
                效果等同下面的if
                    if COMMAND1; then
                        COMMAND2
                    else
                        COMMAND3
                    fi
                注意:&&的級別高於||

           

    函數:
        function: 功能
            把一段具備獨立功能代碼封裝在一塊兒,並給予命名;後續用到時,可直接經過給定函數名來調用總體代碼;

            函數做用:
                代碼重用;
                模塊化編程;將一段代碼放在其餘文件中,運行腳本文件時能夠讀入那其餘文件中的                 代碼

        函數的使用方法:
            先定義:編寫函數代碼
            後調用:給出函數名,還可按需傳遞參數

        定義方法:
            (1) function f_name {
                    函數體
                }

            (2) f_name() {
                    函數體
                }

        調用函數:
            f_name [argu1, argu2, ...]

        自定義函數狀態返回值:
            return [#]
                0: 成功
                1-255:失敗

            注意:函數代碼執行時,一旦遇到return,函數代碼終止運行,函數返回;

 

        模塊化編程
            功能:把腳本文件中的代碼分隔爲多段,放在不一樣的文件中
                假設/root/bin/srv目錄有兩個文件:
                (1) 函數文件
                (2) 腳本文件

        爲腳本使用配置文件
            一個文件中只定義變量
            腳本文件source此變量定義的文件

        變量的做用域:
            局部變量:
                local VARIABLE=value

            存活時間:                 函數執行開始,至函數返回結束;

相關文章
相關標籤/搜索