天天看點

Bash程式設計(四)

一、Bash特性hash

二、Bash變量

三、Bash特性多指令行執行

四、Bash特性多指令執行

五、Profile和Bashrc

=========================================

一、Bash特性之hash

    bash特性:

        指令行展開:~,{}

        指令别名:alias,unalias

        指令曆史:history

        檔案名通配:glob

        快捷鍵:ctrl+{a,e,u,k,l}

        路徑補全:

    bash特性之:指令hash//指令補全

        hash//儲存指令的執行結果

         每一次查找PATH變量,會很慢,是以儲存上一次指令的查找結果

        //再次運作一個指令的時候先查找hash然後查找PATH

        hash自己是shell内建的指令,不用做hash,隻會對外部指令做hash

        目的是加快指令查找速度

        緩存此前指令的查找結果:key-value

            key:搜尋鍵

            value:值

                -d删除某個記錄

                    hash-d dir //删除dir記錄

                -r清空所有記錄

bash的特性之一:變量//bash為弱類型

    程式:指令+資料

    指令:由程式檔案提供

        資料:IO裝置、檔案、管道

    程式:算法+資料結構

    變量名:指向記憶體中一段空間的起始位址

    變量指派:name=value

        bash隻有兩種類型:int和char

            預設為char

        變量類型:其實是變量中存儲值得資料類型

            程式設計語言:

                強類型變量:變量類型定以後,是不允許随便轉換的

                    c,除非進行類型轉換

                    弱類型:bash,

                假若數字和字元進行轉換,自動進行轉換

                    bash預設為字元型

                    bash中的變量無需事先聲明,強類型需要實作聲明變量類型

                    相當于,把聲明和指派過程同時實作

        變量替換:把變量名的位置替換為其所指向的記憶體空間中資料

        變量引用:${var_name},$var_name

        變量聲明:類型、變量名

            變量名的命名方式:字母、數字、下劃線任意組合,但是不能以數字開頭

                見名知義:命名機制遵循某種法則

                    不能使用保留字段:if,else,then,while等

    變量類型:bash預設為字元類型,//按存儲類型劃分

        字元型:

        數值型:

    變量類型:根據作用範圍劃分

        本地變量:作用域僅僅是目前shell

        環境變量:目前shell及其子shell

        局部變量:目前shell的某一個代碼片段(函數上下文)

        位置參數變量:當執行腳本的shell程序傳遞的參數

        特殊變量:shell内置的有特殊功用的變量

            $?:

            0:成功

            1-255:失敗

三、本地變量-環境變量-全局變量

 pstree//顯示程序數                

1.本地變量                 

        變量指派:name=value

        變量引用:${name},$name//有些是需要用引号的                 

            "":弱引用:變量名會替換其值                 

            '':強引用:變量名不會替換其值                 

        檢視變量:set

        變量引用:unsetname

            注意:此處非變量引用,不使用$

2.環境變量                 

        變量指派:export和declare

        (1)exportname=value

        (2)name=value

            export name

        (3)declare -xname=value

            -x設定為環境變量                 

            -i整形變量                 

            -r<200b>隻讀變量,無法撤銷                 

                readonlyname //即可設定變量為隻讀,無法撤銷                 

                無法重新指派                 

                目前shell程序終止後才會撤銷                 

        (4)name=value

                declare-x name

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

        注意:bash内嵌了很多環境變量,用于定義bash的工作環境                 

            例如:PATH,HISTFILE,HISTFILESIZE,HISTCONTROL,SHELL,UID,PWD,HOME

            全是大寫                 

        檢視:export,declare -x ;printenv,env

        撤銷:unset name

3.局部變量://多為函數内部變量                 

        #!/bin/bash

        functiontest(){

            locale a   //聲明局部變量                 

        }

bash特性之多指令執行:

    COMMAND1;COMMAND2;COMMAND3;...

        邏輯運算:隻有真/假

            真:true,yes,on,1

            假:false,no,off,0

        與:同時滿足

            &&

            iduser1 && echo ”yes"

            //第一個失敗,第二個就不會執行

            //第一個成功,第二個才會執行

        或:隻要有一個為真即可

            ||

            iduser1 || useradd user1

            //第一個執行成功,就不會執行第二個

            //第一個執行失敗,會執行第二個,并顯示第一個的執行結果

        非:取反

                            !

        異或:判斷是否不同

    注:If ! a && b|| c //第一個!是針對a。并不是針對整個表達式

shell腳本程式設計的實作

1.程式設計語言分類:根據運作方式

    編譯運作:源代碼-->編譯器(編譯)-->程式檔案

        運作速度快,但是拍錯效率低

        C語言:通過調用函數庫,或者類庫來完成

    解釋運作;源代碼-->運作時啟動解釋器,由解釋器邊解釋邊運作

        完全借助于外部的程式來完成

2.根據其程式設計過程功能的實作是調用庫還是調用外部的程式檔案:

        shell腳本程式設計

            利用系統上的指令及程式設計元件進行程式設計

        完整程式設計:

            利用庫和程式設計元件進行程式設計

        程式設計:過程式程式設計語言,面向對象的程式設計語言

                程式=指令+資料

            過程式:以指令為中心來組織代碼,資料是服務于代碼

                //一步一步來,一個時間順序

                順序執行;選擇執行;循環執行

                代表:C,bash,

            對象式:以資料為中心來組織代碼,圍繞資料來組織指令

                //根據不同的功能來實作

                類:(class):執行個體化對象,method

                代表:java,C++,Python //C++和Python同時支援面向對象和過程

2.shell腳本程式設計:特性

    過程式程式設計、解釋執行依賴于外部程式檔案運作

    如何寫shell腳本:

        腳本檔案的第一行:頂格:給出shebang,解釋器路徑,用于指明解釋目前腳本的解釋器程式檔案

            常見的解釋器:

            #!/bin/bash

            #!/usr/bin/python

            #!/usr/bin/perl

        文本編輯器:

            行編輯工具:sed

            全屏編輯工具:vim,vi,nano

        運作腳本:

            1.賦予執行權限呢,并直接執行此程式

                chmod+x a.sh

                ./a.sh

            2.使用解釋器運作

                bash a.sh

         注意:腳本中的空白行會被解釋器忽略

            腳本中,除了shebang,餘下的所有以#開頭的行,都會被視為注釋行

            //shell腳本是通過運作一個子shell程序中執行的

3.bash的配置檔案

    兩類:

        profile類:為互動式登入的shell程序提供配置

        bashrc類:為非互動式登入的shell程序提供配置

    登入類型:

        互動式登入shell程序:

        直接通過某終端輸入賬号和密碼後登入打開的shell程序

            使用su指令,su -USERNAME,或者使用su -l USERNAME執行的登入切換

    非互動式的登入:

        su USERNAME執行的登入切換

        在圖形界面下打開的終端:

            運作腳本

    profile類://登入的時候執行

        全局:對所有使用者都生效

            /etc/profile

            /etc/profile.d/*.sh

        局部的:對單個使用者生效

             ~/.bash_profile

        功用:

                1.用于定義環境變量

                2.運作指令或者腳本

        bashrc類://運作指令的時候使用

            全局:對所有使用者生效

                /etc/bashrc

            局部的:對單個使用者生效

                ~/.bashrc

            功用:

                1.定義本地變量

                2.定義指令别名

    注意:僅僅管理者可以修改全局配置檔案

    互動式登入shell程序:

        /etc/profile--->/etc/profile.d/*.sh --->~/.bash_profile

        //假如沖突的話,後讀取的生效

    非互動式的登入shell程序:

        ~/.bashrc--->/etc/bashrc-->/etc/profile.d/*

        指令行中定義的特性:例如變量和别名僅對目前shell程序的生命周期;

        配置檔案定義的特性,隻對随後重新啟動的shell程序有效

    讓通過配置檔案定義的特性立即生效;

        (1)通過指令行重複定義一次

        (2)讓shell程序重讀配置檔案

            #source/PATH/FROM/CONF_FILE

            ./PATH/FROM/CONF_FILE

            ~]#.  .bashrc //第一個 . 是引用,第二個是檔案名

4.讓所有使用者登入時都顯示資訊

    vim/etc/profile.d/welcome.sh

    echo"hello welcome"

附件一:面向對象和面向過程

    面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實作,使用的時候一個一個依次調用就可以了。

 面向對象是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描叙某個事物在整個解決問題的步驟中的行為。

例如五子棋,面向過程的設計思路就是首先分析問題的步驟:

    1、開始遊戲,2、黑子先走,3、繪制畫面,4、判斷輸赢,5、輪到白子,6、繪制畫面,7、判斷輸赢,8、傳回步驟2,9、輸出最後結果。把上面每個步驟用分别的函數來實作,問題就解決了。

面向對象的設計。整個五子棋可以分為:

    1、黑白雙方,這兩方的行為是一模一樣的,

    2、棋盤系統,負責繪制畫面,

    3、規則系統,負責判定諸如犯規、輸赢等。第一類對象(玩家對象)負責接受使用者輸入,并告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的i變化就要負責在螢幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。                                    

附件二:bashrc和profile的差別

         bashrc是shell的環境配置檔案

         profile是登入系統用的配置檔案

附件三:bash配置檔案

bash配置檔案: 

        profile類:登入shell //su - USERNAME,su -l USERNAME

        bashrc類:非登入shell提供 //su USERNAME,shell程序,圖形終端的終端

        讀取配置檔案順序:

            登入式shell:/etc/profile-->/etc/profile.d/*.sh--->~/.bash_profile-->~/.bashrc--->/etc/bashrc  //profile到bashrc

            非登入shell:~/.bashrc--->/etc/bashrc-->/etc/profile.d/*.sh   //bashrc到*.sh

本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1976980,如需轉載請自行聯系原作者

繼續閱讀