Linux下高效編寫Shell――shell特殊字符匯總
Linux下無論如何都是要用到shell命令的,在Shell的實際使用中,有編程經驗的很容易上手,但稍微有難度的是shell里面的那些個符號,各種特殊的符號在我們編寫Shell腳本的時候如果能夠用的好,往往能給我們起到事半功倍的效果,為此,特地將Shell里面的一些符號說明羅列成對照表的形式,以便快速的查找。看看你知道下表中哦你的哪些Shell符號呢?
Shell符號及各種解釋對照表:
注釋符號(Hashmark[Comments])
1.在shell文件的行首,作為include標記,#!/bin/bash;
2. 其他地方作為注釋使用,在一行中,#后面的內容并不會被執行,除非;
3. 但是用單/雙引號包圍時,#作為#號字符本身,不具有注釋作用。
點號(dot command [period])。
1. 相當于bash內建命令source,如:
#!/bin/bash
. data-
file
#包含data-file;
2. 作為文件名的一部分,在文件名的開頭,表示該文件為隱藏文件,ls一般不顯示出來(ls -a 可以顯示);
3. 作為目錄名,一個點代表當前目錄,兩個點號代表上層目錄(當前目錄的父目錄)。注意,兩個以上的點不出現,除非你用引號(單/雙)包圍作為點號字符本身;
4. 正則表達式中,點號表示任意一個字符。
逗號(comma operator [comma])。
1. 用在連接一連串的數學表達式中,這串數學表達式均被求值,但只有最后一個求值結果被返回。如:
#!/bin/bash
let
t1=((a=5+1, b=7+2))
echo
t1=$t1, a=$a, b=$b
## 這個$t1=$b;
a=
"ATest"
echo
${a,}
echo
${a,,}
## 前面輸出aTest,后面輸出的是atest。
反斜線,反斜桿(escape [backslash])。
1. 放在特殊符號之前,轉義特殊符號的作用,僅表示特殊符號本身,這在字符串中常用;
2. 放在一行指令的最末端,表示緊接著的回車無效(其實也就是轉義了Enter),后繼新行的輸入仍然作為當前指令的一部分。
斜線,斜桿(Filename path separator [forward slash])。
1.作為路徑的分隔符,路徑中僅有一個斜桿表示根目錄,以斜桿開頭的路徑表示從根目錄開始的路徑;
2.在作為運算符的時候,表示除法符號。如:
a=4
/2
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. 算術運算中表示乘法。
問號(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)。
圓括號(parentheses)。
1, 命令組(Command group)。由一組圓括號括起來的命令是命令組,命令組中的命令實在子shell(subshell)中執行。因為是在子shell內運行,因此在括號外面是沒有辦法獲取括號內變量的值,但反過來,命令組內是可以獲取到外面的值,這點有點像局部變量和全局變量的關系,在實作中,如果碰到要cd到子目錄操作,并在操作完成后要返回到當前目錄的時候,可以考慮使用subshell來處理;
2. 用于數組的初始化。
echo
{a,b,c}-{\ d,
" e"
,
' f'
}
xargs -i
中的話,還可以作為文本的占位符,用以標記輸出文本的位置。find
命令中-exec
選項的命令序列,在實際使用的時候,要轉義一下以免被shell理解錯誤。中括號(brackets)。
1. 測試的表示,Shell會測試在[]內的表達式,需要注意的是,[]是Shell內建的測試的一部分,而非使用外部命令/usr/bin/test
的鏈接;
2. 在數組的上下文中,表示數組元素,方括號內填上數組元素的位置就能獲得對應位置的內容,如:
Array[1]=xxx
echo
${Array[1]};
a=3
b=7
echo
$[$a+$b]
echo
$[$a*$b]
##返回是10和21
scriptname >filename
command
&>filename
command
>&2
scriptname >>filename
[i]<>filename
/dev/fd/
下面產生類似/dev/fd/63
,/dev/fd/62
這類臨時文件,用來傳遞數據。Mitchell個人猜測之所以用這種方法來傳遞,是因為前后兩個不屬于同一個進程,因此需要用共享文件的方式來傳遞資料(這么說其實管道也應該有同樣的文件?)。網上有人說這個只是共享文件而已,但是經過測試,發現雖然有/dev/fd/63
這樣的文件產生,但是這個文件其實是指向pipe:[43434]這樣的通道的鏈接。command [args] <<<["]$word["]
;$word會展開并作為command的stdin。ls | wc l
,使用管道就可以將命令連接在一起。注意:管道是每一個進程的標準輸出都會作為下一個命令的標準輸入,期間的標準輸出不能跨越管道作為后繼命令的標準輸入,如:
cat filename | ls -al | sort ##想想這個的輸出? 同時,管道是以子進程來運行的,所以管道并不能引起變量改變。
## COMMAND -[選項列表]
ls
-al
sort
-dfu $
file
set
-- $variable
if
[ $
file
-ot $file2 ]
then
echo
"$file is older than $file2."
fi
bunzip2 linux-2.6.13.
tar
.bz2 |
tar
xvf -
##將前面解壓的數據作為tar的標準輸入
##(這里使用一個-表示)
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之間的內容(含)
##第一個是找到最短的符合匹配項
##后一個是找最大符合的匹配項(貪婪匹配?)
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)。
怎樣,你有多少是了解的呢?Mitchell在開始的Shell腳本時候,發現在這里面有好多都是不認識呢。
說明:
因為涉及到翻譯,文中內容不一定完全翻譯準確,如果你發現有錯誤的地方,還請包涵指正。
參考:
參考內容為本篇成文之際給予Mitchell幫助較大的文章,在整個過程中還有很多網站信息給我提供了幫助,在此對他們的作者的無私貢獻表示感謝!
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成