Linux中shell基礎、重定向、管道符、環境變量


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 當前目錄/工作目錄名
MAIL 用戶的郵箱路徑名
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文件里。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM