Bash 中的特殊字符大全【轉】

Linux下不管如何都是要用到shell命令的,在Shell的實際使用中,有編程經驗的很容易上手,但稍微有難度的是shell裏面的那些個符號,各類特殊的符號在咱們編寫Shell腳本的時候若是可以用的好,每每能給咱們起到事半功倍的效果,爲此,特意將Shell裏面的一些符號說明羅列成對照表的形式,以便快速的查找。看看你知道下表中的哪些Shell符號呢?html

Shell符號及各類解釋對照以下:linux

特殊符號(#)

註釋符號(Hashmark[Comments])正則表達式

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

2. 其餘地方做爲註釋使用,在一行中,#後面的內容並不會被執行,除非;編程

3. 可是用單/雙引號包圍時,#做爲#號字符自己,不具備註釋做用。數組

特殊符號(;)

做爲多語句的分隔符(Command separator [semicolon])。bash

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

特殊符號(;;)

連續分號(Terminator [double semicolon])。curl

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

特殊符號(.)

點號(dot command [period])。

1. 至關於bash內建命令source,如:

#!/bin/bash
. data-file
#包含data-file;

2. 做爲文件名的一部分,在文件名的開頭,表示該文件爲隱藏文件,ls通常不顯示出來(ls -a 能夠顯示);

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

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

特殊符號(")

雙引號(partial quoting [double quote])。

部分引用。雙引號包圍的內容能夠容許變量擴展,也容許轉義字符的存在。若是字符串內出現雙引號自己,須要轉義,所以不必定雙引號是成對的。\

特殊符號(')

單引號(full quoting [single quote])。

單引號括住的內容,被視爲單一字符串,引號內的禁止變量擴展,全部字符均做爲字符自己處理(除單引號自己以外),單引號必須成對出現。

特殊符號(,)

逗號(comma operator [comma])。

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

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

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

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

特殊符號(\)

反斜線,反斜杆(escape [backslash])。

1. 放在特殊符號以前,轉義特殊符號的做用,僅表示特殊符號自己,這在字符串中經常使用;

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

特殊符號(/)

斜線,斜杆(Filename path separator [forward slash])。

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

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

特殊符號(`)

反引號,後引號(Command substitution[backquotes])。

命令替換。這個引號包圍的爲命令,能夠執行包圍的命令,並將執行的結果賦值給變量。如:a=`dirname '/tmp/x.log'` 。

後面dirname返回的結果會賦值給a,注意,此處Mitchell特意使用了反引號和單引號,注意區別。

特殊符號(:)

冒號(null command [colon])。

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

1. 可作while死循環的條件;

2. 在if分支中做爲佔位符(即某一分支什麼都不作的時候);

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

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

5. 甚至你能夠用來註釋(#後的內容不會被檢查,但:後的內容會被檢查,若是有語句若是出現語法錯誤,則會報錯);

6. 你也能夠做爲域分隔符,好比環境變量$PATH中,或者passwd中,都有冒號的做爲域分隔符的存在;

7. 你也能夠將冒號做爲函數名,不過這個會將冒號的原本意義轉變(若是你不當心做爲函數名,你可使用unset -f : 來取消function的定義)。

特殊符號(!)

感嘆號(reverse (or negate) [bang],[exclamation mark])。

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

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

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

3. 在不一樣的環境裏面,感嘆號也能夠出如今間接變量引用裏面;

4. 在命令行中,能夠用於歷史命令機制的調用,你能夠試試!$,!#,或者!-3看看,不過要注意,這點特性不能在腳本文件裏面使用(被禁用)。

特殊符號(*)

星號(wildcard/arithmetic operator[asterisk])。

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

2. 正則表達式中能夠做爲字符限定符,表示其前面的匹配規則匹配任意次;

3. 算術運算中表示乘法。

特殊符號(**)

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

特殊符號(?)

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

1. 表示條件測試;

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

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

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

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

特殊符號($)

美圓符號(Variable substitution[Dollar sign])。

1. 做爲變量的前導符,用做變量替換,即引用一個變量的內容,好比:echo $PATH

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

特殊符號(${})

參數替換(Variable substitution)。

用於在字符串中表示變量。

特殊符號($‘...’)

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

特殊符號($*或$@)

位置參數(Positional Parameters)。

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

特殊符號($#)

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

特殊符號($?)

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

特殊符號($$)

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

特殊符號(())

圓括號(parentheses)。

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

2. 用於數組的初始化。

特殊符號({x,y,z,...})

花括號擴展(Brace Expansion)。

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

特殊符號({a..z})

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

特殊符號({})

代碼塊(curly brackets)。

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

特殊符號({} \;)

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

特殊符號([])

中括號(brackets)。

1. 測試的表示,Shell會測試在[]內的表達式,須要注意的是,[]是Shell內建的測試的一部分,而非使用外部命令/usr/bin/test的連接;

2. 在數組的上下文中,表示數組元素,方括號內填上數組元素的位置就能得到對應位置的內容,如:

Array[1]=xxx
echo ${Array[1]};

3. 表示字符集的範圍,在正表達式中,方括號表示該位置能夠匹配的字符集範圍。

特殊符號([[]])

雙中括號(double brackets)。

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

特殊符號($[...])

詞表達表示整數擴展(integer expansion)。

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

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

特殊符號((()))

雙括號(double parentheses)。

表示整數擴展(integer expansion)。功能和上面的$[]差很少,可是須要注意的是,$[]是會返回裏面表達式的值的,而(())只是執行,並不會返回值。二者執行後若是變量值發生變化,都會影響到後繼代碼的運行。可對變量賦值,能夠對變量進行一目操做符操做,也能夠是二目,三目操做符。

特殊符號(> , &< ,>&,>>,<,<> )

重定向(redirection)。

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) )

這是進程替換(Process Substitution)。

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

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

特殊符號(<<)

雙小於號(here-document[double less then marks])。

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

特殊符號(<<<)

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

特殊符號(>, <)

小於,大於號(ASCII Comparison)。

ASCII比較,進行的是變量的ASCII比較,字串?數字?呃...這個...不就是ASCII比較麼?

特殊符號(\<...\>)

詞界符(word boundary)。

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

特殊符號(|)

管道(pipe)。管道是Linux,Unix都有的概念,是很是基礎,也是很是重要的一個概念。它的做用是將管道前(左邊)的命令產生的輸出(stdout)做爲管道後(右邊)的命令的輸入(stdin)。如:ls | wc l,使用管道就能夠將命令鏈接在一塊兒。注意:管道是每個進程的標準輸出都會做爲下一個命令的標準輸入,期間的標準輸出不能跨越管道做爲後繼命令的標準輸入,如: cat filename | ls -al | sort 。想一想這個的輸出? 同時,管道是以子進程來運行的,因此管道並不能引發變量改變。

特殊符號(>|)

強制重定向(force redirection)。

這會強制重寫已經存在的文件。

特殊符號(&)

與號(Run job in background[ampersand])。

若是命令後面跟上一個&符號,這個命令將會在後臺運行。有的時候,腳本中在一條在後臺運行的命令可能會引發腳本掛起,等待輸入,出現這種狀況能夠在原有的腳本後面使用wait命令來修復。

特殊符號(&&,||)

邏輯操做符(logical operator)。

在測試結構中,能夠用這兩個操做符來進行鏈接兩個邏輯值。||是當測試條件有一個爲真時返回0(真),全假爲假;&&是當測試條件兩個都爲真時返回真(0),有假爲假。

特殊符號(-)

減號,連字符(Hyphen/minus/dash)。

1. 做爲選項,前綴[option, prefix]使用。用於命令或者過濾器的選項標誌;操做符的前綴。如:

## COMMAND -[選項列表]
ls -al
sort -dfu $file
set -- $variable
 
if [ $file -ot $file2 ]
then
    echo "$file is older than $file2."
fi

2. 用於stdin或者stdout的重定向的源或目的[dash].在tar沒有bunzip2的程序補丁時,咱們能夠這樣: bunzip2 linux-2.6.13.tar.bz2 | tar xvf - 。將前面解壓的數據做爲tar的標準輸入(這裏使用一個-表示)

注意:在實做的時候,若是文件名是以[-]開頭的,那麼在加上這個做爲定向操做符的時候,可能會出錯,此時應該爲文件加上合適的前綴路徑,以免這種狀況發生,一樣的,在echo變量的時候,若是變量是以[-]開始,那麼可能也會產生意想不到的結果,爲了保險起見,可使用雙引號引用標量:

var="-n"
echo $var
## 試試看有什麼輸出?

還有,這種表示方法不是Bash內建的,要達到此點的這種效果,須要看你使用的軟件是否支持這種操做;

3. 表示先前的工做目錄(previous working directory),所以,若是你cd到其餘目錄下要放回前一個路徑的時候,可使用cd -來達到目的,其實,這裏的[-]使用的是環境變量的$OLDPWD,注意:這裏的[-]和前一點是不一樣的;

4. 減號或者負號,用在算術操做中。

特殊符號(=)

等號(Equals)。

1. 賦值操做,給變量賦值,麼有空格在等號兩側;

2. 在比較測試中做爲比較符出現,這裏要注意,若是在中括號中做爲比較出現,須要有空格符在等號左右兩側。

特殊符號(+)

加號(Plus)。

1. 算術操做符,表示加法;

2. 在正則表達式中,表示的是其前的這個匹配規則匹配最少一次;

3.在命令或過濾器中做爲選項標記,在某些命令或者內置命令中使用+來啓用某些選項,使用-來禁止;

4. 在參數替換(parameter substitution)中,+前綴表示替代值(當變量爲空的時候,使用+後面的值)

特殊符號(%)

百分號(modulo[percent sign])。

1.在算術運算中,這個是求模操做符,即兩個數進行除法運算後的餘數;

2. 在參數替換(parameter substitution)中,能夠做爲模式匹配。例子:

p=b*9
var="abcd12345abc479"
echo ${var%p}, ${var%%p}
##從右邊開始查找(想一想從左是那個符號?)
##任何在b和9之間的內容(含)
##第一個是找到最短的符合匹配項
##後一個是找最大符合的匹配項(貪婪匹配?)

特殊符號(~)

波浪號(Home directory[tilde])。

這個和內部變量$HOME是同樣的。默認表示當前用戶的家目錄(主目錄),這個和~/效果一致,若是波浪號後面跟用戶名,表示是該用戶的家目錄。

特殊符號(~+)

當前的工做目錄(current working directory)。

這個和內置變量$PWD同樣。

特殊符號(~-)

前一個工做目錄(previous working directory)。

這個和內部變量$OLDPWD一致,以前的[-]也同樣。

特殊符號(=~)

Bash 版本3中有介紹,這個是正則表達式匹配。可用在[[]]測試中,好比:

var="this is a test message."
[[ "$var" =~ tf*message ]] && echo "Sir. Found that." || echo "Sorry Sir. No match be found."
##你能夠修改中間的正則表達式匹配項,正則表達式能夠但不必定須要使用雙引號括起來。

特殊符號(^)

脫字符(caret)。

1. 在正則表達式中,做爲一行的行首(beginning-of-line)位置標誌符;

2. 在參數替換(Parameter substitution)中,這個用法有兩種,一個脫字符(${var^}),或兩個(${var^^}),分別表示第一個字母大寫,所有大寫的意思(Bash version >=4)。

特殊符號(空白)

空白符(Whitespace)。

空白符不只僅是指空格(spaces),還包括製表符(tabs),空行(blank lines),或者這幾種的組合。可用作函數的分隔符,分隔命令或變量,空行不會影響腳本的行爲,所以能夠用它來規劃腳本代碼,以增長可讀性,在內置的特殊變量$IFS能夠用來針對某些命令進行輸入的參數進行分割,其默認就是空白符。在字符串或變量中若是有空白符,可使用引號來規避可能的錯誤。

 

怎樣,你有多少是瞭解的呢?Mitchell在開始的Shell腳本時候,發如今這裏面有好多都是不認識呢。

說明:由於涉及到翻譯,文中內容不必定徹底翻譯準確,若是你發現有錯誤的地方,還請包涵指正。

參考:

  1. 本文主要內容來源:Advanced Bash-Scripting Guide
  2. 對話 UNIX: !$#@*%
  3. wikipedia的Here文檔

轉自:https://linux.cn/article-5657-1.html

相關文章
相關標籤/搜索