1. 程式人生 > >shell的基本用法

shell的基本用法

bash

SHELL:
用戶與操作系統之間完成交互式操作的一個接口程序,為用戶提供簡化了的操作;

上世紀70年代中期,Bell實驗室,Bourne;Bourne Shell,簡稱sh;

Bill Joy:C Shell,簡稱csh;tcsh為其衍生版;

David Korn:Korn Shell,簡稱ksh;

GNU:Bourne Again Shell,簡稱bash;linux系統中默認的shell程序;

zsh:最終Shell,功能非常強大;

當前系統中所有可以支持的安全shell:
    /etc/shells
註意:
    1.除了/sbin/nologin之外,其他的shell都可以用來測試使用;
    2.在更換shell時,最好在bash中更換其他shell;如果已經換成了其他shell,就使用exit命令返回至bash,再行切換;
Bash的特性:
一、命令的別名——(自定義命令)
    alias
        alias - 定義或顯示別名。
        格式:alias [-p] [名稱[=值]...]
        註意:如果alias命令不帶任何選項和參數,則表示顯示所有已經定義並生效的別名設置;

    unalias
        unalias - 從別名定義列表中刪除每一個"名字"。
        格式:unalias [-a] 名稱 [名稱 ...]

    註意:
        無論使用alias命令還是使用unalias命令,其功能都會立即生效;此二命令的生命期僅為當前shell的生命期;一旦註銷登錄,相當於關閉了bash,則使用alias命令定義的別名或使用unalias命令刪除的別名操作,會立即失效;

    對於每個用戶來說,都有一個私有的bash的配置文件,就在用戶的家目錄中的一個隱藏文件,文件名為".bashrc",其主要功能就是用來保存命令的別名的定義;

        註意:
            在對於此文件中的命令別名進行編輯並保存之後,在當前已經運行的bash中並不會立即生效,需要重新加載此文件才能使配置生效,以下兩種操作皆可實現:
                1.重啟bash:註銷之後再次登錄即可;
                2.執行文件中定義的命令:使用source命令,或者.命令;

                source/.
                source - 在當前 shell 中執行一個文件中的命令。
                . - 在當前 shell 中執行一個文件中的命令。

                格式:source/. 文件名 [參數]

二、bash的快捷鍵:
    C:Ctrl鍵
    M:Alt鍵
    E:ESC鍵
    DEL:Backspace鍵

    C-l:清屏,相當於clear命令;
    C-a:將光標跳轉至命令行編輯模式的行首;
    C-e:將光標跳轉至命令行編輯模式的行尾;
    C-k:刪除命令行編輯模式的光標所在位置至行尾的內容;
    C-u:刪除命令行編輯模式的光標所在位置至行首的內容;
    C-c:結束前臺進程;
    M-.:引用上一個命令中的最後一個參數;(在Xshell中不能用)
    E,.:功能同M-.

三、命令歷史:
    Bash進程會保存其會話中的用戶曾經執行過的命令,以方便用戶重復執行某個命令操作;
        命令歷史包括兩個方面:
            1.用戶曾經執行過的命令;
            2.用戶曾經執行過的命令的路徑;

        在Bash中有一個內置的變量——PATH,PATH變量的值為當前系統中所有的命令的文件所在的路徑的集合;

    命令如何被shell執行的?
        bash會將命令行的內容按照空白字符進行切片,分析第一個切片內容:
            1.判斷第一個切片的內容是內部命令還是外部命令;
                如果是內部命令,直接運行;
                如果是外部命令,先找hash表中的路徑緩存,如果有,則直接執行;否則通過查找PATH變量中包含路徑中,是否有對應名稱的文件;

                使用hash命令查看被記住的命令文件的路徑;
                    -r:清空hash表;

                使用history命令查看被記住的命令的命令行參數;
                    history - 顯示或操縱歷史列表。
                    格式: history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 參數 [參數...]

                        常用選項:
                            -c:清空歷史緩沖區中的命令歷史記錄;
                            -d OFFSET:刪除指定的歷史命令條目;

                重復執行歷史緩沖區中的命令:
                    !NUMBER:重復執行歷史緩沖區中編號為"NUMBER"的命令;
                    !STRING:重復執行歷史緩沖區中以"STRING"開頭的最後一次執行過的命令;
                    !?STRING:重復執行歷史緩沖區中包含了"STRING"的最後一次執行過的命令;
                    !-NUMBER:重復執行歷史緩沖區中倒數第"NUMBER"條命令;
                    使用上、下Arrow可以從歷史緩沖區中調用命令,回車之後執行;
                    C-r:在歷史緩沖區中實施搜索,回車之後執行;

                    !$:在歷史緩沖區中調用最後一個命令的最後一個參數;
                    !^:在歷史緩沖區中調用最後一個命令的第一個位置的參數;
                    !:NUMBER:在歷史緩沖區中調用最後一個命令的第"NUMBER"位置參數

                    !SEQUENCE:NUMBER:歷史緩沖區中調用第"SEQUENCE"條命令的第"NUMBER"位置參數

                在bash中與命令歷史相關的內置變量:
                    HISTSIZE:歷史緩沖區中能夠保存的命令歷史的最大條目數量,默認值為1000;
                    HISTFILESIZE:~/.bash_history文件中能夠保存的命令歷史的最大條目數量,默認值為1000;
                    HISTTIMEFORMAT:在命令歷史緩沖區中記錄歷史命令時,同時記錄命令的執行的時間戳標記;可以使用date命令的FORMAT來表示時間的記錄格式;默認值為空;
                    HISTCONTROL:控制命令歷史的記錄方式:
                        ignoredups:連續且相同的命令不會被記錄到歷史緩沖區;此為默認值;
                        ignorespace:以空白字符開頭的命令不會被記錄到歷史緩沖區;
                        ignoreboth:上述兩種情況都不會被記錄到歷史緩沖區;
    四、命令補全——(TAB鍵的使用)
     包括兩個方面的內容:
        1.構成命令字符串的補全;
            參考PATH變量中的路徑,對命令進行補全:
                如果,給出的字符串在PATH變量對應的路徑中是唯一的,則直接補全命令;
                如果,給出的字符串在PATH變量對應的路徑中不唯一,則bash給出提示;

        2.命令中參數所對應的字符串補全;
            根據給出的路徑進行補全:
                如果,給出的字符串在給出的路徑中是唯一的,則直接補全參數;
                如果,給出的字符串在給出的路徑中不唯一,則bash給出提示;

五、命令行展開
    (a+b+c)(d+e+f)=ad+ae+af+bd+be+bf+cd+ce+cf
    1.~展開:
        ~:bash會自動將其展開為當前登錄用戶的家目錄;
        ~STRING:bash會自動將其展開為以"STRING"為用戶名的用戶的家目錄;

        ~+:調用bash的內置變量"PWD"的值;
        ~-:調用bash的內置變量"OLDPWD"的值;

    2.{}展開:
        在"{}"中,可以填充一個以","分隔的路徑列表,bash會將其展開為多個獨立的路徑;
        示例:
            ~]# mkdir -pv /china/{hb,hn,jl,hlj,ln}/{link,linka,linkb}/class18

            ~]# cp 1.txt{,.bak}
                1.txt{,.bak} == 1.txt 1.txt.bak

六、命令的執行結果
    在bash中,命令的執行結果有兩種:
        1.執行命令的輸出結果:
            根據用戶的需求獲取到的命令執行的正常輸出結果;
            命令引用或命令替換:

            ``  相當於 $()
            ``:反向單引號,反引號;

            示例:
                創建一個文件,文件名為test-系統時間;
                ~]# touch test-`date +%F-%H-%M-%S`

        2.執行命令的狀態返回值:
            與此前的一個命令是否成功執行相關的返回內容;
            bash使用一個特殊的內置變量來保存其內容:$?
                $?實際上保存的是一個數值,其取值範圍:0-255

                其中:
                    0:表示命令執行成功;
                    1-255:表示命令執行失敗;
                        1,2,127:bash中內置的命令執行失敗的狀態返回值;
                            1:表示小問題;
                            2:表示嚴重問題;
                            127:表示命令本身出現問題;

                            其余數字(3-126,128-255):用戶可以自定義的失敗狀態返回值;

七、引用功能:
    ‘‘:強引用
        凡是被單引號引用的內容,bash在處理時,一律視其為普通字符,即使其本身是bash定義的具有特殊功能和作用字符亦是如此,但單引號本身除外;

    "":弱引用
        被雙引號引用的內容中,有些特殊字符仍然會保留其特殊含義,如: $, \, "";

八、轉義功能:
    \:bash定義的轉義字符;大多數的情況下,  " / "只能將其後面一個字符轉義;

    \COMMAND:取消定義過的命令別名,而使用命令本身的功能;

九、Globbing——文件名通配符,簡稱為glob;
    *:匹配任意長度的任意字符或字符串;(某些特殊位置的"."字符不能匹配;)
    ?:匹配任意單個字符;(某些特殊位置的"."字符不能匹配;)
    []:匹配指定範圍內的任意單個字符,必須匹配且只能匹配一個字符;
        指定範圍的方法:
            1.枚舉法:列出所有有效字符;
            2.範圍指定:
                [0-9]:表示所有單個的十進制數字;
                [a-z]:a,A,b,B,c,C,...,x,X,y,Y,z
                [A-Z]:A,b,B,c,C,...,x,X,y,Y,z,Z
            3.bash內建字符集:
                [:lower:]:所有的小寫字母
                [:upper:]:所有的大寫字母
                [:alpha:]:所有字母,包括大小寫;
                [:digit:]:所有單個的十進制數字;
                [:alnum:]:所有的字母和十進制數字;
                [:punct:]:所有的符號;
                [:space:]:表示空白字符,包括空格和制表符;
            4.反向匹配:
                ^
                示例:
                    #ls a[^[:digit:]]??  //表示文件名的第二個字符不能是十進制數字;

                註意:當中括號中有"^"表示字符集反向匹配時,註意"*"的使用;因為"*"通配範圍可能會導致反向匹配失敗;此類失敗是因為bash的globbing是在貪婪模式下匹配的;

十、管道
    |
    管道通常是用來連接多個命令的;將管道符號前面的命令的執行的輸出結果通過管道傳遞給管道符號後面的命令,讓後面的命令將前面命令的輸出結果當成參數使用;

    wc:
        wc - print newline, word, and byte counts for each file
        格式:wc [OPTION]... [FILE]...
            常用選項:
                -c, --bytes:僅顯示文件中的字節數;
                -m, --chars:僅顯示文件中的有效字符的數量;
                -l, --lines:僅顯示文件的行數;
                -w, --words:僅顯示文件中字的數量;

    註意:
        1.一般來講,凡是被管道連接的命令,都應該能夠在執行成功之後完成命令結果的輸出,否則管道無意義;
        2.管道不是萬能的,有些場合沒辦法使用管道的;

十一、輸入輸出重定向
    在使用計算機的時候,實現某個功能的主體是程序!

    程序=指令 + 數據

    數據至關重要!

    文件,IO——Input/Output

    在linux系統中,能夠完成輸入和輸出功能的實體:文件;

    可以用於輸入的設備:文件
        鍵盤設備、文件系統中的常規文件、網卡設備、聲卡設備、磁盤設備等;

    可以用於輸出的設備:文件
        顯示器、文件系統中的常規文件、網卡設備、聲卡設備、磁盤設備等;

    在內存中使用文件的方式是定義文件描述符,一個文件描述符對應一個文件;
        0:表示標準輸入,stdin,從鍵盤實現的輸入數據流;
        1:表示標準輸出,stdout,到顯示器的輸出數據流;
        2:表示標準錯誤,stderr,到顯示器的錯誤數據流;

    輸入輸出重定向(IO重定向)
        采用非標準設備文件實現的IO操作;

        輸入重定向:
            <

        輸出重定向:
            >:覆蓋輸出重定向;
                ~]#  set -C  //開啟防止意外覆蓋源文件開關,可以使用">|"符號完成覆蓋重定向輸出的操作,而無需關心是否開啟此開關;
                ~]# set +C  //關閉防止意外覆蓋源文件開關
            >>:追加輸出重定向;

        錯誤重定向:
            2>:覆蓋錯誤重定向;
            2>>:追加錯誤重定向;

        合並標準輸出和標準錯誤的重定向:
            1.COMMAND {>|>>} /PATH/TO/SOMEFILE 2>&1
            2.&>, &>>

        特殊的設備文件:
            /dev/null:BlackHole,BitBucket(位桶) 
            /dev/zero:泡泡機,吐零機;

        bash中的其他特殊符號:
            <<:here document,此處文檔,結束標記;

shell的基本用法