Linux基礎知識(三)

寫在前面:

    博客書寫牢記5W1H法則:What,Why,When,Where,Who,How。


本節主要內容:

◆ bash特徵之:命令補全和路徑補全

◆ 目錄管理命令:

    mkdir、rmdir

◆ bash特徵之:命令行展開

    tree

◆ bash特徵之:命令執行狀態結果

◆ 文件查看類命令:

    more、less、head、tail、stat、touch

◆ 文件管理類命令:

    cp、mv、rm

◆ bash特徵之:glob(通配符)

◆ bash特徵之:變量

    set、unset、declare、export、env、printenv、readonly

◆ bash特徵之:I/O重定向和管道

    tr


回顧:

    廣義的shell:GUI和CLI


bash特徵之:命令補全和路徑補全

    命令補全:

        shell程序在接收到用戶執行命令的請求且分析完成之後,最左側的字符串講當做命令去查找,分別查找內部命令和外部命令。

        由於外部命令文件存儲在不同的系統目錄中,那麼查找外部命令之前就必須讓系統知道命令文件路徑,而linux中的$PATH變量就是用來存儲這個路徑的。

        $PATH的查找方式爲從左到右,當給定的頭部字符串能夠唯一標識某程序文件名時,則直接補全,不能唯一標識時,再次按tab給出列表。

        命令錯誤時按tab沒有響應。

    路徑補全:

        與命令補全類似,當給出的路徑名前幾個字符串能夠唯一標識路徑或文件名時,按tab會自動補全

        不能唯一標識時,按2下tab會給出列表。

        路徑錯誤按tab沒有響應。

目錄管理命令:

    mkdir與rmdir

    mkdir

    mkdir [OPTION]... DIRECTORY...

        -m|--mode=MODE:設置目錄權限;

        -p|--parents:當父目錄不存在時,直接創建,而不是報錯

        -v|--verbose:顯示詳細信息

    rmdir

    rmdir [OPTION]... DIRECTORY...

        -p|--parents:刪除子目錄後,如果其父目錄爲空,也一併刪除

        -v|--verbose:顯示詳細信息


bash特徵之:命令行展開

     把命令行給定的特殊符號直接自動替換爲相應字符串的機制。

     ~:自動替換爲登錄用戶家目錄;

    ~USERNAME:自動替換爲USERNAME的家目錄;

    {}:路徑或文件展開符,可展開用“,”隔開的多個路徑;

    如:/tmp/{x/y,m/{m,n}}則表示/tmp/x/y,/tmp/m/m,/tmp/m/n三個路徑或文件

    tree:

    list contents of directories in a tree-like format.

        -d:只顯示目錄

        -P PATTERN:只顯示匹配PATTERN的文件或目錄

        -I PATTERN:不顯示匹配PATTERN的文件或目錄

        -L LEVEL:顯示的最深目錄層級

bash特徵之:命令執行狀態結果

    命令的執行狀態結果是命令執行完成後返回的一個狀態數值,與命令的輸出結果不是同一個概念。

    通過命令引用,得到的是命令的執行完成輸出結果。

        ·COMMAND·

    命令的執行狀態結果:

        成功:0

        失敗:1-255

    bash將命令執行狀態結果保存在特殊變量$?中,注意其只保留了最後一次執行的命令狀態結果。

文件查看類命令:

    分屏查看命令:more、less

        more:

        more [options] file [...]

        less:

        less  file [...]

    head:

    output the first part of files

    head [OPTION]... [FILE]...

        -n,--lines=[-]N:打印前N行,如果爲-N,則打印除最後N行的其他行。

    tail:

    output the last part of files

    tail [OPTION]... [FILE]...

        -f,--follow:查看文件尾部並且不退出,當追加新內容時,繼續顯示;Ctrl+c結束顯示;

        -n,--lines=[+]N:打印後N行,如果爲+N,則打印第N行至最後一行的內容;

    stat:

     display file or file system status

    stat [OPTION]... FILE...

        -f,--file-system:display file system status instead of file status

        例如:不加任何參數stat的輸出如下:

File: `/etc/fstab'
Size: 860             Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 131079      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-03-05 18:15:15.642655122 +0800
Modify: 2016-03-05 18:02:57.132999974 +0800
Change: 2016-03-05 18:13:53.404999799 +0800

    回顧:文件的數據組成分爲元數據(metadata,記錄了文件大小,訪問權限,屬組屬主等信息)和數據(data block,數據本身)

    這裏指出了3個時間戳(timestamps):

        Atime:文件最近一次被訪問的時間;

        Mtime:文件最近一次被修改的時間(數據);

        Ctime:文件最近一次被修改的時間(元數據);

    touch:

        change file timestamps

        touch [OPTION]... FILE...

        不加任何參數,則修改atime和mtime爲當前時間

            -a:只修改atime;

            -m:只修改mtime;

            -t STAMP:使用[[CC]YY]MMDDhhmm[.ss]格式手動設置時間,而不是當前時間;


文件管理工具:

    cp:

    copy files and directories

    cp [OPTION]... [-T] SOURCE DEST

    cp [OPTION]... SOURCE... DIRECTORY

    cp [OPTION]... -t DIRECTORY SOURCE...

    默認情況下,cp複製遇到軟鏈接文件時,會直接複製鏈接指向的文件。

        -a,--archive:歸檔複製,保留權限信息、遞歸、保留鏈接文件本身;

        --bakcup:保留所有屬性信息,甚至atime都不會修改;

        -i,--interactive:交互式提醒,有重複文件時提醒;

        -f,--force:強制覆蓋;

        -R,-r,--recursive:遞歸複製目錄及其子目錄下內容;

        -P,--no-dereference:複製鏈接本身,而非鏈接指向的文件;

        --parents:在目的目錄,保留目錄路徑信息;如cp --parents /etc/fstab .會在當前目錄新建etc目錄,然後在etc目錄裏創建fstab文件

        --preserve[ATTR LIST]:指定保留的屬性列表

            默認:mode,ownership,timestamps;

            額外:context(上下文),links, xattr, all

        -v, --verbose;顯示詳細信息;

    mv:

    move (rename) files

    mv [OPTION]... [-T] SOURCE DEST

    mv [OPTION]... SOURCE... DIRECTORY

    mv [OPTION]... -t DIRECTORY SOURCE...

        -i, --interactive:交互式提醒;

        -f, --force:強制操作;

        -v, --verbose;顯示詳細信息;

    rm:

    remove files or directories

    rm [OPTION]... FILE...

        -f,--force:強制複製,直接操作取消提醒;

        -i:交互提醒;

        -r, -R, --recursive:遞歸

        -v, --verbose;顯示詳細信息

bash特徵之:glob(通配符)

    glob:文件名統配,用以快速引用多個文件。

    元字符:通配符中具有特殊意義的專用字符,可編寫匹配模式(pattern)。

    *:匹配任意長度的任意字符;

        如p*匹配:p、p88、prdsfsdflkj、p%%%%%等

    ?:匹配單個任意字符;

        如p?匹配:p1、pr、pp等

    []:匹配指定字符集中的其中一個字符;

        [a-z]匹配大小寫a-z之間的任意一個字符;

        [0-9]匹配0到9之間任何一個字符;

        用[]標示各種字符的特定格式如下:

            man tr可以看到[:alnum:]等!!!

            [[:upper:]]:所有大寫字母;

            [[:lower:]]:所有小寫字母;

            [[:digit:]]:所有的數字;

            [[:alpha:]]:所有字母;

            [[:alnum:]]:所有字母和數字;

            [[:space:]]:空白字符;

            [[:punct:]]:標點符號;

    [^ ]:匹配指定字符以外的任意字符;

        如[^0-9]匹配非數字的任意字符


bash特徵之:變量

    變量:存儲於內存空間中的一段有名稱可改變值的數據;

    變量命名規則:

        1.名稱中只能使用字母、數字和下劃線;

        2.不能以數字開頭;

        3.區分大小寫;

        4.儘量做到見名知義;

        5.不能與系統內置變量及關鍵字相同;

    變量賦值:

        VAR_NAME=VAR_VALUE

    變量類型:

        bash是弱類型編程語言,變量無需事先聲明,不區分變量中存儲的數據類型,統一認爲是字符串類型。

    變量引用:

        ${VAR_NAME};

    變量作用域:

        變量的生效範圍,即可被引用的範圍。

    變量種類及設置:

        本地變量:作用域爲當前shell進程,其他進程或當前shell的子進程無法引用,當前shell進程終止,變量會被自動撤銷;

            定義本地變量:

                set VAR_NAME=[VAR_VALUE]

            撤銷變量:

                unset VAR_NAME

        環境變量:作用域爲當前shell進程及其子進程;

            定義環境變量:

                declare -x VAR_NAME[=VAR_VALUE]

                export VAR_NAME[=VAR_VALUE]

            查看環境變量:

                export

                declare -x

                env

                printenv

            更改爲本地變量:

                declare +x VAR_NAME

             撤銷變量:

                unset VAR_NAME

        局部變量:函數中定義的變量,只在函數中可被引用;

        位置參數變量:shell編程中經常用到的,運行腳本時後面跟的參數,在腳本內用$#調用;

        特殊變量:如$?等具有特殊含義的變量;

        只讀變量:

            只讀變量不支持重新賦值和撤銷操作。

            declare -r VAR_NAME

            readonly VAR_NAME=VAR_VALUE

        取消只讀:

            declare +r VAR_NAME

bash特徵之:I/O重定向和管道

    重定向允許講默認打印到屏幕的數據重新定位到文件,或者默認從鍵盤讀取的數據更改爲從文件讀取。

    程序的默認數據流走向:

        輸入數據流: <--,標準輸入(stdin),鍵盤;

        輸出數據流:-->,標準輸出(stdout), 顯示器;

        錯誤數據流:-->,錯誤輸出(stderr),顯示器;

    文件描述符(File Descriptor,FD):

        stdin(標準輸入):0

        stdout(標準輸出):1

        stderr(錯誤輸出):2

    I/O重定向:

        標準輸出重定向:

            COMMAND > /PATH/TO/FILE

            將標準輸出寫入文件,如文件已存在數據則覆蓋;文件不存在自動新建;

            COMMAND >> /PATH/TO/FILE

            將標準輸出追加到文件;文件不存在自動創建;

        shell中重定向功能開關設置:

            set -C

            禁止覆蓋輸出重定向至已存在文件;仍然可以使用>|來覆蓋

            set +C

            關閉此功能開關

        標準錯誤輸出重定向:

            COMMAND 2> /PATH/TO/FILE

            錯誤輸出寫入文件,覆蓋原文件數據,文件不存在自動創建

            COMMAND 2>> /PATH/TO/FILE

            錯誤輸出追加到文件,文件不存在自動創建

        合併標準輸出和標準錯誤輸出:

            1、使用&>或&>>符號

                如:COMMAND &> /PATH/TO/FILE

            2、使用>和2>&1 或 >>和2>&1

                如:COMMAND > /PATH/TO/FILE 2>&1

                COMMAND >> /PATH/TO/FILE 2>&1

        特殊輸入輸出文件:

            /dev/zero:

                會源源不斷的提供二進制數據流

            /dev/null:位桶

                任何重定向到此文件的數據都會被丟棄

        標準輸入重定向:

            COMMAND < /PATH/FROM/FILE

        輸入結束符:<< EOF

            cat > FILE << EOF

                當輸入EOF時結束輸入

    tr:

    translate or delete characters

    tr [OPTION]... SET1 [SET2]

        實現所有字符轉換爲另一個:

        tr [ABC] [abc] < FILE1

        FILE1文件中所有A字符替換爲a,所有B替換爲b,所有C替換爲c。並不真的改動文件內容,輸出到屏幕內容改變。

    實現刪除某一字符:

        tr -d [ABC] < FILE1

        FILE1文件所有A/B/C字符被刪除,輸出到屏幕,不修改原文件

    補充:

        man tr可以看到[:alnum:]等!!!

管道:

COMMAND1 | COMMMAND2 | COMMAND3 | ...

    用以將前一個命令的標準輸出作爲後一個命令的標準輸入

    如:head -n5 /dev/fstab | tail -n1 打印fstab文件的第5行

    tee

     read from standard input and write to standard output and files

    tee [OPTION]... [FILE]...

        -a,--append:追加內容到文件

        COMMAND | tee FILE 前面COMMAND命令的執行結果輸出到屏幕並保存到FILE文件


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