Linux重要知識點彙總——認識和學習bash

硬件、內核與shell

咱們必需要經過「shell」將咱們輸入的命令與內核通訊,好讓內核能夠控制硬件來正確無誤地工做。shell

操做系統實際上是一組軟件,因爲這組軟件在控制整個硬件與管理系統的活動監測,若是這組軟件隨意被用戶操做,若用戶應用不當,將會使整個系統崩潰。編程

只要可以操做應用程序的接口都可以稱爲shell。狹義的shell指的是命令行方面的軟件。廣義的shell則包括圖形界面的軟件。數組

shell的好處:

  • 命令行界面的shell,你們都同樣
  • 遠程管理:命令行界面就是比較快
  • 管理系統的關鍵

系統的合法shell與/etc/shells功能

目前的Linux可使用的shell(/etc/shells文件):bash

  • /bin/bash(Bourne Again SHell,Linux默認的shell)
  • /bin/ksh(Kornshell由AT&T Bell lab發展出來,兼容於bash)
  • /bin/tcsh(整合C shell,提供更多的功能)
  • /bin/zsh(基於ksh發展出來,功能更強大)

用戶什麼時候取得shell工做以及用戶默認的shell記錄在/etc/passwd文件內ui

bash shell的功能

  • 命令記憶能力(history)
  • 命令與文件補全功能(【Tab】按鍵的好處)
  • 命令別名設置功能(alias)
  • 做業控制、前臺、後臺控制(job control, foreground, background)
  • 程序腳本(shell script)
  • 通配符(Wildcard)

bash shell的內置命令:type

瞭解命令是來自於外部命令(指的是其餘非bash所提供的命令)或是內置在bash當中操作系統

type [-tpa] name命令行

參數:設計

type:不加任何參數時,type會顯示出name是外部命令仍是bash內置命令排序

-t:type將name如下面這些字眼顯示出它的意義:繼承

file:表示位外部命令

alias:表示該命令爲命令別名所設置的名稱

builtin:表示內置命令

-p:若是後面接的name爲外部命令時,纔會顯示完整文件名

-a:會有PATH變量定義的路徑中,將全部含name的命令都列出來,包含alias

命令的執行

反斜槓(\)轉移字符

shell的變量功能

  • 變量的可變性與方便性
  • 影響bash環境操做的變量:PATH變量
  • 在進入shell以前,因爲系統須要一些變量來提供他數據的訪問(或者是一些環境的設置參數值,例如是否要顯示彩色等的),因此就有一些所謂的「環境變量」須要來讀入系統。爲了區別與自定義變量的不一樣,環境變量一般以大寫字符來表示
  • 腳本程序設計(shell script)的好幫手

變量的顯示與設置:echo,unset

變量的顯示echo

只須要在變量名稱前面加上$,或者是以${變量}的方式來顯示均可以。

設置或者修改變量的內容:用「等號(=)」鏈接變量與它的內容

在bash中,當一個變量名稱還沒有被設置時,默認的內容是「空」的。

變量的設置規則:

  • 變量與變量以一個等號「=」來鏈接
  • 等號兩邊不能直接接空格符
  • 變量名稱只能是英文字母與數字可是開頭字符不能是數字
  • 變量內容如有空格符可以使用雙引號或單引號將變量內容結合起來,可是雙引號類的特殊字符如$等,能夠保留本來特性;單引號類的特殊字符則僅爲通常字符(純文本)
  • 可用轉義字符「\」將特殊符號變成通常字符
  • 在遺傳命令中,還須要經過其餘的命令提供的信息,可使用反單引號「`命令`」或「$(命令)」。
  • 若該變量爲了增長變量內容時,則可以使用「$變量名稱」或${變量}累加內容
  • 若該變量須要在其餘子進程中執行,則須要以export來使變量變成環境變量
  • 一般大寫字符爲系統默認變量,自行設置變量可使用小寫字符方便判斷
  • 取消變量的方法爲使用「unset 變量名稱」

子進程:在目前這兒shell的狀況下,其打開另外一個新的shell,新的shell就是子進程。在通常狀態下,父進程的自定義變量是沒法在子進程內是使用的。但經過export將變量編程環境變量之後,就可以在子進程下面使用了。

環境變量的功能

用env(environment)查看環境變量與常見環境變量說明

HOSTNAME:這臺主機的主機名

TERM=這個終端機使用的環境是什麼類型

SHELL=目前這個環境下使用的shell是哪個程序

HISTSIZE=記錄命令的條數,在CentOS中默承認記錄1000筆

USER=用戶的名稱

LS_COLORS=一些顏色顯示

MAIL=和這個用戶取用的mailbox位置

PATH:執行文件命令查找路徑

INOUTERC=與鍵盤功能有關,能夠設置特殊按鍵

PWD=目前用戶所在的工做目錄

LANG=這個與語系相關

HOME=這個用戶的主文件夾

_=上一次使用的命令的最後一個參數(或命令自己)

RANDOM:「隨機數」變量,內容介於0~32767之間

用set查看全部變量(含環境變量與自定義變量)

HISTFILE=歷史命令記錄的放置文件,隱藏文件

MAILCHECK=每60秒去掃描一次信箱有無新信

PS1=命令提示符的設置值

PS2=使用轉義符號第二行之後的提示符

$目前這個shell所使用的PID

?剛纔執行完命令的回傳碼

通常來講,不管是否爲環境變量,只要跟目前這個shell的接口操做有關的變量,一般都會被設置爲大寫字符,也就是說,基本上,在Linux默認的狀況中,使用{大寫字符}來設置的變量通常爲系統內定須要的變量。

PS1(提示符的設置)

$(關於本shell的PID)

?(關於上個執行命令的回傳碼)

通常來講,若是成功執行命令,則會回傳一個0值,若是執行過程當中發生錯誤,就會回傳「錯誤代碼」,通常就是以非0的數值來替代

export:自定義變量轉成環境變量

環境變量與自定義變量的差別:該變量是否會被子進程所繼續使用

子進程僅會繼承父進程的環境變量,子進程不會繼承父進程的自定義變量

影響顯示結果的語系變量(locale)

locale

變量的有效範圍

環境變量能夠被子進程所引用,可是其餘的自定義變量內容就不會存在於子進程中

  • 當啓動一個shell,操做系統會分配一個記憶塊給shell使用,此內存類的變量可以讓子進程取用
  • 若在父進程利用一個export功能,可讓自定義變量的內容寫到上述記憶塊當中(環境變量)
  • 當加載另外一個shell時,子shell能夠將父shell的環境變量所在的記憶塊導入到本身的環境變量塊當中

變量鍵盤的讀取、數組與聲明:read,array,declare

read:讀取來自鍵盤輸入的變量

參數:

-p:接提示信息

-t:接等待的「秒數」

declare/typeset:聲明變量類型

參數:

-a:數組類型

-i:整型

-x:環境變量

-r:readonly類型,該變量不可被更改內容,也不能重設

在默認的狀況下,bash對於變量有幾個基本的定義:

  • 變量類型默認爲「字符串」
  • bash環境中的數值運算,默認最多僅能達到整數類型

與文件系統及程序的限制關係:ulimit

ulimit [-SHacdfltu] [配額]

參數:

-H:hard limit,嚴格的設置,一定不能超過這個設置的數值

-S:soft limit,警告的設置,能夠超過這個數值,可是若超過則有警告信息

-a:列出全部的限制額度

-c:當某些進程發生錯誤時,系統會將該進程在內存中的信息寫成文件(排錯用),這種文件就被稱爲內核文件(core file),此爲限制每一個內核文件的最大容量

-f:此shell能夠建立的最大文件容量(通常爲2GB)單位爲KB

-d:進程可以使用的最大斷裂內存(segment)容量

-l:用於鎖定(lock)的內存量

-t:可以使用的最大CPU時間

-u:單一用戶可使用的最大進程(process)數量

變量內容的刪除、替代與替換

命令別名設置:alias,unalias

歷史命令:history 【n】

history 【-c】

history 【-raw】 histfiles

參數:

n:數字,是要列出最近的n條命令行

-c:將目前的shell全部的history內容所有消除

-a:將目前新增的history命令新增入histfiles中,若沒有加histfiles,則默認寫入~/.bash_history

-r:將histfiles的內容讀到目前這個shell的history記憶中

-w:將目前的history記憶內容寫入histfiles中(默認爲~/.bash_history)

歷史命令在註銷時,會將最近的HISTSIZE條記錄到記錄文件當中

!number:執行第幾條命令

!command:有最近的命令向前搜尋命令串開頭爲command的那個命令,並執行

!!:執行上一個命令

Bash Shell的操做環境

路徑與命令查找的順序:

  1. 以相對/絕對路徑執行命令
  2. 由alias找到該命令執行
  3. 由bash內置的(builtin)命令來執行
  4. 經過$PATH這個變量的順序找到的第一個命令來執行

bash的登錄與歡迎信息:/etc/issue,/etc/motd

bash的環境配置文件

login與no-login shell

login shell:取得bash時須要完整的登錄流程,讀取/etc/profile(系統總體設置),~/.bash_profile或~/.bash_login或~/.profile(屬於用戶我的設置)

no-login shell:取得bash接口的方法不須要重複登陸的舉動,讀取~/.bashrc

source讀入環境配置文件

其餘相關配置文件

/etc/man.config:規定了使用man的時候man page的路徑到那裏去尋找

~/.bash_history:歷史命令記錄

~/.bash_logout:記錄註銷bash後系統完成的操做

終端機環境設置:stty,set

通配符與特殊符號

數據流重定向

執行一個命令的時候,這個命令可能會由文件讀入數據,再將數據輸出到屏幕上。

standard output:標準輸出,命令執行所回傳的正確信息

standard error output:標準錯誤輸出,命令執行失敗後,所回傳的錯誤信息

數據流重定向能夠將standard output(簡稱stdout)與standard error output(簡稱stderr)分別傳送到其餘的文件或設備去,分別傳送所用的特殊字符以下:

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

1>:以覆蓋的方法將正確的數據輸出到指定的文件或設備上

1>>:以累加的方法將正確的數據輸出到制定的文件或設備上

/dev/null垃圾桶黑洞設備與特殊寫法

若是知道錯誤將要發生,將錯誤信息忽略掉而不顯示或存儲

將錯誤和正確的數據統統寫入一個文件:2>&1也能夠是&>

standard input:<與<<

將本來須要由鍵盤輸入的數據改由文件內容替代

<<表明結束輸入的意思

使用命令輸出重定向的緣由:

  • 屏幕輸出的信息很重要,並且須要將它存下來
  • 後臺執行中的程序,並不但願它干擾屏幕正常的輸出結果
  • 一些系統的例行命令的執行結果,但願它能夠存下來時
  • 一些執行命令的可能已知錯誤信息時,想以「2>/dev/null」將它丟掉時
  • 錯誤信息與正確信息須要分別輸出時

命令執行的判斷依據:

cmd;cmd(不考慮命令相關性的連續命令執行)

$? (命令回傳碼)與&&或||

cmd1 && cmd2:若cmd1執行完畢且正確執行($?=0),則開始執行cmd2

cmd1 || cmd2:若cmd1執行完畢且正確執行($?=0),則cmd2不執行

通常來書,假設判斷式有三個:cmd1 && cmd2 || cmd3,cmd2和cmd3會放置確定能夠執行成功的命令

管道命令(pipe)

管道命令「|」僅能處理經由前面一個命令傳來的正確信息,也就是standard output的信息,對於standard error output並無直接的處理能力。

在每一個管道後面接的第一個數據一定是「命令」,並且這個命令必需要能接受standard input的數據才行

選取命令:

cut:將一段信息的某一段「切」出來,處理的信息是以「行」爲單位

cut –d ‘分隔字符’ –f fields(取出第幾段)

cut –c 字符範圍(以字符的單位去除固定字符區間)

grep:分析一行信息,若當中有須要的信息,就將該行拿出來

grep [-acinv] [—color=auto] ‘查找字符串’filename

參數:

-a:將binary文件以text文件的方式查找數據

-c:計算找到‘查找字符串’的次數

-i:忽略大小寫

-n:輸出行號

-v:反向選擇,即顯示沒有‘查找字符串’內容的哪一行

--color=auto:將找到的關鍵字部分加上顏色顯示

排序命令:

sort:排序命令,依據不一樣的數據類型排序

uniq:將重複的數據僅列出一個顯示

wc:文件裏面的字數,行數和字符數

雙重定向:tee

同時將數據流送與文件與屏幕(screen);而輸出到標準屏幕的,其實就是stdout,可讓下個命令繼續處理

tee –a file:以累加的方式,將數據加入file中

字符轉換命令:

tr:刪除一段信息當中的文字,或者是進行文字信息的轉換

tr [-ds] set1

參數;

-d:刪除信息當中的set1這個字符串

-s:替換掉重複的字符

col [-xb]

參數:

-x:將tab鍵換成對等的空格鍵

-b:在文字內有反斜槓(/)

col常常被利用於將man page轉存爲純文本文件以方便查閱的功能

join,將兩個文件當中有相同數據的那一行加在一塊兒

join [-ti12] file1 file2

參數:

-t:join默認以空格符分隔數據,而且對比「第一個字段」的數據

-i:忽略大小寫

-1:表明第一個文件要用哪一個字段來分析

-2:表明第二個文件要用哪一個字段來分析

相關文章
相關標籤/搜索