Linux之認識和學習Bash

硬件、內核與shell

我們必須要通過“shell”將我們輸入的命令與內核通信,好讓內核可以控制硬件來正確無誤地工作。

操作系統其實是一組軟件,由於這組軟件在控制整個硬件與管理系統的活動監測,如果這組軟件隨意被用戶操作,若用戶應用不當,將會使整個系統崩潰。

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

shell的好處:

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

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

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

  • /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文件內

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:代表第二個文件要用哪個字段來分析

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