bash基礎特性


bash簡介:
    bash是衆多shell中最常用的一種,許多linux發行版將bash設置爲默認shell。bash是一種命令解釋型語言,是操作系統給用戶提供的一種接口,能夠將用戶標準輸入或文件中的命令提交內核執行。

bash基礎特性:
1、變量
    編程程序語言:
        強類型:
            定義變量時必須指定類型,參與運算必須符合類型要求,調用爲聲明
        弱類型:
            無需指定類型,默認均爲字符型,參與運算會自動進行隱式類型轉換
        注:bash爲弱類型語言

    bash中的變量的種類,根據變量的生效範圍:
        本地變量:生效範圍爲當前shell進程,對當前shell之外的其他shell包括當前shell的子shell均無效
        環境變量:對當前shell及子shell都有效;(對其他shell無效)
        局部變量:生效範圍爲當前sehll進程中某代碼片段(通常指函數)
        位置變量:$1,$2,$3,...用於在命令行給腳本傳遞的參數
        特殊變量:$?, $0, $*, $#, $@,$$
        本地變量

    變量賦值:name='value',可以使用引用賦值:
        (1)可以使直接字符串
        (2)變量引用:name=$var_name
        (3)命令引用:name=`COMMAND`, name=$(COMMAND)

    變量引用:${name} , $name
        ${name}’s
        "":弱引用,其中的變量名會被替換成變量值;
        '':強引用,其中的變量引用不會被替換成變量值,而保持原字符串;

    set:顯示已定義的所有變量
    unset var_name:銷燬變量             
                   
    環境變量:
        變量聲明及賦值:
            export name=value
            declare -x name=value
        變量引用:$name,$(name)
        顯示所有環境變量
            export
            env
            printenv
        銷燬:
            unset name

    變量命名法則:
        1、不能使用程序中的關鍵字
        2、只能使用數字、字母及下劃線,且不能以數字開頭
        3、見名知義,駝峯法則或下劃線
    只讀變量:(不能被修改,不能銷燬,只能等到shell進程結束)
        readonly name
        或 declare -r name
    位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數
        $1,$2,...:對應調用第1、第2等參數
            shift [n]:左移當前的位置參數,不加參數默認向左移動一位
        $0: 腳本本身的名稱
        $*:傳遞給腳本的所有參數(把所有參數當做一個字符串)
        $@:傳遞給腳本的所有參數(每一個參數都是一個單獨個體)
        $#:參數的個數
        $$:是腳本運行的當前進程ID號


2、history管理命令歷史
    登錄shell時,會讀取命令歷史文件~/.bash_history記錄下的命令;登錄進shell後重新執行的

    命令只    會記錄在緩存中,這些命令會在用戶退出時追加記錄到命令歷史文件中(或者使用-a選項)。

    history常用選項:
        -d OFFSET:根據序列號刪除歷史中指定的命令
        -c:清空歷史文件
        -a:追加本次會話新執行的命令歷史列表到歷史文件.bash_history中
                
        快捷操作:
            !#:調用歷史中第#條命令
            !string:調用歷史中最近一個以string開頭的命令
            !!:執行上一條命令
            !$:調用上一條命令的最後一個參數
                快捷鍵:ESC, . 或者alt + .

    相關環境變量:
        HISTFILE: ~/.bash_history(用戶家目錄)
        HISTSIZE:命令歷史記錄的條數,即history所能顯示命令的最多條數。
        HISTFILESIZE:命令歷史文件所能記錄的最多歷史命令條數
        HISTCONTROL:控制命令歷史記錄方式
            ignoredups: 忽略重複的命令,連續且相同方爲"重複"(bash默認)
            ignorespace:忽略所有以空白開頭的命令
            ignoreboth:包含ignoredups和ignorespace

        修改環境變量值方式:export 變量名='值'
        變量賦值:把賦值符號後面的數據存儲於變量名


        hash:緩存(記錄)用戶的歷史命令路徑到內存中,實現系統加速,只記錄外部命令路徑

    [root@localhost man]# hash
        hits    command
        5    /bin/grep
        1    /bin/egrep
        1    /usr/bin/head
        3    /bin/cat
        4    /usr/bin/man

    hash -r:刪除某條命令的緩存記錄
    注意:當命令的路徑修改之後,需要刪除此條命令的緩存記錄,否則會報錯,提示找不到此命令


3、命令及路徑補全(Tab鍵)
    命令補全:bash根據PATH環境變量定義的路徑,自左而右在每個路徑搜尋命令名命名的文件,返回第一次找到的命令。

4、命令行展開
    ~:展開爲用戶的主目錄
    ~USERNAME:展開爲指定用戶的主目錄
    {}:可承載一個以逗號分隔的列表,並將其展開爲多個路徑

5、命令的執行結果狀態,兩類:        
    1、程序的返回值
    2、程序的執行狀態結果

    bash使用特殊變量$?保存最近一條命令的執行狀態結果:
        0:成功
        1 - 255:失敗

6、命令別名(alias)
    (1) alias
        顯示當前shell進程所有可用的命令別名
    (2) alias NAME='VALUE'
    注意:在命令行中定義的別名,僅對當前的shell進程有效;

    僅對當前用戶生效(永久):~/.bashrc
    對所有用戶生效(永久):/etc/bashrc

    bash進程重新讀取配置文件,立即生效:
        source /etc/bashrc
        . /etc/bashrc                
    刪除別名:
        unalias NAME
    注意:如果別名同原命令的名稱一樣,如果要執行原命令,則用"\COMMAND"

7、glob(globbing)
    bash中用於實現文件名"通配"
    通配符:
        * : 任意長度的任意字符
        ?:一個任意字符
        []: 匹配指定範圍內的任意單個字符
            [0-9]
            [a-z]:不區分字符大小寫,區分用[[:lower:]]
            [A-Z]:不區分字符大小寫,區分用[[:upper:]]
        [^]:匹配指定範圍外的任意單個字符,[^0-9]

        專用字符集合:
            [:digit:]:數字
            [:lower:]:小寫字母
            [:upper:]:大寫字母
            [:alpha:]:字母
            [:alnum:]:字母及數字集合
            [:space:]:空格
            [:punct:]:標點符號

   
8、bash的I/O重定向及管道
    打開的文件都有一個fd:file description(文件描述符)
                  
    標準輸入:    keyboard,0
    標準輸出:    monitor, 1
    標準錯誤輸出:monitor, 2

    I/0重定向:改變標準位置
    輸出重定向:COMMAND > NEW_POS, COMMAND >> NEW_POS
        >: 覆蓋重定向
        >>: 追加重定向

        set -C: 禁止將內容覆蓋輸出到已有文件中
                強制覆蓋:>|
        set +C:取消禁止

        2>: 覆蓋重定向錯誤輸出流
         2>>:追加

    標準輸出和錯誤輸出各自定向至不同位置:
        COMMAND > /path/to/file.out 2> /path/to/error.out
    合併標準輸出和錯誤輸出爲同一個數據流進行重定向:
        &> :覆蓋
            COMMAND > /path/to/file.out 2>&1
        &>> :追加           
            COMMAND >> /path/to/file.out 2>&1

    輸入重定向:<
        tr:轉換或刪除字符
            tr [OPTION]... SET1 [SET2]
                tr abc ABC < /etc/fstab
                -d:給定刪除字符

    HERE DOCUMENT:<<
        cat << EOF
        cat > /path/to/somefile << EOF        

        [root@localhost ~]# cat > /tmp/test.out << EOF    
        > Hello
        > World
        > EOF
        [root@localhost ~]# cat /tmp/test.out 
        Hello
        World

    管道:
        echo $PATH | tr 'abc' 'ABC'

        tee命令:read from standard input and write to standard output and files
            -a,--append:追加
            echo $PATH | tr 'a-z' 'A-Z' | tee /tmp/path.out


bash配置配置文件:
    按生效範圍劃分:存在兩類:
        全局配置:
            /etc/profile
                /etc/profile.d/*.sh
            /etc/bashrc
        個人配置:
            ~/.bash_profile
            ~/.bashrc
    按功能劃分,存在兩類:
        profile類:爲交互式登錄的shell提供配置
            全局:/etc/profile, /etc/profile.d/*.sh
            個人: ~/.bash_profile
            功能:
                (1)用於定義環境變量
                (2)運行命令或腳本

        bashrc類:爲非交互式登錄的shell提供配置
            全局:/etc/bashrc
            個人:~/.bashrc

            功用:
                (1)定義命令別名
                (2)定義本地變量
    shell登錄:
        交互式登錄:
            直接通過終端輸入賬號密碼登錄;
            使用"su - UserName"或"su -l Username"切換的用戶

            讀取配置文件的順序流程:
            /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
        非交互式登錄:
            su UserName
            圖形界面下打開的終端
            執行腳本

            讀取配置文件的順序流程:
            ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

    編輯配置文件定義的新配置的生效方式:
        (1)重新啓動shell進程
        (2)使用source或.命令


終端:
    用戶與主機交互
        物理終端:直接接入本機的顯示器和鍵盤設備,console
        虛擬終端:附加在物理終端之上的以軟件方式虛擬實現的終端,Centos 6 默認有6個
        ctrl + alt + f1-6
        設備文件路徑:/dev/tty#
        圖形終端:附加在物理終端之上的以軟件方式虛擬實現的終端,
        ctrl + alt + f7        
       模擬終端:圖形界面下打開的命令行接口,基於ssh協議或telnet協議等遠程方式打開的界面
        設備文件:/dev/pts/#  [0,∞]

交互式接口:啓動終端後,在終端設備附加一個交互式應用程序
    GUI:
        X protocol ,window manager,desktop
        Desktop:
            GNOME(c , gtk)
            KDE (C++,qt)
            XFCE(輕量級桌面)
    CLI:
        shell程序:
            sh(bourn)
            csh
            ksh(korn)
            bash(bourn again shell),GPL
            zsh
        命令提示符:prompt
            [root@localhost ~]# echo $PS1
            [\u@\h \W]\$
            prompt:
                管理員:#
                普通用戶:$

    查看當前用戶默認shell:

    [root@localhost ~]# echo $SHELL
    /bin/bash

    查看系統所有可用的shell:

    [root@localhost ~]# cat /etc/shells
    /bin/sh
    /bin/bash
    /sbin/nologin
    /bin/dash
    /bin/tcsh
    /bin/csh


bash的快捷鍵:
    Ctrl + l:清屏
    Ctrl + a:跳轉至命令開始處
    Ctrl + e:跳轉至命令結尾處
    Ctrl + c:取消命令的執行
    Ctrl + u:刪除命令行首至光標所在處的所有內容
    Ctrl + k:刪除光標所在處至命令行尾的所有內容

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