天天看點

shell腳本積累(不斷更新)

1.去除操作

主要原則:# 從左開始  %從右開始

#象征要尋找最左邊的/(短的)

##象征要尋找最右邊的/(長的)

而*是通配符,象征着任意長度的字元串

差別:${0##*/}

      ${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中的位置參數$#,$*,[email protected],$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)

$*

所有的位置參數,被作為一個單詞.

    注意:"$*"必須被""引用.

[email protected]

與$*同義,但是每個參數都是一個獨立的""引用字串,這就意味着參數被完整地傳遞,

并沒有被解釋和擴充.這也意味着,每個參數清單中的每個參數都被當成一個獨立的單詞.

注意:"[email protected]"必須被""引用(會讓每一個參數加上引号),比如:

bash test.bash x y z

則[email protected]内容為:"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"這兩個單詞經常不加區分的使用.在這整本書中,這兩個

單詞的意思完全相同.(在翻譯的時候就未加區分,統統翻譯成參數)

繼續閱讀