1、什么是shell
Shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口(命令解釋器)。它接收用戶輸入的命令並把它送入內核去執行。起着協調用戶與系統的一致性和在用戶與系統之間進行交互的作用。
Shell在Linux系統上具有極其重要的地位
2、命令解釋過程
Shell可以執行:內部命令、應用程序、shell腳本
3、Shell的種類
常見的各種版本的shell:
Bash(Bourne Again Shell) | bash是大多數Linux系統的默認Shell。bash與bsh完全向后兼容,並且在bsh的基礎上增加和增強了很多特性。bash也包含了很多C Shell和Korn Shell中的有點。bash有很多靈活和強大的變成接口,同時又有很友好的用戶界面。 |
Ksh(Korn Shell) | Korn Shell(ksh)由Dave Korn所寫。它是UNIX系統上的標准Shell。在Linux環境下有一個專門為Linux系統寫的Korn Shell的擴展版本,即Public Domain Korn(pdksh) |
tcsh(csh 的擴展) | tcsh是C Shell的擴展。tcsh與csh完全向后兼容,但它包含了更多的使用戶感覺方便的新特性。其最大的提高是在命令行編輯和歷史瀏覽方面。 |
4、Linux的元字符
在Shell中有一些具有特殊意義的字符,稱為Shell 元字符(shell metacharacters)。
若不以特殊方式(使用轉義字符)指明,Shell 並不會把它們當作普通文字符使用。
字符 | 含義 | 字符 | 含義 |
' | 強引用 | *、?、! | 通配符 |
" | 弱引用 | <、>、>> | 重定向 |
\ | 轉義字符 | - | 選項標志 |
$ | 變量引用 | # | 注釋符 |
; | 命令分隔符 | 空格、換行符 | 命令分隔符 |
5、Bash的基本功能
歷史命令(history)
命 令:history 命令可以用來顯示曾執行過的命令,也可以根據顯示的治療來重新執行需要的命令
語 法:history(選項)(參數)
選 項:n 顯示n個最近的記錄
參 數:-a 添加記錄
-r 讀取記錄,但不會添加內容記錄
-w 覆蓋原有的history 文件
-c 清除記錄
-d<編號>[n] 刪除指定n條記錄
-n<文件> 讀取指定文件
-r<文件> 讀取文件但不記錄
-w<文件> 覆蓋原有文件
使用上下箭頭---調用以前的歷史命令
使用 "!n" 的方式---重復執行第n條歷史命令
使用 "!!" 的方式---重復執行上一條命令
使用 "!字符串" 的方式---重復執行最后一條以該字符串開頭的命令
使用 "!$" 的方式---重復執行上一條命令的最后一個參數
歷史命令存放在當前用戶家目錄下的 .bash_history 隱藏文件中。
.bash_history 文件存放命令是在系統退出時寫入的,在下次登錄后能查到上次操作所用到的命令。如果使用 history -w 表示將緩存中的命令立即寫入歷史文件中。
history 命令查看的歷史命令可以用 history -c 進行刪除,但是.bash_history 文件的內容是需要通過 vim 編輯器進入文件中刪除,或者使用重定向刪除(echo > /root/.bash_history )。
bash中常用的快捷鍵
移動:
Ctrl+A: 移動到當前編輯的命令行首
Ctrl+E: 移動到當前編輯的命令行尾
Ctrl+F 或 -> :按字符右移(往命令行尾部方向,前移)
Ctrl+B 或 <- :按字符左移(往命令行尾部方向,后移)
Alt+F: 按單詞右移(往命令行尾部方向,前移)
Alt+B: 按單詞左移(往命令行尾部方向,后移)
編輯:
Ctrl+D:退出終端,等價於exit
Ctrl+U: 刪除光標左邊的所有字符串
Ctrl+K: 刪除光標右邊的所有字符串
Ctrl+L: 相當於clear命令---清屏
Ctrl+C: 強行終止當前操作
6、重定向
6.1、標准輸入輸出
執行一個shell 程序時通常會自動打開三個標准文件
標准輸入(STDIN,文件描述符為0):通常對應終端的鍵盤,也可以從其他文件或命令或者文件內容中輸入。
標准輸出(STDOUT,文件描述符為1):默認輸出到屏幕。
錯誤輸出(STDERR,文件描述符為2):默認輸出到屏幕
文件名稱(filename,文件描述符為3+)
進程將從標准輸入文件中得到輸入數據,將正常輸出數據輸出到標准輸出文件,而將錯誤信息送到標准錯誤文件中。進程使用文件描述符(file descriptors)來管理打開的文件。
6.2、輸入重定向
輸入重定向:是指不適用系統提供的標准輸入端口,進行重新的指定。換言之,輸入重定向就是不適用標准輸入端口輸入文件,二十使用指定的文件作為標准輸入設備。(重定向簡單理解就是使用 "<" 符來修改標准輸入設備) 4)輸入重定向
語法1:command < file
cat /etc/passwd 它是以鍵盤作為標准輸入設備,並將文件內容顯示到控制台
而輸入重定向 cat < /etc/passwd 是將passwd文件指定為輸如設備,並將內容顯示到控制台。
語法2:command << file
cat << file (這個字符串字符是任意的,沒有任何含義),他的作用是將file 字符之間的內容(document)作為輸入傳遞給cat 碰到file 將自動結束輸入,並將輸入的內容顯示出來;
語法3:cat /root/aa < a.txt >b.txt :將文件passwd輸入重定向到 a.txt,輸出重定向到 b.txt 文件
6.3、輸出重定向
在Linux中,默認的標准輸出設備是控制台(或稱為顯示器),用戶輸出的信息默認情況下都會顯示到控制台。
比如:cat /etc/aa.txt,它是使用控制台顯示內容。默認情況下,標准輸出設備是控制台,所以cat命令將文件信息輸出到控制台,但是,我們可以使用 ">" 修飾符修改標准輸出設備,使用指定的文件作為標准輸出設備,來顯示文件。輸出重定向的概念就出現了。
3.1、對於兩個終端 /dev/pts/0 /dev/pts/1
在設備 /dev/pts/0 給設備 /dev/pts/1 發出 Hello!,那么在 /dev/pts/1 設備上就能顯示 /dev/pts/0發過來的消息。
命令:echo Hello! > /dev/pts/1
使用重定向將查詢的文件信息發送到其他控制台,在其他控制台就能接收到信息。
3.2、標准輸出重定向(覆蓋)
命令:echo > aa
標准輸出重定向,先清空后寫入,如果文件不存在則創建,echo后面沒有接內容,則是清空文件。
3.3、標准輸出重定向(追加)
命令:echo "但是在冬季之后迎來的是春暖花開" >> aa
標准追加輸出重定向,想配置文件末尾追加內容
3.4、禁止覆蓋
如果在工作中,我們想要在文件中追加內容時 ">>",卻不小心寫入 ">" 就執行了,那么我們的我呢見就覆蓋了,這時候就需要禁止覆蓋了,命令:set -C
強制覆蓋 ">|"
禁止覆蓋命令:set -C ,解除禁制覆蓋命令:set +C
3.5、錯誤輸出從定向
命令:ls /root /error 1>a 2>b
將標准輸出和標准錯誤輸出從定向到不同文件
3.6、正確和錯誤都輸入到相同位置
命令:find /root -name "*.txt" &>ab
將標准輸出和標准錯誤輸出重定向到同一個文件,混合輸出
命令:cat a aa > ab
合並兩個文件內容至一個文件
3.7、重定向到空設備/dev/null
命令:ls /root /error >ab 2>/dev/null
空設備,即將產生的輸出丟掉
如果 /dev/null 設備被刪除
命令:rm -f /dev/null //刪除/dev/null設備
1、手動創建
命令:mkmod -m 666 /dev/null c 1 3
2、重啟自動創建
7、進程管道技術
管道操作符號 "|" 連接左右兩個命令,將右側的命令的標准輸出,交給右側命令的標准輸入
格式:cmd1 | cmd2 [...|cmdn]
將/etc/passwd 中的用戶按UID大小排序
命令:sort -t ":" -k3 -n /etc/passwd -r | head
命令:ip a|grep 'inet ' | awk '{print $2}' | awk -F "/" '{print $1}'
查看本地IP,打印以 "inet "開頭的行,以空格為分隔符截取第二段(默認以空格為分隔符),再以 "/" 為分隔符截取第一段。
7.1、tee 管道技術
功能:tee 指令會從標准輸入設備讀取數據,將其內容輸出到標准輸出設備,同時保存成文件或顯示。
命令:ip a|grep 'inet '|tee ip.txt | awk '{print $2}' | awk -F "/" '{print $1}'
將前一個程序產生的結果保存在指定文件中,並送至下一個程序。
7.2、參數傳遞 xargs
功能:將參數列表轉換成小塊分段傳遞給其他命令,讀入stdin的數據轉換為參數添加至命令行中,讓一些不支持管道的命令可以使用管道。
有些命令不支持管道技術,但是可以通過xargs來實現
8、shell 環境變量
1)環境變量定義shell的運行環境,保證shell 命令的正確執行;
2)Shell 用環境變量類確定查找路線、注冊目錄、終端類型、終端名稱、用戶名等;
3)所有環境變量都是全局變量(既可以傳遞給Shell 的子進程)。
8.1、常見的Shell 環境變量
變量名 | 含義 |
HOME | 用戶主目錄 |
LOGNAME | 登錄名 |
USER | 用戶名、與登錄名相同 |
PWD | 當前目錄/工作目錄名 |
用戶的郵箱路徑名 | |
HOSTNAME | 計算機的主機名 |
INPUTRC | 默認的鍵盤映像 |
SHELL | 用戶所使用的shell的路徑名 |
LANG | 默認語言 |
HISTSIZE | history所能記住的命令的最多個數 |
PATH | shell查找用戶輸入命令的路徑(目錄列表) |
PS1、PS2 | shell一級、二級命令提示符 |
8.2、查看環境變量
Linux中set、env和 export 都可以查看環境變量
1)set 命令顯示當前shell 的變量,包括當前用戶的變量,set 主要用來顯示shell 的參數和選項
2)env 命令顯示當前用戶的變量,env 用來再構建的幻劍中運行命令
3)export 命令顯示當前導出成用戶變量的shell 變量
每個shell 都有自己特有的變量(set顯示的變量),這個和用戶變量不同,當前用戶變量和你用什么shell 無關,不管你用神那么shell 都在,比如HOME、SHELL等這些變量;但是shell 自己的變量不同,不如BASH_ARGC、BASH等這些變量只有set 才會顯示,時bash特有的;export 不加參數的時候,顯示哪些變量被導出了用戶變量,因為一個shell自己的變量可以通過 export "導出"變成一個用戶變量。
8.3、Linux下環境變量的設置
8.3.1、新建 /root/test/aa.sh 文件,並賦於可執行權限
自定義命令腳本,只需要把腳本目錄添加到環境變量中,就可以在任意目錄下執行該腳本。
8.3.2、定義系統提示符的變量
PS1:定義系統提示符的變量
\d:顯示日期,格式為“星期 月 日”
\h:顯示簡寫主機名。默認主機名“localhost”
\t:顯示24小時制時間,格式為"HH:MM:SS"
\T:顯示12小時制時間,格式為"HH:MM:SS"
\A:顯示12小時制時間,格式為"HH:MM"
\u:顯示當前用戶名
\w:顯示當前所在目錄的完整名稱
\W:顯示當前所在目錄的最后一個目錄
\#:執行的第幾個命令
\$:提示符。如果時root用戶會顯示為"#",如果時普通用戶顯示"$"
如:PS1='[\u@\h \w]\$' //將W改成小寫
8.3.4、預定義變量
預定義變量 | 作用 |
$? | 最后一次執行的命令的返回狀態。如果這個變量的值為0, 證明上一個命令正確執行;如果這個變量的值為非0(具體時那個數, 由命令自己來決定),則證明上一個命令執行不正確了。 |
$$ | 當前進程的進程號(PID) |
$! | 后台運行的最后一個進程的進程號(PID) |
8.3.5、用戶工作環境
用戶登錄系統時,shell 為用戶自動定義唯一的工作環境並對該環境進行維護直至用戶注銷。該環境將定義如身份、工作場所和正在運行的進程的特性。這些特性由指定的環境變量值定義。
用戶工作環境分為登錄環境和非登錄環境:1、登錄環境是指用戶登錄系統時的工作環境,此時的shell 對登錄環境而言時主shell;2、非登錄環境是指用戶在調用子shell 時所使用的用戶環境。
設置用戶工作環境
對所有用戶驚醒設置:
/etc/profile
/etc/bashrc
只對當前用戶進行設置
~/.bash_profile
~/.bashrc
通常,個人bash 環境設置都定義在~/.bashrc文件里。