shell腳本積累(不斷更新)

1.去除操作
主要原則:# 從左開始  %從右開始

#象徵要尋找最左邊的/(短的)
##象徵要尋找最右邊的/(長的)
而*是通配符,象徵着任意長度的字符串

區別:${0##*/}
      ${0%/*}  (知道這二個就夠用了吧!!)
不同點的地方在於,#是從左邊頭部開始尋找起,%是從尾部開始尋找起(If the pattern matches a trailing portion)

${0%/*} 這個命令,對於/usr/school/grade/class/student,從右邊找起,得到是 /student 這個部分,然後扔掉

如果是${0%%/*},找到的就是 /usr/school/grade/class/student

對於同一個文件 /usr/school/grade/class/student 

${0%/*}得到前面/usr/school/grade/class

${0##*/}得到的是後面 student

2.標準輸入輸出操作
shell上: 
0表示標準輸入 
1表示標準輸出 
2表示標準錯誤輸出

默認爲標準輸出重定向,與 1> 相同 
& 是一個描述符,如果1或2前不加&,會被當成一個普通文件。
1>&2 意思是把標準輸出重定向到標準錯誤.
2>&1 意思是把標準錯誤輸出重定向到標準輸出。
&>filename 意思是把標準輸出和標準錯誤輸出都重定向到文件filename中

用例子說話:
grep da * 1>&2
rm -f $(find / -name core) &> /dev/null 
上面兩例中的 & 如何理解,&不是放到後臺執行嗎?
牛解:

         1).&>file或n>&m均是一個獨立的重定向符號,不要分開來理解。

         2).明確文件和文件描述符的區別。

         3).&>file表示重定向標準輸出和錯誤到文件 
例如: 
rm -f $(find / -name core) &> /dev/null,/dev/null是一個文件,這個文件比較特殊,所有傳給它的東西它都丟棄掉。

         4).n>&m表示使文件描述符n成爲輸出文件描述符m的副本。這樣做的好處是,有的時候你查找文件的時候很容易產生無用的信息,
如:2> /dev/null的作用就是不顯示標準錯誤輸出;另外當你運行某些命令的時候,出錯信息也許很重要,便於你檢查是哪出了毛病,
如:2>&1 
       例如: 
       注意,爲了方便理解,必須設置一個環境使得執行grep da *命令會有正常輸出和錯誤輸出,然後分別使用下面的命令生成三個文件: 
grep da * > greplog1 
grep da * > greplog2 1>&2 
grep da * > greplog3 2>&1 //grep da * 2> greplog4 1>&2 結果一樣 
#查看greplog1會發現裏面只有正常輸出內容 
#查看greplog2會發現裏面什麼都沒有 
#查看greplog3會發現裏面既有正常輸出內容又有錯誤輸出內容

3.位置參數:Bash shell中的位置參數$#,$*,$@,$0,$1,$2...及特殊參數$?,$-等的含義
詳見ABS(Advanced Bash Shell)中文翻譯版103頁第9章第一節內部變量,當然英文版ABS都一樣

$1, $2, $3等等...(注意,$0不是位置參數)
位置參數,從命令行傳遞給腳本,或者是傳遞給函數.或者賦職給一個變量.
此數目可以任意多,但只有前9個可以被訪問,使用shift命令可以改變這個限制。
(具體見Example 4-5 和Example 11-15)

$0
$0表示當前執行的進程名,script 本身的名字,或者在正則表達式中表示整行輸出
$#
命令行或者是位置參數的個數.(見Example 33-2)
$*
所有的位置參數,被作爲一個單詞.
    注意:"$*"必須被""引用.
$@
與$*同義,但是每個參數都是一個獨立的""引用字串,這就意味着參數被完整地傳遞,
並沒有被解釋和擴展.這也意味着,每個參數列表中的每個參數都被當成一個獨立的單詞.
注意:"$@"必須被""引用(會讓每一個參數加上引號),比如:

bash test.bash x y z
則$@內容爲:"x" "y" "z"
$*內容爲:"x y z"
其他的特殊參數
$-
傳遞給腳本的falg(使用set 命令).參考Example 11-15.
顯示shell使用的當前選項,與set命令功能相同
注意:這起初是ksh 的特徵,後來被引進到Bash 中,但不幸的是,在Bash 中它看上去也不
能可靠的工作.使用它的一個可能的方法就是讓這個腳本進行自我測試(查看是否是交
互的).
$!
在後臺運行的最後的工作的PID(進程ID).
$_
保存之前執行的命令的最後一個參數.
$?
命令,函數或者腳本本身的退出狀態(見Example 23-7)
用於檢查上一個命令,函數或者腳本執行是否正確。(在Linux中,命令退出狀態爲0表示該命令正確執行,任何非0值表示命令出錯。)
$$
腳本自身的進程ID.這個變量經常用來構造一個"unique"的臨時文件名.
(參考Example A-13,Example 29-6,Example 12-28 和Example 11-25).
這通常比調用mktemp 來得簡單.
注意事項:
[1] 當前運行的腳本的PID 爲$$.
[2] "argument"和"parameter"這兩個單詞經常不加區分的使用.在這整本書中,這兩個
單詞的意思完全相同.(在翻譯的時候就未加區分,統統翻譯成參數)

發佈了85 篇原創文章 · 獲贊 22 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章