shell是一個程序,可以稱之為殼程序,用於用戶與操作系統進行交互。用來區別與核,相當於是一個命令解析器,Shell有很多中,這裡列出其中幾種
- Bourne SHell(sh)
- Bourne Again SHell(bash)
- C SHell(csh)
- KornSHell(ksh)
- zsh
各個shell的功能都差不太多,在某些語法的下達下面有些區別,Linux預設就是bash。這裡主要介紹bash
bash命令是sh命令的超集大多數sh腳本都可以在bash下運行,bash主要有如下這些功能
bash中變量有兩種,分別是環境變量和自定義變量,可以理解為全局變量和局部變量,在理解他們的區別前,需要知道副程序和子程序,舉個例子,當前的bash我們稱之為父程序,而在這個bash下執行的任何程序,都稱之為子程序。那全局變量和局部變量的區別就是,全局變量在子程序中仍然有效,局部變量只在當前程序中生效。(注意,一旦退出父程序這個bash的話,無論是全局變量還是局部變量都失效了,再次打開bash時,該變量是不存在的)
變量范圍
變量的設定有幾個規則,這裡列舉如下:
- 設定變量通過=來鏈接,例如name=sujinzhou,兩邊不能有空格,如果有空格的話,需要用引號
- 變量名只能是英文名和數字,只能是英文開頭
- 如果變量內容被引號擴起來的話,雙引號和單引號是有區別的
- 雙引號裡面的特殊字符,會保持原有的特性。
- 單引號裡面的特殊字符,只會是字符
- 使用\將特殊字符轉換為一般字符
- 使用“這個符號擴起來的命令會先計算這個命令裡面的內容,這個指令等價於$()
- 給原有的變量添加值時,使用
變量類型
bash中變量類型有兩種,一種是普通的字符串,一種是整數;設置變量的類型使用的是declare命令,delcare的命令格式如下
declare -[axir] variable
參數的意思:
- -a:將variable定義為數組
- -i:將後面的變量設置為整數類型
- -x:與export一樣,將後面的變量設置為環境變量
- -r:將後面的變量設置為只讀變量
如果declare命令沒有接任何變量的話,則表示顯示所喲的
定義數組
var[index]=content
刪除變量使用如下命令
- unset 變量名
查看單個命令的內容,可以使用echo命令,使用echo $變量名就可以查看變量內容,另外如果要查看所有變量有3個命令,分別是如下幾個命令,每個命令又有區別。
- echo $變量名:用於顯示制定變量
- env:用來查詢環境變量,
- set:顯示shell變量,包括私有變量與用戶變量,不同的shell有不同的私有變量,在shell中設置變量之後,可以通過set查到
- export:顯示當前導出成用戶變量的shell變量,也是用來查詢環境變量的,shell的私有變量不會出現
在shell中設置的變量,無論是環境變量還是自定義變量,在bash中注銷登錄之後,就失效了。下次登錄時,是沒有這些變量的,如果想要這些變量永久生效,是需要下如配置文件的,bash在啟動時,會讀取這個配置文件,來設置當前shell的各種變量。shell分為兩種,分別是login shell和nonlogin shell,這裡先說login shell;login shell是需要輸入用戶名和密碼的,一般情況下,login shell在登錄之後,會去讀取兩個文件,來設置當前shell的環境變量,分別是
1. /etc/profile:這個配置文件是默認配置文件,是系統整體的設置
2. ~/.bash_profile或者~/.bash_login或者~/.profile:這個是用戶的自定義設置文件
shell在讀取/etc/profile中的文件之後,會去讀取用戶自定義的設置文件,按照順序讀取上文中所說的自定義設置文件,只要找到其中任何一個,就不再繼續。在用戶自定義的配置文件中,都會調用~/.bashrc這個文件,來配置當前的這個shell
/etc/profile或者~/.bash_profile都是在登錄的時候才去讀取,如果將自己的一些設置到這些文件之後,一般都需要重新登錄一次shell才會生效,也可以使用source這個命令,來讀取配置文件的內容到當前的這個shell
數據重導向,表示將數據從一個地方導向到另外一個地方,在linux的bash中,有兩種輸出,分別是
標准輸出:輸出在屏幕當中的正常的提示信息,或者正常的返回值 錯誤輸出:命令執行出錯時,顯示在屏幕當中的出錯信息有時候,我們需要將標准輸出或者錯誤輸出保留到某個文件中,方便以後你查詢,這種情況下,就需要數據流重導向,也就是將輸出到屏幕的信息導向到一個文件中。而導向又分為標准輸出導向和錯誤輸出導向
標准輸出重導向:代碼為1,使用>或者>> 錯誤輸出重導向:代碼為2,使用2>或者2>>在linux中一個特殊的裝置,是/dev/null,所有將導向到這個裝置的數據都會被丟棄,相當與刪除數據。
有時候,我們需要將標准輸出和錯誤輸出導出到文件中,則可以使用符號 2>&1,這個符號是連在一起的,表示將錯誤和標准輸出一起輸出。
除了輸出之外,還有輸入,
- 標准輸入重導向:代碼為0,使用<
某些由鍵盤輸入的數據,可以使用標准輸入重導向,從文件中輸入數據。
常用的關系命令有如下幾個,具體的用法可以查詢man文件
- 選擇命令
- cut
- grep
- 排序命令
- sort
- wc
- uniq
- 雙向重導向
- tee
- 字符轉換命令
- tr
- col
- join
- paste
- expand
- 分割命令
- split
命令別名
alias //顯示所有的命令別名 alias rm='rm -i' //設置命令別名 unalias rm //刪除命令別名
歷史命令
使用history命令,可以顯示當前shell的內存中保存的歷史記錄命令,這裡每個shell的歷史記錄命令是獨立的,bash在退出的時候會自動將內存中的歷史命令寫入到histfiles中,也可以手動將當前shell內存中的歷史命令同步回histfiles中,如果想從當前shell A讀取另一個shell B中的歷史命令了,需要在B這個Shell中先使用命令history -w將內存中的命令寫入到histfiles中,然後在A這個shell中使用history -r來將histfiles中的命令讀取到內存中
history n //顯示最近的n筆命令的意思 history -c //將shell中所有的history命令全部刪除 history -a //將目前新增的指令加入到histfiles中,如果不存在,則加入到~/.bash_history中 history -w //將內存中的history指令保持到histfile中 history -r //將histfile中的指令讀取到這個shell中
歷史命令的讀取與記錄如下:
當使用bash登錄後,去~/.bash_history中讀取歷史命令 注銷當前bash時,會將最近的HISTFILESIZE筆命令更新到~/.bash_history中,也可以使用history -w命令來強制更新可以使用!來執行歷史命令,如下:
!2 //執行歷史命令中的第二個命令 !command //從最見的命令往前搜,查找以command開頭的命令 !! //執行上一個指令