天天看點

bash的基礎特性

bash的基礎特性:

            bash,Unix shell的一種,在1987年由布萊恩·福克斯為了GNU計劃而編寫。1989年釋出第一個正式版本,原先是計劃用在GNU作業系統上,但能運作于大多數類Unix系統的作業系統之上,包括Linux與Mac OS X v10.4都将它作為預設shell。它也被移植到MicrosoftWindows上的Cygwin與MinGW,或是可以在MS-DOS上使用的DJGPP項目。在Novell NetWare與Andriod在上也有移植。1990年後,Chet Ramey成為了主要的維護者。

            為Bourne shell的後繼相容版本與開放源代碼版本,它的名稱來自Bourne shell(sh)的一個雙關語(Bourne again /born again):Bourne-AgainSHell。

            Shell

                        GUI:

                                    GNOME

                                    KDE

                                    XFCE

                        CLI:

                                    狹義上的shell

                                    cat/etc/shells

                                                /bin/bash

                                                /bin/csh

                                                /bintcsh

                        /bin/bash

            終端:ternimal          

            (1) 指令曆史

                        history

            (2) 指令别名

                        alias/unalias

            (3) 指令補全

            (4) 路徑補全

            (5) 指令行展開

                        ~, {}

常用的基礎指令:

            cd指令:change directory

                        cd [/PATH/TO/SOMEWHERE]

                        cd

                        cd ~: 回主目錄

                        cd ~USERNAME:切換指定使用者的家目錄

                        cd -: 回到上一次所在目錄

                        相關環境變量:

                                    PWD:

                                    OLDPWD:

            pwd指令:printing workingdirectory

                        顯示工作目錄

            ls:list

                        列出指定路徑下的檔案或目錄的屬性資訊

                                    Metadata:屬性資料

                                    data:資料

                        ls [OPTION]... [FILE]...

                                    -l: 使用長格式顯示

                                                drwxr-xr-x1 root root    8 Aug 23 08:47 .cache

                                                            d:檔案類型

                                                            rwxr-xr-x:權限,mode

                                                            1:檔案被硬連結的次數

                                                            root:owner,屬主;

                                                            root:group, 屬組

                                                            8:size,預設為位元組

                                                            Aug23 08:47 修改時間戳

                                                            .cache:檔案名

                                    -d:顯示目錄自身屬性

                                    -h:human-readable

                                    -a:顯示所有檔案,包括.開頭的隐藏檔案

                                                .:目前目錄

                                                ..:父目錄

                                    -r: reverse,逆序顯示

                                    -R: recusive,遞歸

            文本檔案檢視類的指令:

                        cat, tac指令:

                                    cat[OPTION]... [FILE]...

                                                -n:

                                                -e:-vE

                                                            -E:顯示行結束符

                                                            -v:顯示非列印字元

            檔案内容類型檢視指令:

                        file /PATH/TO/SOMEWHERE

            回顯指令: echo

                        echo [OPTION]...[ARGS]...

                                    -n: 不進行換行;

                                    -e:讓控制符生效;

                                                \n:new line

                        echo"$VAR_NAME"

            指令路徑位置檢視工具:

                        whereis, which

                        which:

                                    which[options] [--] programname [...]

                                                --skip-alias:禁止列出别名

                        whereis COMMAND:

                                    顯示二進制程式、源碼檔案以及幫助手冊的路徑;

            時間相關的指令:

                        RTC:RealTime Clock

                        System Clock:系統時鐘

                        date: 系統時間

                        clock, hwclock: 硬體時間

                        date:

                                    date[OPTION]... [+FORMAT]:時間顯示

                                                FORMAT

                                                            %F

                                                            %D

                                                            %T

                                                            %H

                                                            %M

                                                            %S

                        date[MMDDhhmm[[CC]YY][.ss]]:時間設定

            hwclock

                        -s:hctosys, 以硬體時鐘為準,調整系統時間同硬體;

                        -w:systohc, 以系統時鐘為準

            cal:

                        cal[YEAR]

    關機或重新開機

            關機:halt, poweroff,init 0, shutdown -h TIME

            重新開機:reboot, init 6,shutdown -r TIME

            shutdown

                        shutdown[OPTIONS...] [TIME] [WALL...]

                                    -r:重新開機

                                    -h:關機

                                    --no-wall

                                    -c

                        TIME:

                                    +m:相對時長之後執行相應操作;機關是分鐘;

                                    HH:MM絕對時間

    stat:

w,who, whoami

bash的基礎特性(02)

        (1) glob

                    文本名“通配”

                                *:比對任意長度的任意字元;

                                ?:比對任意單個字元;

                                            a*b:aab, ab, a123b;

                                            a?b:

                                []: 比對指定範圍内的任意單個字元;

                                            [0-9]

                                [^]:比對範圍外的任意單個字元;

                                            [^a-b]

                                            字元集合:

                                                        [:lower:]

                                                        [:upper:]

                                                        [:alnum:]

                                                        [:digit:]

                                                        [:space:]

                                                        [:punct:]

                    練習:

                                顯示/etc/目錄下,以非字母開頭,後面跟了一具字母及其它任意長度任意字元的檔案或目錄;

                                複制/etc目錄下,所有以.d結尾的檔案或目錄至/tmp/mageedu.com目錄中;

        (2) 組合鍵

                    Ctrl+l:清屏

                    Ctrl+a: 切換至指令行首

                    Ctrl+e:切換至指令行尾

                    Ctrl+c:取消指令執行

                    Ctrl+u:删除光标所在處至行首的内容;

                    Ctrl+k: 删除光标所在處至行尾的内容;

        (3) IO重定向和管道

                    程式:指令+資料

                                讀入資料:Input

                                輸出資料:Output

                    打開的檔案都一個fd:file descriptor

                    标準輸入:keyboard, 0,/dev/stdin

                    标準輸出:monitor, 1,/dev/stdout

                    标準錯誤輸出:monitor, 2,/dev/stderr

                    I/O重定向:

                                輸入重定向

                                輸出重定向:

                                            COMMAND> NEW_POS, COMMAND >> NEW_POS

                                            >:覆寫重定向;

                                            >>:追加重定向;

                                            set-C

                                                        如果覆寫重定向目标檔案存在,則禁止執行;

                                                        >|

                                            set+C

                                錯誤重定向:

                                            2>:覆寫

                                            2>>:追加

                    同時重定向标準輸出流和錯誤輸出流:

                                COMMAND >/path/to/file.out 2> /path/to/file.err

                                COMMAND >/path/to/file.out 2>&1

                                COMMAND&> /path/to/file.out

                    輸入重定向:

                                <

                                tr指令:

                                            tr[OPTION]... SET1 [SET2]

                                                        -d:删除字元

                    Here Document:<<

                                cat >>/path/to/somefile << EOF

        管道:

                    COMMAND1 | COMMAND2 | ...

                    練習:tee指令的用法;

使用整數[編輯]

與Bourne shell不同的是bash不用另外生成程序即能進行整數運算。bash使用((...))指令和$[...]變量文法來達到這個目的:

 VAR=55             # 将整數55指派給變量VAR

 ((VAR = VAR + 1))  # 變量VAR加1。注意這裡沒有'$'

 ((++VAR))          # 另一種方法給VAR加1。使用C語言風格的字首自增

 ((VAR++))          # 另一種方法給VAR加1。使用C語言風格的字尾自增

 echo $((VAR * 22)) # VAR乘以22并将結果送入指令

 echo $[VAR * 22]   # 同上,但為過時用法

((...))指令可以用于條件語句,因為它的退出狀态是0或者非0(大多數情況下是1),可以用于是與非的條件判斷:

 if((VAR == Y * 3 + X * 2))

 then

         echo Yes

 fi

 ((Z > 23)) && echo Yes

((...))指令支援下列比較操作符:'==', '!=','>', '<', '>=',和'<='。

bash不能在自身程序内進行浮點數運算。目前有這個能力的unix shell隻有Korn shell和Z shell。

輸入輸出重定向[編輯]

bash擁有傳統Bourne shell缺乏的I/O重定向文法。bash可以同時重定向标準輸出和标準錯誤,這需要使用下面的文法:

 command &> file

這比等價的Bourne shell文法"command> file 2>&1"來的簡單。2.05b版本以後,bash可以用下列文法重定向标準輸入至字元串(稱為here string):

 command <<< "string to be readas standard input"

如果字元串包括空格就需要用引号包裹字元串。

例子: 重定向标準輸出至檔案,寫資料,關閉檔案,重置标準輸出。

 # 生成标準輸出(檔案描述符1)的拷貝檔案描述符6

 exec 6>&1

 # 打開檔案"test.data"以供寫入

 exec 1>test.data

 # 産生一些内容

 echo "data:data:data"

 # 關閉檔案"test.data"

 exec 1>&-

 # 使标準輸出指向FD 6(重置标準輸出)

 exec 1>&6

 # 關閉FD6

 exec 6>&-

打開及關閉檔案

 # 打開檔案test.data以供讀取

 exec 6<test.data

 # 讀檔案直到檔案尾

 while read -u 6 dta

 do

   echo "$dta"

 done

 # 關閉檔案test.data

 exec 6<&-

抓取外部指令的輸出

  # 運作'find'并且将結果存于VAR

  # 搜尋以"h"結尾的檔案名

  VAR=$(find . -name "*h")

程序内的正規表達式[編輯]

bash3.0支援程序内的正規表達式,使用下面的文法:

 [[ string =~ regex ]]

正規表達式文法同regex(7) man page所描述的一緻。正規表達式比對字元串時上述指令的退出狀态為0,不比對為1。正規表達式中用圓括号括起的子表達式可以通路shell變量BASH_REMATCH,如下:

 if [[ abcfoobarbletch =~ 'foo(bar)bl(.*)' ]]

         echo The regex matches!

         echo $BASH_REMATCH      -- outputs: foobarbletch

         echo ${BASH_REMATCH[1]} -- outputs:bar

         echo ${BASH_REMATCH[2]} -- outputs:etch