總結bash中常用特殊字符

#

注釋符號(Hashmark)

1.在shell文件的行首,作為shell調用解釋器標記,#!/bin/bash;

2. 在配置文件中作為注釋使用,在一行中,#后面的內容并不會被執行

;

作為多命令的分隔符(Command separator [semicolon])。

多個命令要放在同一行的時候,可以使用分號分隔。

;;

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

在使用case選項的時候,作為每個選項的終結符。

.

點號(dot command)。

1. 執行當前目錄文件

? ? ? ? ?#!/bin/bash

? ? ? ? ?.pythontab-file

2. 作為文件名的一部分,在文件名的開頭,表示該文件為隱藏文件

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

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

雙引號(double quotation marks)。

部分引用。雙引號包圍的內容可以允許變量擴展,也允許轉義字符的存在。

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

單引號括住的內容,所有字符均作為字符本身處理,

逗號(comma operator [comma])。

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

? ? ? ? ?#!/bin/bash

? ? ? ? ?lett1=((a=5+1, b=7+2))

? ? ? ? ?echot1=$t1, a=$a, b=$b

? ? ? ? ?##這個$t1=$b;

反斜線,反斜桿(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 ofline)。

${}

參數替換(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. 在數組的上下文中,表示數組元素,方括號內填上數組元素的位置就能獲得對應位置的內容,如:

1. ? ? ?Array[1]=xxx

2. ? ? ?echo${Array[1]};

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

[[]]

雙中括號(double brackets)。

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

$[…]

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

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

1. ? ? ?a=3

2. ? ? ?b=7

3. ? ? ?echo$[$a+$b]

4. ? ? ?echo$[$a*$b]

5. ? ? ?##返回是10和21

(())

雙括號(double parentheses)。

表示整數擴展(integer expansion)。

在雙括號結構中,所有表達式可以像c語言一樣,如:a++,b–等。

在雙括號結構中,所有變量可以不加入:“$”符號前綴。

雙括號可以進行邏輯運算,四則運算

雙括號結構擴展了for,while,if條件測試運算

支持多個表達式運算,各個表達式之間用“,”分開

?

>?

&

>&

>>?

?

重定向(redirection)。

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

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

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

scriptname >>filename 把scriptname的輸出(同>)追加到文件filename中,如果文件不存在則創建。一個>表示文件存在就覆蓋,不存在就創建,兩個>>表示不存在就創建,存在就在原有基礎上增加

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

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

這個也被稱為Here-document,用來將后繼的內容重定向到左側命令的stdin中。

三個小于號(here-strings)。Here-字串和Here-document類似,here-strings語法:command [args]

<...>

詞界符(word boundary)。

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

|

管道(pipe)。管道是Linux,Unix都有的概念,是非常基礎,也是非常重要的一個概念。它的作用是將管道前(左邊)的命令產生的輸出(stdout)作為管道后(右邊)的命令的輸入(stdin)。如:ls | wc l,使用管道就可以將命令連接在一起。注意:管道是每一個進程的標準輸出都會作為下一個命令的標準輸入,期間的標準輸出不能跨越管道作為后繼命令的標準輸入,如: cat filename | ls -al | sort 。想想這個的輸出? 同時,管道是以子進程來運行的,所以管道并不能引起變量改變。

>|

強制重定向(force redirection)。

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

&

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

如果命令后面跟上一個&符號,這個命令將會在后臺運行。

&&

||

邏輯操作符(logical operator)。

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

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

1. 作為選項,前綴[option,prefix]使用。

2. 用于stdin或者stdout的重定向的源或目的[dash].在tar沒有bunzip2的程序補丁時,我們可以這樣: bunzip2 linux-2.6.13.tar.bz2 | tar xvf – 。將前面解壓的數據作為tar的標準輸入(這里使用一個-表示)

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

? ? ? ? ?var=”-n”

? ? ? ? ?echo$var

? ? ? ? ?##試試看有什么輸出?

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

3. 表示先前的工作目錄(previousworking directory),因此,如果你cd到其他目錄下要放回前一個路徑的時候,可以使用cd -來達到目的,其實,這里的[-]使用的是環境變量的$OLDPWD,注意:這里的[-]和前一點是不同的;

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

=

等號(Equals)。

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

2. 在比較測試中作為比較符出現,這里要注意,如果在中括號中作為比較出現,需要有空格符在等號左右兩側。

+

加號(Plus)。

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

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

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

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

%

百分號(modulo[percent sign])。

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

2. 在參數替換(parametersubstitution)中,可以作為模式匹配。例子:

? ? ? ? ?p=b*9

? ? ? ? ?var=”abcd12345abc479″

? ? ? ? ?echo${var%p}, ${var%%p}

? ? ? ? ?##從右邊開始查找(想想從左是那個符號?)

? ? ? ? ?##任何在b和9之間的內容(含)

? ? ? ? ?##第一個是找到最短的符合匹配項

? ? ? ? ?##后一個是找最大符合的匹配項(貪婪匹配?)

~

波浪號(Home directory[tilde])。

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

^

脫字符(caret)。

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

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

空白

空白符(Whitespace)。

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

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享