Shell符號及各種解釋對照表:

在shell下總是有一些符號讓人感到困惑費解下面有我從網上搜索的shell符號以及解釋。

gcc優化程序常用選項
選項格式 功能
-O
-O1 試圖減少代碼大小和執行時間,但並不執行需要花費大量編譯時間的任何優化
-O2 在-O1級別的優化之上,還進行一些額外調整工作——除不做循環展開、函數內聯、和寄存器重新命名外,幾乎進行所有可選優化
-O3 除了完成所有-O2級別的優化之外,還進行包括循環展開和其他一些與處理器特性相關的優化工作
-O0 不執行優化
-Os 具有-O2級別的優化,同時並不特別增加代碼大小

Shell符號 使用方法及說明
(1)# 註釋符號(Hashmark[Comments])

1.在shell文件的行首,作爲shebang標記,#!/bin/bash;

  1. 其他地方作爲註釋使用,在一行中,#後面的內容並不會被執行,除非;

  2. 但是用單/雙引號包圍時,#作爲#號字符本身,不具有註釋作用。

(2); 作爲多語句的分隔符

  多個語句要放在同一行的時候,可以使用分號分隔。注意,有時候分號需要轉義。

(3);; 連續分號

在使用case選項的時候,作爲每個選項的終結符。在Bash version 4+ 的時候,還可以使用[;;&], [;&]

(4) . 點號

     1. 相當於bash內建命令source,如:

               #!/bin/bash
               . data-file
               #包含data-file;
    2. 作爲文件名的一部分,在文件名的開頭,表示該文件爲隱藏文件,ls一般不顯示出來(ls -a 可以顯示);

 3. 作爲目錄名,一個點代表當前目錄,兩個點號代表上層目錄(當前目錄的父目錄)。注意,兩個以上的點不出現,除非你用引號(單/雙)包圍作爲點號字符本身;

4. 正則表達式中,點號表示任意一個字符。

(5) ” 雙引號

部分引用。雙引號包圍的內容可以允許變量擴展,也允許轉義字符的存在。如果字符串內出現雙引號本身,需要轉義,因此不一定雙引號是成對的。

(6)’ 單引號

單引號括住的內容,被視爲單一字符串,引號內的禁止變量擴展,所有字符均作爲字符本身處理(除單引號本身之外),單引號必須成對出現。

(7), 逗號

    用在連接一連串的數學表達式中,這串數學表達式均被求值,但只有最後一個求值結果被返回。如:

              #!/bin/bash
             let t1=((a=5+1, b=7+2))
              echo t1=$t1, a=$a, b=$b
                ## 這個$t1=$b;

 用於參數替代中,表示首字母小寫,如果是兩個逗號,則表示全部小寫,注意,這個特性在bash version 4的時候被添加的。例子:

            a="ATest"
            echo ${a,}
            echo ${a,,}
            ## 前面輸出aTest,後面輸出的是atest。

(7)\ 反斜線,反斜杆。

 放在特殊符號之前,轉義特殊符號的作用,僅表示特殊符號本身,這在字符串中常用;

 放在一行指令的最末端,表示緊接着的回車無效(其實也就是轉義了Enter),後繼新行的輸入仍然作爲當前指令的一部分。

(8)/ 斜線,斜杆

作爲路徑的分隔符,路徑中僅有一個斜杆表示根目錄,以斜杆開頭的路徑表示從根目錄開始的路徑;

在作爲運算符的時候,表示除法符號。如:a=4/2

(9)` 反引號,後引號

命令替換。這個引號包圍的爲命令,可以執行包圍的命令,並將執行的結果賦值給變量。如:a=`dirname '/tmp/x.log'` 。後面dirname返回的結果會賦值給a,注意,此處Mitchell特地使用了反引號和單引號,注意區別。

(10): 冒號

空命令,這個命令什麼都不做,但是有返回值,返回值爲0(即:true)。這個命令的作用非常奇妙。

 可做while死循環的條件;
 在if分支中作爲佔位符(即某一分支什麼都不做的時候);

放在必須要有兩元操作的地方作爲分隔符,如::                      $  {username=`whoami`}

在參數替換中爲字符串變量賦值,在重定向操作(>)中,把一個文件長度截斷爲0(:>>這樣用的時候,目標存在則什麼都不做),這個只能在普通文件中使用,不能在管道,符號鏈接和其他特殊文件中使用;

 甚至你可以用來註釋(#後的內容不會被檢查,但:後的內容會被檢查,如果有語句如果出現語法錯誤,則會報錯);

你也可以作爲域分隔符,比如環境變量$PATH中,或者passwd中,都有冒號的作爲域分隔符的存在;

 你也可以將冒號作爲函數名,不過這個會將冒號的本來意義轉變(如果你不小心作爲函數名,你可以使用unset -f : 來取消function的定義)。

(11)! 感嘆號

取反一個測試結果或退出狀態。

 表示反邏輯,比如後面的!=,這個是表示不等於;

 表示取反,如:ls a[!0-9] #表示a後面不是緊接一個數字的文件;

 在不同的環境裏面,感嘆號也可以出現在間接變量引用裏面;

 在命令行中,可以用於歷史命令機制的調用,你可以試試!$,!#,或者!-3看看,不過要注意,這點特性不能在腳本文件裏面使用(被禁用)。
  • 星號(wildcard/arithmetic operator[asterisk])。

    作爲匹配文件名擴展的一個通配符,能自動匹配給定目錄下的每一個文件;

    正則表達式中可以作爲字符限定符,表示其前面的匹配規則匹配任意次;

    算術運算中表示乘法。

**
雙星號(double asterisk)。算術運算中表示求冪運算。

?
問號(test operator/wildcard[Question mark])。

表示條件測試;

在雙括號內表示C風格的三元操作符((condition?true-result:false-result));

參數替換表達式中用來測試一個變量是否設置了值;

 作爲通配符,用於匹配文件名擴展特性中,用於匹配單個字符;

 正則表達式中,表示匹配其前面規則0次或者1次。

$ 美元符號。

作爲變量的前導符,用作變量替換,即引用一個變量的內容,比如:echo $PATH;

在正則表達式中被定義爲行末(End of line)。

${} 參數替換
用於在字符串中表示變量。

$‘…’
引用內容展開,執行單引號內的轉義內容(單引號原本是原樣引用的),這種方式會將引號內的一個或者多個[]轉義後的八進制,十六進制值展開到ASCII或Unicode字符。

$*

$@

位置參數(Positional Parameters)。

這個在使用腳本文件的時候,在傳遞參數的時候會用到。兩者都能返回調用腳本文件的所有參數,但$*是將所有參數作爲一個整體返回(字符串),而$@是將每個參數作爲單元返回一個參數列表。注意,在使用的時候需要用雙引號將$*,$@括住。這兩個變量受到$IFS的影響,如果在實際應用中,要考慮其中的一些細節。

$#

表示傳遞給腳本的參數數量。

$?
此變量值在使用的時候,返回的是最後一個命令、函數、或腳本的退出狀態碼值,如果沒有錯誤則是0,如果爲非0,則表示在此之前的最後一次執行有錯誤。


$$
進程ID變量,這個變量保存了運行當前腳本的進程ID值。


()
圓括號(parentheses)。

 命令組(Command group)。由一組圓括號括起來的命令是命令組,命令組中的命令實在子shell(subshell)中執行。因爲是在子shell內運行,因此在括號外面是沒有辦法獲取括號內變量的值,但反過來,命令組內是可以獲取到外面的值,這點有點像局部變量和全局變量的關係,在實作中,如果碰到要cd到子目錄操作,並在操作完成後要返回到當前目錄的時候,可以考慮使用subshell來處理;

用於數組的初始化。

{x,y,z,…} 花括號擴展
在命令中可以用這種擴展來擴展參數列表,命令將會依照列表中的括號分隔開的模式進行匹配擴展。注意的一點是,這花括號擴展中不能有空格存在,如果確實有必要空格,則必須被轉義或者使用引號來引用。例子:echo {a,b,c}-{\ d,” e”,’ f’}

{a..z}
在Bash version 3時添加了這種花括號擴展的擴展,可以使用{A..Z}表示A-Z的所有字符列表,這種方式的擴展Mitchell測試了一下,好像僅適用於A-Z,a-z,還有數字{最小..最大}的這種方式擴展。


{} 代碼塊
這個是匿名函數,但是又與函數不同,在代碼塊裏面的變量在代碼塊後面仍能訪問。注意:花括號內側需要有空格與語句分隔。另外,在xargs -i中的話,還可以作爲文本的佔位符,用以標記輸出文本的位置。


{} \;
這個{}是表示路徑名,這個並不是shell內建的,現在接觸到的情況看,好像只用在find命令裏。注意後面的分號,這個是結束find命令中-exec選項的命令序列,在實際使用的時候,要轉義一下以免被shell理解錯誤。


[] 中括號
測試的表示,Shell會測試在[]內的表達式,需要注意的是,[]是Shell內建的測試的一部分,而非使用外部命令/usr/bin/test的鏈接;
在數組的上下文中,表示數組元素,方括號內填上數組元素的位置就能獲得對應位置的內容,如:

Array[1]=xxx
echo ${Array[1]};
表示字符集的範圍,在正表達式中,方括號表示該位置可以匹配的字符集範圍。

[[]] 雙中括號
這個結構也是測試,測試[[]]之中的表達式(Shell的關鍵字)。這個比單中括號更能防止腳本里面的邏輯錯誤,比如:&&,||,<,>操作符能在一個[[]]裏面測試通過,但是在[]卻不能通過。[[]]裏面沒有文件名擴展(filename expansion)或是詞分隔符(Word splitting),但是可以用參數擴展(Parameter expansion)和命令替換(command substitution)。不用文件名通配符和像空白這樣的分隔符。注意,這裏面如果出現了八進制,十六進制等,shell會自動執行轉換比較。


$[…] 詞表達表示整數擴展

在方括號裏面執行整數表達式。例:

a=3
b=7
echo [  a+b]echo  [a  b]
##返回是10和21


(()) 雙括號
表示整數擴展(integer expansion)。功能和上面的[]  []是會返回裏面表達式的值的,而(())只是執行,並不會返回值。兩者執行後如果變量值發生變化,都會影響到後繼代碼的運行。可對變量賦值,可以對變量進行一目操作符操作,也可以是二目,三目操作符。


>

&<

&

>

<

<> 重定向

scriptname >filename 重定向scriptname的輸出到文件filename中去,如果文件存在則覆蓋;

command &>filename 重定向command的標準輸出(stdout)和標準錯誤(stderr)到文件filename中;

command >&2 把command的標準輸出(stdout)重定向到標準錯誤(stderr)中;

scriptname >>filename 把scriptname的輸出(同>)追加到文件filenmae中,如果文件不存在則創建。

[i]<>filename 打開filename這個文件用來讀或者寫,並且給文件指定i爲它的文件描述符(file descriptor),文件不存在就會創建。

(command)>

<(command) 這是進程替換

使用的時候注意,括號和<,>之間是不能有空格的,否則報錯。其作用有點類似通道,但和管道在用法上又有些不同,管道是作爲子進程的方式來運行的,這個命令會在/dev/fd/下面產生類似/dev/fd/63,/dev/fd/62這類臨時文件,用來傳遞數據。

Mitchell個人猜測之所以用這種方法來傳遞,是因爲前後兩個不屬於同一個進程,因此需要用共享文件的方式來傳遞資料(這麼說其實管道也應該有同樣的文件?)。網上有人說這個只是共享文件而已,但是經過測試,發現雖然有/dev/fd/63這樣的文件產生,但是這個文件其實是指向pipe:[43434]這樣的通道的鏈接。

<< 雙小於號
這個也被稱爲Here-document,用來將後繼的內容重定向到左側命令的stdin中。<<可以節省格式化時間,別且使命令執行的處理更容易。在實作的時候只需要輸入<<和終止標誌符,而後(一般是回車後)你就可以輸入任何內容,只要在最後的新行中輸入終止標誌符,即可完成數據的導入。使用here-document的時候,你可以保留空格,換行等。如果要讓shell腳本更整潔一點,可以在<<和終止符之間放上一個連字符(-)。


<<<
三個小於號(here-strings)。Here-字串和Here-document類似,here-strings語法:command [args] <<<[“]word["]  word會展開並作爲command的stdin。


<

>

小於,大於號
ASCII比較,進行的是變量的ASCII比較,字串?數字?呃…這個…不就是ASCII比較麼?


\<…> 詞界符
這個是用在正則表達式中的一個特殊分隔符,用來標記單詞的分界。比如:the會匹配there,another,them等等,如果僅僅要匹配the,就可以使用這個詞界符,\

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