標籤:style blog http color io os ar 使用 strong
來源:(linux shell)第一章--小試牛刀(上)
從今天開始,我們一起來學習《linux shell指令碼攻略》這本書。
1.1簡單介紹
shell指令碼一般是一個以#!起始的文字檔,例如以下所看到的:
#!/bin/bash
有兩種運行shell指令碼的方式,分別例如以下:
sh script.sh 或者./script.sh
可是在運行指令碼曾經,我們須要給指令碼運行許可權才行,不然指令碼無法運行
chmod a+x script.sh
在命令中行中,假設須要同一時候運行多個命令,能夠使用
cmd1;cmd2
1.2中斷列印
1.2.1 實戰演練
echo 是用於中斷列印的基本命令。
在預設情況下,echo在每次調用後會加入一個分行符號。
僅僅須要使用帶雙引號的文本,結合echo命令就能夠將該文本在中斷上列印出來,類似的,不待雙引號的文本也能夠得到童謠的輸出結果:
使用單引號看起來也能夠完畢相同的任務:
這些方法看起來相思,但各有一些特殊用途和副作用,看看以下這行命令:
看到命令列拋出一個錯誤,說不能帶有驚嘆號。因此,假設希望列印驚嘆號,那就不要將其放入雙引號中,或者你能夠在其之前加上一個特殊的轉移字元斜杠將驚嘆號轉移:
在使用帶單引號的echo時,Bash不會對單引號中的變數(如$var)求值,而僅僅是照原樣顯示
還有一個能夠列印的命令是printf,printf使用的參數和c語言中的printf函數一樣。如:
看到沒,printf列印出來的輸出是沒有帶換行的。
1.2.2補充內容:
列印彩色輸出。每種顏色都有相應的顏色碼,比方:重設=0,黑色=30,紅色=31,綠色=32,黃色=33,藍色=34,洋紅=35,青色=36,白色=37.要列印彩色文本,能夠輸入例如以下命令:
1.3 玩轉變數和環境變數
1.3.1 實戰演練
一個變數能夠通過下面方式進行賦值:
var=value
var是變數名,value是賦給變數的值,假設value不包括不論什麼空白字元,那麼它不須要使用引號進行引用,生殖,則必須使用單引號或雙引號。注意,var = value不同於var=value.把var=value改寫成var = value使用常見錯誤,但前者是賦值操作,後者則是相等操作。在變數名之前加上$首碼就能夠列印出變數的內容
var="value"
echo $var 或者echo ${var},能夠看到中,第一個命令是錯誤的,第二三個命令整錯列印出了變數內容:
我們也能夠在printf或echo命令的雙引號中引用變數值:
export命令用來環境變數設定。至此之後,從當前shell指令碼啟動並執行不論什麼程式都會繼承這個變數。我們能夠依照自己的須要,在啟動並執行應用程式或者shell指令碼中匯出特定變數。在預設情況下,有非常多標準環境變數可供shell使用。PATH就是當中之中的一個
$ echo $PATH
通常$PATH的值在/etc/environment或者/etc/profile或者~/.bashrc中定義。假設須要在PATH中加入一條新路徑,能夠使用:
export PATH=$PATH:/home/user/bin
1.3.2 補充內容:
擷取字串的長度,能夠使用以下的方法或者:
識別當前shell的版本號碼:
echo $SHELL 或者echo $0
改動Bash提示字串
當我們開啟一個終端或是執行一個shell,都會看到類似[email protected]:/home/$的提示字串。不同的GNU/Linux公布版本號碼中的提示及顏色也略有不同。我們能夠利用PS1環境變數來定製提示文本。預設的shell提示文本是在檔案~/.bashrc中的某一行設定的。能夠使用例如以下命令列出設定PS1的那一行:
假設要設定提示字串,能夠輸入:
PS1=">",例如以所看到的,提示符已經變成">"角括弧了,可是這種改動僅僅對當前的這個終端起作用,假設再新開一個終端或者電腦重新啟動,則會恢複到改動曾經的提示符。要想設定之後生效,就必須改動~/.bashrc中的值才幹夠。
1.4 通過shell進行數學運算
1.4.1 預備知識
再Bash shell環境中,能夠利用let,(())和[]運行主要的算術操作。而在進行進階操作時,expr和bc這兩個工具也會很實用。
1.4.2 實戰演練
能夠用普通的變數賦值方法定義數值,這時,它會被儲存為字串。然而,我們能夠用一些方法使它能像數字一樣進行處理,例如以所看到的:
當然還能夠進行變數的自增或者自減操作:
其他的算術操作方式:
bc是一個用於數學運算的進階工具,這個精密計算機包括了大量的選項。我們能夠藉助它運行浮點數運算並應用一些進階函數:
對設定bc參數的其他動作:
1.5 玩轉檔案描寫敘述符和重新導向
?1.5.1 預備知識
?我們在編寫指令碼的時候會頻繁使用標準輸入(stdin),標準輸出(stdout)和標準錯誤(stderr)。通過內容過濾將輸出重新導向到檔案是我們從事的基礎任務之中的一個。當命令輸出文本的時候,這些輸出文本有可能是錯誤資訊,也有可能是正常的(非錯誤的)輸出資訊。單靠查看輸出的文本本身,我們沒法區分哪些是正常的輸出文本,哪些是錯誤文本。只是,我們能夠通過檔案描寫敘述符來解決問題,將哪些與特定描寫敘述符關聯的文本提取出來。
?檔案描寫敘述符是與一個開啟的檔案或資料流相關聯的整數。檔案描寫敘述符0,1以及2是系統預留的。
? ?0-----------stdin(標準輸入)
? ?1-----------stdout(標準輸出)
? ?2-----------stderr(標準錯誤)
?1.5.2 實戰演練
? ?用以下的方法能夠將輸出文本重新導向或儲存到一個檔案裡:
? ?echo "This is a sample text 1" > temp.txt
? ?這樣的方法通過截取檔案方式,將輸出文本儲存到檔案temp.txt中,也就是說在把echo命令的輸出寫入檔案之前,temp.txt中的內容首先會被清空。
? ?接下來再看還有一個範例:
? ?echo "This is a sample text 2" >> temp.txt
? ?這樣的方法將會將文本追加到目標檔案裡。
? ?>和>>並不同樣。雖然這兩個操作符都能夠將文本重新導向到檔案,可是前者會先清空檔案,再寫入內容,而後者將內容追加到現有檔案的尾部。
? ?
? ?來看看什麼是標準錯誤以及怎樣對它重新導向。當命令輸出錯誤資訊時,stderr資訊就會被列印出來。看看以下的範例:
? ?
這裡,+是一個非法參數,因此將返回錯誤資訊。注意:當一個命令錯誤發生並退回時,它會返回一個非0的退出狀態;而當命令成功完畢後,它會返回數字0,退出狀態能夠從特殊變數$?中獲得(在命令執行之後立馬執行echo $?,就能夠列印出退出狀態)
? ?接下來,我們不讓錯誤列印資訊在終端,而是存入一個檔案裡:
? ?注意命令是ls + 2>out.txt。錯誤資訊輸出到out.txt中
? ?我們也能夠將標準輸出和標準錯誤資訊一同來運行到同一個命令中:
? ?能夠看到,錯誤資訊和標準輸出被輸出到不同的檔案其中了。還能夠通過例如以下的命令將stderr轉換成stdout,使得stderr和stdout都被重新導向到同一個檔案裡:
? ?cmd 2>&1 output.txt 或者cmd &> output.txt。有時候,在輸出中可能包括一些不必要的資訊。假設你不想讓終端中充斥著有關stderr的繁枝末節,那麼你能夠將stderr的輸出重新導向到/dev/null,保證一切都會被清除的乾乾淨淨。假設我們有三個檔案,各自是a1,a2,a3。可是普通使用者對檔案a1沒有“讀-寫-運行”許可權。假設你須要列印檔案名稱以a起始的全部檔案的內容,你能夠使用cat命令:
? ?能夠看到,a1檔案已經沒有不論什麼許可權,可是由於我是用root使用者登入,所以還是能夠讀內容的,假設其他使用者讀取a1,則會報錯,這時我們就能夠使用標準錯誤輸出來捕獲錯誤輸出,然後輸出其他檔案的內容:
? ?
?1.5.3 補充內容? ? ?
? ?從stdin讀取輸入的命令能以多種方式接受資料。另外,還能夠用cat和管道來制定我們自己的檔案描寫敘述符,比如:
? ?cat file | cmd
? ?cmd1 | cmd2
? ?將檔案重新導向到命令:
? ?cmd < file
(linux shell)第一章--小試牛刀(上)