LINUX 指令符號說明
符號
|
說明
|
1.檔名的『檔案類型』判斷,如 test -e filename 表示存在否
|
|
-e
|
『檔名』是否存在?(常用)
|
-f
|
『檔名』是否存在且為檔案(file)?(常用)
|
-d
|
『檔名』是否存在且為目錄(directory)?(常用)
|
-b
|
『檔名』是否存在且為一個 block device 裝置?
|
-c
|
『檔名』是否存在且為一個 character device 裝置?
|
-S
|
『檔名』是否存在且為一個 Socket 檔案?
|
-p
|
『檔名』是否存在且為一個 FIFO (pipe) 檔案?
|
-L
|
『檔名』是否存在且為一個連結檔?
|
2.檔案的判斷偵測,如 test -r filename 表示可讀否 (但 root 權限常有例外)
|
|
-r
|
偵測該檔名是否存在且具有『可讀』的權限?
|
-w
|
偵測該檔名是否存在且具有『可寫』的權限?
|
-x
|
偵測該檔名是否存在且具有『可執行』的權限?
|
-u
|
偵測該檔名是否存在且具有『SUID』的屬性?
|
-g
|
偵測該檔名是否存在且具有『SGID』的屬性?
|
-k
|
偵測該檔名是否存在且具有『Sticky bit』的屬性?
|
-s
|
偵測該檔名是否存在且為『非空白檔案』?
|
3. 兩個檔案之間的比較,如: test file1 -nt file2
|
|
-nt
|
(newer than)判斷 file1 是否比 file2 新
|
-ot
|
(older than)判斷 file1 是否比 file2 舊
|
-ef
|
判斷 file1 與 file2 是否為同一檔案,可用在判斷 hard link 的判定上。 主要意義在判定,兩個檔案是否均指向同一個
inode 哩!
|
4. 數字比較,例如 test n1 -eq n2
|
|
-eq
|
兩數值相等 (equal)
|
-ne
|
兩數值不等 (not equal)
|
-gt
|
n1 大於 n2 (greater than)
|
-lt
|
n1 小於 n2 (less than)
|
-ge
|
n1 大於等於 n2 (greater than or equal)
|
-le
|
n1 小於等於 n2 (less than or equal)
|
5. 判定字串的資料
|
|
-z 字串
|
判定字串是否為 0 ?若 字串 為空,則為 true
|
-n字串
|
判定字串是否非為 0 ?若 字串 為空,則為 false。
註: -n 亦可省略
|
str1 == str2
|
判定 str1 是否等於 str2 ,若相等,則回傳 true
|
str1 != str2
|
判定 str1 是否不等於 str2 ,若相等,則回傳 false
|
6. 多重條件判定,例如: test -r filename -a -x
filename
|
|
-a
|
(and)兩狀況同時成立!例如 test -r file -a -x file,則 file 同時具有 r 與 x 權限時,才回傳 true。
|
-o
|
(or)兩狀況任何一個成立!例如 test -r file -o -x file,則 file 具有 r 或 x 權限時,就可回傳 true。
|
!
|
反相狀態,如 test ! -x file ,當 file 不具有 x 時,回傳 true
|
SHELL特殊符號
#
|
註釋符號作為註釋使用,在一行中,#後面的內容並不會被執行。
用單/雙引號包圍時,#作為#號字元本身,不具有註釋作用。 |
;
|
分隔符號,多個語句放在同一行時,可使用分號隔。亦可連續指令。
例:tail aaa.txt; tail bbb.txt 查看aaa及bbb文件的後幾行 |
;;
|
連續分號在使用case選項的時候,作為每個選項的終結符。在Bash version 4+ 的時候,還可以使用[;;&], [;&]
|
. |
一個點代表當前目錄,兩個點號代表上層目錄,在當前目錄;linux中隱藏文件名的開頭(ls -a 可以顯示);正則表達式中的任意一個字符;加載一個文件內容
|
"
|
雙引號,部分引用。雙引號包圍的內容可以允許變量擴展,也允許轉義字元的存在。(雙引號內可保有變數的特性,單引號僅為一般字元)
|
' |
單引號括住的內容,被視為單一字串,引號內的禁止變量擴展,所有字元均作為字元本身處理(除單引號本身之外),單引號必須成對出現。
|
, |
逗號可用在連接一連串的數學表達式中;用於變數,允許從$ variable中提取任意數量的逗號分隔值;用於參數替代中,表示首字母小寫,如果是兩個逗號,則表示全部小寫
|
\ |
反斜桿轉義,保護元字符或通配符不被shell解析 ;放在一行指令的最後一行,其實也就是轉義了Enter,表示之後的輸入仍作為當前指令的一部分。(指令太長換行的意思)
|
/
|
作為路徑的分隔符,路徑中僅有一個斜桿表示根目錄,以斜桿開頭的路徑表示從根目錄開始的路徑;另也作為運算符除法。如6/2
|
`
|
反引號,後引號。命令替換。這個引號包圍的為命令,可以執行包圍的命令,並將執行的結果賦值給變量。用來引用命令 相當於$()
|
: |
冒號空命令,這個命令什麼都不做,但是有返回值0(即:true)。可做while死循環的條件;在if分支中作為佔位元符(即某一分支什麼都不做的時候);放在必須要有兩元操作的地方作為分隔符號
|
! |
感嘆號,非。表示反邏輯,比如後面的!= ,這個是表示不等於;表示取反,如:ls a[!0-9] #表示a後面不是緊0-9;!命令 執行之前執行過的命令!+數字 執行history中對應數字的命令。
|
*
|
用作為檔案名是一個萬用字元;正則表達式中可以作為字元限定詞,表示其前面的匹配規則匹配任意次;算術運算中表示乘法。
|
**
|
雙星號。算術運算中表示求冪運算。
|
? |
問號表示條件測試;參數替換表達式中用來測試一個變量是否設置了值;作為萬用字元,用於匹配單個字元; 正則表達式中,表示重覆前面字符0次或者1次。
|
$
|
美元符號。前面已經表示過一種意思。作為變量的前導符;在正則表達式中被定義為行末最後字節。
|
${}
|
美元符號加上大括號,即大括號中放變數的名稱,也是用於讀取變數的值。
|
$'...' |
引用內容展開,執行單引號內的轉義內容(單引號原本是原樣引用的),這種方式會將引號內的一個或者多個[\]轉義後的八進制,十六進制值展開到ASCII或Unicode字元。
|
$? |
此變量值在使用的時候,返回的是最後一個命令、函數、或腳本的退出狀態碼值,如果沒有錯誤則是0,如果為非0,則表示在此之前的最後一次執行有錯誤。
|
$*, $@ |
位置參數,使用腳本時,在傳遞參數時會用到。兩者都能返回調用腳本檔的參數,但$*是將所有參數作為一個整體返回(字串),而$@是將每個參數作為單元返回一個參數列表。注意,在使用的時候需要用雙引號將$*,$@括住。
|
$$
|
進程ID變量,這個變量保存了運行當前腳本的進程ID值。
|
() |
圓括號命令組。命令組中的命令在shell(subshell)中執行。因為是在子shell內運行,因此在括號外面是沒有辦法獲取括號內變量的值,但反過來,命令組內是可以獲取到外面的值,這點有點像局部變量和全域變量的關係,在實作中,如果碰到要cd到子目錄操作,並在操作完成後要返回到當前目錄的時候,可以考慮使用subshell來處理;用於數組的初始化。
|
{AA,BB,CC,...}
|
花括號擴展。{a,c,h} 表示 a c h,而{a..z}表示a到z
|
{} |
代碼塊。匿名函數,與函數不同,在代碼塊裡面的變量在代碼塊後面仍能訪問。注意:花括號內側需要有空格與語句分隔。另外,在xargs -i中的話,還可以作為文本的佔位元符,用以標記輸出文本的位置。
|
{} \; |
這個{}是表示路徑名,這個並不是shell內建的,現在接觸到的情況看,好像只用在find命令裡。注意後面的分號,這個是結束find命令中-exec選項的命令序列,在實際使用的時候,要轉義一下以免被shell理解錯誤。
|
[] |
中括號測試的表示,Shell會測試在[]內的表達式,需要注意的是,[]是Shell內建的測試的一部分,而非使用外部命令/usr/bin/test的鏈接;
|
[[]] |
雙中括號。這個結構也是測試,測試[[]]之中的表達式(Shell的關鍵字)。這個比單中括號更能防止腳本裡面的邏輯錯誤,比如:&&,||,<,>操作符能在一個[[]]裡面測試通過,但是在[]卻不能通過。[[]]裡面沒有檔案名擴展(filename expansion)或是詞分隔符號(Word splitting),但是可以用參數擴展(Parameter expansion)和命令替換(command
substitution)。不用檔案名萬用字元和像空白這樣的分隔符號。注意,這裡面如果出現了八進制,十六進制等,shell會自動執行轉換比較。
|
$[...]
|
詞表達表示整數擴展,在方括號裡面執行整數表達式。
|
(()) |
雙括號(double parentheses)。表示整數擴展(integer expansion)。功能和上面的$[]差不多,但是需要注意的是,$[]是會返回裡面表達式的值的,而(())只是執行,並不會返回值。兩者執行後如果變量值發生變化,都會影響到後繼代碼的運行。可對變量賦值,可以對變量進行一目操作符操作,也可以是二目,三目操作符。
|
>,&<,>&,>>,<,<> |
# testA > testB 重定向testA的輸出到test中,如果檔存在則覆蓋。
# testA &> testB 會重定向testA的標準輸出(stdout)和標準錯誤(stderr)到文件testB中。 # testA >&2 把testA的標準輸出(stdout)重定向到標準錯誤(stderr)中。 # testA >>testB 把testA的輸出追加到testB中,如果檔不存在則創建。 # [i]<>testA 打開testA這個檔用來讀或者寫,並且給檔指定i為它的檔描述符(file descriptor),檔不存在就會創建。 |
(command)>, <(command) |
這是進程替換。使用時注意,括號和<,>之間是不能有空格的,否則報錯。其作用有點類似通道,但和管道(|)在用法上又有些不同,管道是作為子進程的方式來運行的,這個命令會在/dev/fd/下面產生,類似/dev/fd/63, /dev/fd/62這類臨時文件,用來傳遞數據。Mitchell個人猜測之所以用這種方法來傳遞,是因為前後兩個不屬於同一個進程,因此需要用共用檔的方式來傳遞資料(這麼說其實管道也應該有同樣的文件?)。網上有人說這個只是共用檔而已,但是經過測試,發現雖然有/dev/fd/63這樣的檔產生,但是這個檔其實是指向pipe:[43434]這樣的通道的鏈接。
|
<< |
雙小於號。用來將後繼的內容重定向到左側命令的輸入中。<<可以節省格式化時間,別且使命令執行的處理更容易。在實作的時候只需要輸入<<和終止標誌符,而後(一般是回車後)你就可以輸入任何內容,只要在最後的新行中輸入終止標誌符,即可完成數據的導入。使用here-document的時候,你可以保留空格,換行等。如果要讓shell腳本更整潔一點,可以在<<和終止符之間放上一個連字元(-)。
|
<<< |
三個小於號(here-strings)。Here-字串和Here-document類似,here-strings語法:command [args]
<<<["]$word["];$word會展開並作為command(命令)的輸入。
|
\<...\> |
詞界符。這個是用在正則表達式中的一個特殊分隔符號,用來標記單詞的分界。比如:the會匹配there,another,them等等,如果僅僅要匹配the,就可以使用這個詞界符,\<the\>就只能匹配the了。
|
| |
管道。管道是Linux,Unix都有的概念,是非常基礎,也是非常重要的一個概念。它的作用是將|(左邊)命令的輸出作為後(右邊)的命令的輸入()。如:ls | grep all
|
>| |
與號。如果命令後面跟上一個&符號,這個命令將會在後台運行。有的時候,腳本中在一條在後台運行的命令可能會引起腳本掛起,等待輸入,出現這種情況可以在原有的腳本後面使用wait命令來修復。
|
&&,|| |
邏輯操作符(logical operator)。在測試結構中,可以用這兩個操作符來進行連接兩個邏輯值。||是當測試條件有一個為真時返回0(真),全假為假;&&是當測試條件兩個都為真時返回真(0),有假為假。
|
- |
運算式中,表示"減法"。expr 10 - 2 ;此外也是系統指令的選項符號。
ls -expr 10 - 2 ;在GNU指令中,如果單獨使用-符號,不加任何該加的文件名稱時,代表"標準輸入"的意思。這是GNU指令的共通選項。譬如下例tar xpvf - 這裡的-符號,既代表從標準輸入讀取資料。
不過,在cd指令中則比較特別 cd - 這代表變更工作目錄到"上一次"工作目錄。
|
= |
等號。賦值操作,給變量賦值,麼有空格在等號兩側; 在比較測試中作為比較符出現,這裡要注意,如果在中括號中作為比較出現,需要有空白字元在等號左右兩側。
|
+ |
加號。算術操作符,表示加法; 在正則表達式中,表示的是其前的這個匹配規則匹配最少一次; 在命令或過濾器中作為選項標記,在某些命令或者內置命令中使用+來啟用某些選項,使用-來禁止; 在參數替換中,+前綴表示替代值(當變量為空的時候,使用+後面的值)
|
%
|
百分號。在算術運算中,就是百分比;在參數替換中,可以作為模式匹配。
|
~ |
波浪號,這個和內部變量$HOME是一樣的。默認表示當前用戶的家目錄(主目錄),這個和~/效果一致,如果波浪號後面跟用戶名,表示是該用戶的家目錄,
|
~+
|
當前的工作目錄。這個和內置變量$PWD一樣。
|
~-
|
前一個工作目錄。這個和內部變量$OLDPWD一致,之前的[-]也一樣。
|
=~ |
Bash 版本3中有介紹,這個是正則表達式匹配。可用在[[]]測試中,比如:
var="this is a test message." [[ "$var" =~ tf*message ]] && echo "Sir. Found that." || echo "Sorry Sir. No match be found." ##你可以修改中間的正則表達式匹配項,正則表達式可以但不一定需要使用雙引號括起來。 |
^ |
脫字元。 在正則表達式中,作為一行的行首位置標誌符;在參數替換中,這個用法有兩種,一個脫字元( ${var^}),或兩個( ${var^^}),分別表示第一個字母大寫,全部大寫的意思(Bash version >=4)。
|
空白 |
空白符。不僅僅是指空格,還包括製表符,空行,或者這幾種的組合。可用做函數的分隔符號,分隔命令或變量,空行不會影響腳本的行為,因此可以用它來規劃腳本代碼,以增加可讀性,在內置的特殊變量$IFS可以用來針對某些命令進行輸入的參數進行分割,其默認就是空白符。在字串或變量中如果有空白符,可以使用引號來規避可能的錯誤。
|
沒有留言:
張貼留言