#!:符號能夠被內核識別成是一個腳本的開始,這一行必須位于腳本的首行
$0:當前腳本的名字
$#:輸入<調用>參數(腳本或函數的位置參數)?的個數,如?NumArg=$#;echo"\$#: $#;\$NumArg: $NumArg"
$@:傳遞給腳本或函數的所有參數,按空格劃分成不同的部分。注意:?如果一個參數中有空格,這個參數將會被從空格($IFS默認)處分尸
"$@":分隔成單個參數,如"$1”“$2”“$3”,?$@以IFS(默認為空格)來劃分字段,如果空格在“”里面,不劃分即不會被分尸
$*:傳遞給腳本或函數的所有參數,按空格劃分成不同的部分,與$@沒有區別
"$*":擴展成一個參數,如"$1$2 $3",不論調用時傳入了多少個參數,都將被按原樣處理成一個整體性的參數使用。$@ $*只在被雙引號包起來的時候才會有差異
$?:上個命令或函數的返回值
$n:第幾個參數,n=3則$n是$3?,注意,$10?不能獲取第十個參數,獲取第十個參數需要${10}。當n>=10時,需要使用${n}來獲取參數。
$$:當前shell腳本的進程ID
$!:用于保存運行的最后一個進程的PID 號。
$(command):內置命令替換操作符。Spid=$(pidof NmsServer)?或?echo $(pidof NmsServer)?等同于反引號:?`pidof NmsServer`
`command`:反斜杠——同上:$(command)?
?????注意:這兩種命令的執行方式,是在當前shell環境中,開啟了一個子進程,在這個子進程中執行命令并完成替換。所以當語句執行完回到主腳本中時,再訪問子進程中定義、修改的數據,注意徒勞!
${PIDLIST[@]}:數組PIDLIST的全部值
${#PIDLIST[@]}:獲取數組PIDLIST=(${Spid}?${Mpid} ${ProbePid})中的元素個數
${}:shell變量的引方式<更加明確的變量名稱的界定>;匹配與替換操作;
變量引用
pid=$(pgrep-f java)
echo ${pid}
輸出:3758564369 79366
echo ${pid}|awk '{print NF}'
輸出結果:6
echo "${pid}"
輸出:
37585
64369
79366
特殊的替換結構
${var:-string},${var:+string},${var:=string},${var:?string}
? ? ? ①${var:-string}和${var:=string}:若變量var為空,則用在命令行中用string來替換${var:-string},否則變量var不為空時,則用變量var的值來替換${var:-string};對于${var:=string}的替換規則和${var:-string}是一樣的,所不同之處是${var:=string}若var為空時,用string替換${var:=string}的同時,把string賦給變量var:?${var:=string}很常用的一種用法是,判斷某個變量是否賦值,沒有的話則給它賦上一個默認值。
? ? ? ② ${var:+string}的替換規則和上面的相反,即只有當var不是空的時候才替換成string,若var為空時則不替換或者說是替換成變量var的值,即空值。(因為變量var此時為空,所以這兩種說法是等價的)?
? ? ? ③${var:?string}替換規則為:若變量var不為空,則用變量var的值來替換${var:?string};若變量var為空,則把string輸出到標準錯誤中,并從腳本中退出。我們可利用此特性來檢查是否設置了變量的值。
? ? ??補充擴展:在上面這五種替換結構中string不一定是常值的,可用另外一個變量的值或是一種命令的輸出。
匹配替換結構
${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
? ? ?第一種模式:${variable%pattern},這種模式時,shell在variable中查找,看它是否一給定的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最短的匹配模式
? ? ?第二種模式:?${variable%%pattern},這種模式時,shell在variable中查找,看它是否一給定]的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最長的匹配模式
? ? ?第三種模式:${variable#pattern}?這種模式時,shell在variable中查找,看它是否一給定的模式pattern開始,如果是,就從命令行把variable中的內容去掉左邊最短的匹配模式
? ? ?第四種模式:?${variable##pattern}?這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最長的匹配模式
? ? ?這四種模式中都不會改變variable的值,其中,只有在pattern中使用了*匹配符號時,%和%%,#和##才有區別。結構中的pattern支持通配符,*表示零個或多個任意字符,?表示僅與一個任意字符匹配,[...]表示匹配中括號里面的字符,[!...]表示不匹配中括號里面的字符。
字符串提取和替換
${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}
第一種模式:${var:num},這種模式時,shell在var中提取第num個字符到末尾的所有字符。若num為正數,從左邊0處開始;若num為負數,從右邊開始提取字串,但必須使用在冒號后面加空格或一個數字或整個num加上括號,如${var: -2}、${var:1-3}或${var:(-2)}。???????
第二種模式:${var:num1:num2},num1是位置,num2是長度。表示從$var字符串的第$num1個位置開始提取長度為$num2的子串。不能為負數。
第三種模式:${var/pattern/pattern}表示將var字符串的第一個匹配的pattern替換為另一個pattern。。????????
第四種模式:${var//pattern/pattern}表示將var字符串中的所有能匹配的pattern替換為另一個pattern。
$[] $(())?:它們功能一樣,都是進行數學運算的。支持+ - * / %:分別為“加、減、乘、除、取模”。但是注意,bash只能作整數運算,對于浮點數是當作字符串處理的。
$IFS?:?shell的內部域分隔符。當?shell處理"命令替換"和"參數替換"時,shell 根據 IFS 的值,默認是 space, tab, newline來拆解讀入的變量,然后對特殊字符進行處理,最后重新組合賦值給該變量。IFS的默認值為:空白(包括:空格,tab,和新行).
將其ASSII碼用十六進制打印出來:
$ echo$IFS
?
$ echo"$IFS" | od -b
0000000040 011 012 012
0000004
直接輸出IFS是看不到的,把它轉化為二進制就可以看到了,"040"是空格,"011"是Tab,"012"是換行符"\n"。最后一個?012?是因為?echo?默認是會換行的
將其ASSII碼用十六進制打印出來:echo -n "$IFS"|xxd -g 1|awk -F":" '{print $2}'|awk -F" " '{print $1, $2, $3}'????輸出結果:20 09 0a????https://blog.csdn.net/whuslei/article/details/7187639
expr?:?命令對算術表達式求值??如:c=`expr?$a +?$b`
0?表示標準輸入
1?表示stdout標準輸出
2?表示stderr標準錯誤
&?表示等同于的意思,2>&1,表示2的輸出重定向等同于1
>?:將執行結果輸出到文件、設備上
> /dev/null:不可回收垃圾箱??,命令等同于1>/dev/null
???????????????????????Example: ./yunNanAlertTransferTest.sh?1>/dev/null?2>yunNanAlertTransferTest.log?&
>>:將執行結果追加到文件、設備上
<:從文件、設備、輸入點讀入內容
<<:從文件、設備、輸入點追加讀入內容
|:一個命令的輸出傳遞給另一個命令當做輸入
test命令,等價于[??]:內置test命令常用操作符號,將表達式寫在[]中,?如:[ expression ]#注意:expression首尾都有個空格。表達式結果為真,則test返回值為0,否則為非0?
==:兩個值的比較,如A1是否與A2相等,真:返回0,非:返回非0?[ string1 == sting2 ]
!=:兩個值的比較,如A1是否與A2不相等。??注:[ string1?]——string1是否是個空串。
=~:用于匹配或側表達式,即左側是否包含右側。if [[ $1 =~ stop || $1 =~ 'status' ]];??[]?這種結構不支持該操作。
XXX():表示這是一個函數
{ command1;command2;command3;?}:表示這個主體中的內容是個執行體,這個執行體不開子進程,在當前腳本進程中按序執行。開關與結尾的空格,最后一個命令必須有“;”
./:表示當前目錄——fork調用,在當前父進程中新起一個子進程執行
../:??表示當前目錄的上級目錄
\:用作轉義字符,或稱逃脫字符,echo要讓轉義字符發生作用,就要使用-e選項,且轉義字符要使用雙引號?。另一作用,反斜杠用于一行的最后一個字符時,把行尾的反斜杠作為續行,這種結構在分幾行輸入長命令時經常使用。
'':單引號——表示純情字符串;引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;引號字串中不能出現單引號(對單引號使用轉義符后也不行)。
????????????????????? 單引號將剝奪其中的所有字符的特殊含義,阻止對所有字符的轉義, 將所有的字符看做其字面的意思。
"":雙引號——表示純情字符串或變量的值。如果變量需多行呈現,需要雙引號,否則單行呈現。見下圖示。雙引號里可以有變量,雙引號里可以出現轉義字符。?
??????????????????????雙引號會處理字符串中的'$'(參數替換),'``' or '()'(命令替換),'\' 轉義字符 和算數等。
?????兩者基本上沒有什么區別,除非在內容中遇到了參數替換符$和命令替換符`(我不是單引號)。
sync:刷新內存緩存
exit:Shell內置命令,用來退出當前?Shell進程,并返回一個退出狀態;使用$?可以接收這個退出狀態(0~255?之間的整數,其中只有?0?表示成功,其它值都表示失敗)????注意,exit?表示退出當前?Shell?進程,我們必須在新進程中運行test.sh,否則當前?Shell?會話(終端窗口)會被關閉,我們就無法看到輸出結果了。為了腳本執行完不會退出終端,腳本的執行需要使用?fork?方式。