輕鬆學習之Linux教程五 認識與學習bash

本系列文章由@超人愛因斯坦出品,轉載請註明出處。  

         文章鏈接:

         http://hpw123.net/a/Linux/Linuxjichu/2014/1031/101.html

         作者:超人愛因斯坦    個人網站http://www.hpw123.net

    郵箱: [email protected]

       CSDN:http://blog.csdn.net/u010283694


在Linux的環境下,如果你不懂bash是什麼,那麼其他的東西就不用學了,因爲前面教程使用終端執行命令的方式,就是通過bash的環境處理的,所以它很重要,bash的東西很多,包括變量的設置與使用,bash操作環境的構建,數據流重定向的功能,還有好用的管道命令。


好了,讓我們進入主題吧:


一.硬件、內核與shell



二.bash shell的功能


命令記憶能力(history)

命令與文件補全功能([Tab]按鍵的好處)

命令別名設置功能(alias)

作業控制、前臺、後臺控制(job control, foreground, background

程序腳本(shell script


三.bash的環境配置文件


  • login與non-login shell

        login shell:取得bash時需要完整的登陸流程的,就稱爲login shell,舉例來說,你要由tty1~tty6登陸,需要輸入用戶的賬號密碼,此時取得的bash就稱爲“login shell”

        non-login shell:取得bash接口的方法不需要重複登陸的舉動,舉例來說,你以X Window登陸Linux後,在以X的圖形界面啓動終端機,此時那個終端接口並沒有需要再次輸入賬號與密碼,那個bash的環境就稱爲non-login shell了,你在原本bash環境下再次執行bash這個命令,同樣也沒有輸入賬號密碼,那第二個bash(子進程)也是non-login shell

  • /etc/profile(login shell纔會讀

           這是系統整體的設置,你最好不要修改這個文件,bash的login shell情況下所讀取的整體環境配置文件其實只有/etc/profile,但是/etc/profile還會調用其他的配置文件

  • ~/.bash_profile(login shell纔會讀

           bash在讀完了整體環境設置的/etc/profile並藉此調用其他配置文件,接下來會讀取用戶的個人配置文件,分別是~/.bash_profile  ~/.bash_login  ~/.profile  其實bash的login shell設置只會讀取三個文件中的一個,讀取順序依照我寫的順序,也就是說~/.bash_profile存在,那麼其他兩個文件不論是否存在,都不會被讀取

  • source:讀入環境配置文件的命令

           如果你將自己的設置寫入了/etc/profile或~/.bash_profile通常都是註銷後再登陸後改設置纔會生效,那麼能不能直接讀取配置文件二不註銷呢?哈哈,可以的,使用source就ok了,如source /profile

  • ~/.bashrc(non-login shell會讀

            當你取得non-login shell 時,該bash配置文件僅會讀取~/.bashrc而已

  • 其它相關配置文件

            ~/.bash_history   ~/.bash_logout 想了解這些的朋友可以自行百度啦,百度功底是需要慢慢培養地呢。



  • bash默認組合鍵



四.通配符與特殊符號




五.數據流重定向


大家要問,爲何要使用命令輸出重定向?

  • 屏幕輸出的信息很重要,而且我們需要將它存下來的時候;
  • 後臺執行中的程序,不希望它干擾屏幕正常的輸出結果時;
  • 一些系統的例行命令(例如寫在/etc/crontab中的文件)的執行結果,希望它可以存下來時;
  • 一些執行命令的可能已知錯誤信息時,想以“2>/dev/null”將它丟掉時;
  • 錯誤信息與正確信息需要分別輸出時。

如何進行重定向?

  1. 標準輸入(stdin):代碼爲0,使用<或<<;
  2. 標準輸出(stdout):代碼爲1,使用>或>>;
  3. 標準錯誤輸出(stderr):代碼爲2,使用2>或>>

  • 1>:以覆蓋的方法將正確的數據輸出到指定的文件或設備上;
  • 1>>:以累加的方法將正確的數據輸出到指定的文件或設備上;
  • 2>:以覆蓋的方法將錯誤的數據輸出到指定的文件或設備上;
  • 2>>以累加的方法將錯誤的數據輸出到指定的文件或設備上;


//將 stdout 與 stderr 分存到不同的文件去
[hpw@hpw-Lenovo-Erazer-Z500:~]$ find /home -name .bashrc > list_right 2> list_error
/dev/null垃圾桶黑洞設備與特殊寫法



//將錯誤的數據丟棄,屏幕上顯示正確的數據 
[hpw@hpw-Lenovo-Erazer-Z500:~]$ find /home -name .bashrc 2> /dev/null /home/dmtsai/.bashrc <==叧有 stdout 會顯示刡屏幕上, stderr 被丟棄了


standard input:<與<<


//用 stdin 替代鍵盤的輸入以建立新檔案的簡單流程 
[hpw@hpw-Lenovo-Erazer-Z500:~]# cat > catfile < ~/.bashrc 
[hpw@hpw-Lenovo-Erazer-Z500:~]# ll catfile ~/.bashrc -rw-r--r-- 1 root root 194 Sep 26 13:36 /root/.bashrc-rw-r--r-- 1 root root 194 Feb 6 18:29 catfile 
// 注意看,這兩個檔案的大小會一模一樣!幾乎像是使用 cp 複製一般!
如果我要用cat直接將輸入的信息輸出到catfile中,且當由鍵盤輸入eof時,該次輸入就結束,那我可以這樣做
[hpw@hpw-Lenovo-Erazer-Z500:~]#cat > catfile << "eof"
> This is a test. 
> OK now stop 
> eof <==輸入這關鍵詞,立刻就結束而不需要輸入 [ctrl]+d 
[hpw@hpw-Lenovo-Erazer-Z500:~]# cat catfile 
This is a test. OK now stop <==叧有這兩行,不會存在關鍵詞那一行!


五.命令執行的判斷依據: ;  &&  ||

哈哈,如果我想一次輸入多個命令去執行那該怎麼辦啊

在命令與命令中間利用分號(;)來隔開,這樣一來,分號前的命令執行完後就會立刻接着執行後面的命令啦,這真是方便啊,如果前一個命令是否執行成功與後一個命令是否要執行有關,那就得動用到&&和||啦


六.管道命令(pipe)

符號|         解析:管道符左邊命令的輸出就會作爲管道符右邊命令的輸入

管道命令流程


1.選取命令:cut,grep

[root@www ~]# cut -d'分隔字符' -f fields <==用於有特定分隔字符 
[root@www ~]# cut -c 字符區間 <==用於排列整齊的信息 
選項參數: 
-d :後面接分隔字符。與-f 一起使用; 
-f :依據 -d 的分隔字符將一段信息分割成爲數段,用 -f 取出第幾段得意思; -c :以字符 (characters) 的單位取出固定字符區間;

[root@www ~]# grep [-acinv] [--color=auto] '搜尋字符串' filename 
選項參數: 
-a :將 binary 文件以 text 文件方式搜尋數據 
-c :計算找到 '搜尋字符串' 的次數 
-i :忽略大小寫的不同,所以大小寫規爲相同 
-n :順便輸出行號 -v :反向選擇,亦即顯示出沒有 '搜尋字符串' 內容的那一行! 
--color=auto :可以將找到的關鍵詞部分加上顏色的顯示喔!

2.排序命令:sort,wc,uniq

[root@www ~]# sort [-fbMnrtuk] [file or stdin] 
選項參數: 
-f :忽略大小寫的差異,例如 A 與a 視爲編碼相同; 
-b :忽略最前面的空格符部分; 
-M :以月份的名字排序,例如 JAN, DEC 等等的排序方法; 
-n :使用『純數字』進行排序(默認是以文字型態排序的);
-r :反向排序; 
-u :就是 uniq ,相同的數據中,僅出現一行代表; 
-t :分隔符,預謳是用 [tab] 鍵分隔; 
-k :以那個區間 (field) 來進行排序的意思

[root@www ~]# uniq [-ic] 
選項參數: 
-i :忽略大小寫字符的不同; 
-c :進行計數

[root@www ~]# wc [-lwm] 
選項參數: 
-l :僅列出行; 
-w :僅列出多少字(英文單字); 
-m :多少字符;

3.雙向重定向:tee

[root@www ~]# tee [-a] file 
選項參數: -a :以累加 (append) 的方式,將數據加入 file 當中!
//不加a是以覆蓋的方式


4.字符轉換命令:tr,col,join,paste,expand

[root@www ~]# tr [-ds] SET1 ... 
選項參數: 
-d :刪除信息當中的 SET1 這個字符串; 
-s :替代掉重複的字符!

[root@www ~]# col [-xb] 
選項參數: 
-x :將 tab 鍵轉換成對等的空格鍵 
-b :在文字內有反斜槓 (/) 時,僅保留反斜槓最後接的那個字符

[root@www ~]# join [-ti12] file1 file2 
選項參數: 
-t :join 默認以空格符分隔數據,並且比對『第一個字段』的數據, 如果兩個檔案相同,則將兩筆數據聯成一行,且第一個字段放在第一個! 
-i :忽略大小寫的差異; 
-1 :這個是數字的 1 ,代表『第一個文件要用那個字段杢來分析』癿意思; 
-2 :代表『第二個文件要用那個字段來分析』癿意思。

[root@www ~]# paste [-d] file1 file2 
選項參數: 
-d :後面可以接分隔字符。預設是以 [tab] 來分隔的! 
- :如果 file 部分寫成 - ,表示來自 standard input 的資料的意思。

[root@www ~]# expand [-t] file 
選項參數: 
-t :後面可以接數字。一般來說,一個 tab 按鍵可以用 8 個空格鍵替代。 我們也可以自行定義一個 [tab] 按鍵代表多少個字符呢!


[root@www ~]# split [-bl] file PREFIX 
選項參數: 
-b :後面可接欲分割成的文件大小,可加單位,例如 b, k, m 等; 
-l :以行數來進行分割。 
PREFIX :代表前導符的意思,可作爲分割文件前導文字。

5.參數代換:xargs

[root@www ~]# xargs [-0epn] command 
選項參數: 
-0 :如果輸入的 stdin 中有特殊字符,例如 `, \, 空格鍵等等字符時,這個 -0 參數 可以將他還原成一般字符。這個參數可以用於特殊狀態喔! 
-e :這個是 EOF (end of file) 的意思。後面可以接一個字符串,當 xargs 分析到這個字符串時,就會停止繼續工作! 
-p :在執行每個指令的 argument 時,都會詢問使用者的意思; 
-n :後面接次數,每次 command 指令執行時,要使用幾個參數的意思。


6.關於減號-的用途

在管線命令當中,常常會使用到前一個指令的 stdout 作爲這次的 stdin , 某些指令需要用到文件名 (例如 tar) 來進行處理時,該 stdin 不 stdout 可以利用減號 "-" 來替代, 舉例來說:

[root@www ~]# tar -cvf - /home | tar -xvf -

上面這個例子是說:『我將 /home 裏面的文件給他打包,但打包的數據不是記錄到文件,而是傳送到stdout; 經過管線後,將 tar -cvf - /home 傳送給後面的 tar -xvf - 』。後面的這個 - 則是取用前一個指令的 stdout, 因此,我們就不需要使用 file 了!這是最常見的例子喔!注意注意!

                                                                     ——————————超人愛因斯坦於2014年11月1日更新



ok,今天的內容大概就是這些,如果有什麼寫的不對的,求大神指正,我們下篇文章見:)

呵呵,讓我們輕鬆一下吧    美圖



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章