歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Bash功能與使用技巧

Bash功能與使用技巧

日期:2017/3/3 16:37:14   编辑:關於Linux

一個完整計算機的體系結構包括:硬件與軟件,而軟件又分為系統軟件與應用軟件,負責對硬件僅需管理與操作的是系統軟件的內核部分,用戶是無法與硬件或內核打交道的,用戶通過應用程序或部分系統軟件發出指令(可能是通過浏覽器發送一封郵件),這些指令會被翻譯並傳給內核,內核在得知用戶的需求後調度硬件資源來完成操作(比如,使用網卡發送數據包)。在Linux環境下,我們一般通過Shell來與內核交流,並最終實現我們想要使用計算機資源的目的。由於Linux的開放性特點,使得在Linux下對Shell的選擇也很多,CentOS 6.3系統中可以使用的Shell有/bin/sh、/bin/bash、/bin/tcsh、/bin/csh這幾種,/etc/shells文件說明了當前系統有哪些可用的Shell。不同的Shell有不同的特點以及操作方式,我們這裡以CentOS默認使用的Shell為講解案例即Bash。

1.2 BASH功能介紹

1.2.1 命令歷史

Bash擁有自動記錄命令歷史的功能,用戶所執行的命令會在注銷時自動記錄到自己家目錄下的.bash_history 這樣一個隱藏文件中。查看這些命令歷史記錄的方法有很多,可以通過直接打開文件來查看,也可以通過鍵盤的上下鍵來上翻或下翻歷史記錄,還可以通過history命令查看歷史記錄,所有的命令歷史都有記錄編號。命令歷史能夠記錄的信息數量由HISTSIZE變量所決定,CentOS 6.3默認通過/etc/profile文件定義了HISTSIZE=1000,也就是最多可以記錄最近所使用的1000條命令,當有第1001條命令執行時第一條命令會被覆蓋,執行history -c命令可以清空所有的歷史記錄。

記錄命令歷史的除了可以查看歷史記錄外,還可以在需要時直接調用歷史記錄再次執行該命令:

1.上下鍵翻閱歷史命令,找到合適的命令後直接回車即可執行。

2. 輸入!string調用命令歷史(string為關鍵字),如!vim將調用最後一次執行的以vim開頭的命令。或者通過!n來准確定位歷史記錄,如!242將直接調用命令歷史的第242條記錄並執行。

3. 通過Ctrl+r快捷鍵打開搜索功能,接著輸入關鍵字即可在命令歷史中搜索相關命令,回車完成執行操作。如果沒有搜索到適合的命令按ESC鍵退出搜索。

1.2.2 命令別名

在CentOS 6.3系統中我們可以直接使用ll命令來顯示文件的詳細信息,其實系統中並沒有ll這樣一個命令,它僅是被提前定義好的一個別名而已,別名的好處是可以把本來很長的指令簡化縮寫,為常用且復雜的命令及選項創建別名可以大大提高日常工作效率。

[root@centos6 ~]# alias                           #查看系統當前所有別名    
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
[root@centos6 ~]# alias h5=’head -5’              #定義新的別名    
[root@centos6 ~]# unalias h5                      #取消別名定義

1.2.3 管道與重定向

Bash的標准輸入設備是鍵盤、鼠標、手寫板等設備,標准輸出為顯示器,一般我們通過鍵盤輸入命令並執行,系統將返回信息顯示在屏幕上,默認不管是正確的還是錯誤的信息都將輸出至顯示器。標准輸入的文件描述符為0,標准輸出的文件描述符為1,錯誤輸出的文件描述符為2。但有時我們需要改變這樣的標准輸入與輸出方式,Linux中我們可以使用重定向符(<、>、<<、>>、|)重新定義輸入與輸出。

管道使得我們可以將多條命令連接在一起使用,它的作用是將一個命令的標准輸出重定向給下一個命令並作為該命令的標准輸入。例如,使用ifconfig eth0 | grep ‘inet addr’命令過濾包含IP地址的行,ifconfig本身會輸出大量網絡接口的信息,由於這裡使用了管道符號(|)所以ifconfig命令的所有輸出都將作為grep命令的輸入內容,最終實現過濾包含IP地址的行。

對於標准的輸出信息是輸出至顯示器,而有時你可能並不需要這些輸出信息,又或者是暫時不需要在屏幕上看到這些信息;另外對於輸入一般是通過鍵盤輸入,而有時你或許希望可以從文件中讀取輸入信息。輸出重定向可以使用>或>>符號,使用>可以將輸出導入至文件,如果文件不存在則創建該文件,如果文件已經存在則會覆蓋該文件的內容;而使用>>可以將輸出追加至文件;另外,對應錯誤信息的重定向需要使用2>或2>>符號實現。輸入重定向可以使用<符號,它可以可以幫助我們從文件中提取輸入信息。

以下通過幾個簡單的實例演示重定向的使用方法:

[root@centos6 ~]# rpm -qa |grep gcc                    #查詢計算機中是否安裝了gcc軟件    
[root@centos6 ~]# echo “pass” | passwd --stdin tom    #設置tom的密碼為pass    
[root@centos6 ~]# ls                                   #查看當前文件列表    
anaconda-ks.cfg    install.log        install.log.syslog    
[root@centos6 ~]# ls > list.txt                        #將輸出保存至list.txt,屏幕無輸出    
[root@centos6 ~]# hostname >> list.txt                 #將主機名追加至list.txt文件末尾    
[root@centos6 ~]# mail -s test [email protected] < list.txt #發送郵件,郵件內容來自文件    
[root@centos6 ~]# ls -l abc install.log                #查看文件詳細信息,abc並不存在    
ls: cannot access abc: No such file or directory    
-rw-r—r--. 1 root root 9064 Dec 4 09:30 install.log    
[root@centos6 ~]# ls -l abc install.log 2> error.txt   #僅將錯誤重定向,不影響正確輸出    
-rw-r—r--. 1 root root 9064 Dec 4 09:30 install.log    
[root@centos6 ~]# ls -l abc install.log > all 2>&1     #標准輸出與錯誤輸出均導入至all    
[root@centos6 ~]# ls -l abc install.log >> all 2>&1    #標准輸出與錯誤輸出均追加至all    
[root@centos6 ~]# ls -l abc install.log &> all         #標准輸出與錯誤輸出均導入至all

1.2.4 快捷鍵

Bash准備了大量的快捷鍵為用戶使用,熟練掌握這些快捷鍵的全部或部分會使你在工作中受益頗多,開始的時候你可能需要花費大量的時間來記憶這些快捷鍵,但一旦你記住了他們,你的工作效率會直線上升。下面列出了常用的快捷鍵及其功能描述。

快捷鍵 功能描述

Ctral+a 光標移動至行首

Ctrl+e 光標移動至行尾

Ctrl+f 光標右移一個字符

Ctrl+b 光標左移一個字符

Ctrl+l 清屏,等同於clear命令

Ctrl+u 刪除光標至行首的字符

Ctrl+k 刪除光標至行尾的字符

Ctrl+c 終止進程

Ctrl+z 掛起進程(可以通過jobs命令查看掛起的進程)

Ctrl+w 刪除光標前一個單詞(以空格為分割符)

Alt+d 刪除光標後一個單詞

1.3 BASH使用技巧

1.3.1 重定向技巧

1.如果你編寫了一個腳本實現自動修改系統帳號的密碼,那麼默認當密碼修改成功後系統會提示successfully這樣的提示信息,如果需要修改20個賬戶密碼則顯示20條這樣的信息。像這樣的案例,大量的成功提示信息並不是我們關注的重點,管理員更多的是關心錯誤提示。所以這時可以考慮將標准正確輸出屏蔽,Linux中提供了一個特殊設備/dev/null,它很像太陽黑洞,任何東西往裡寫入都將永遠消失。對大量無意義的輸出信息可以通過管道導入至/dev/null設備。

[root@centos6 ~]# echo "pass" | passwd --stdin root >/dev/null

2.標准輸出與錯誤輸出分離重定向

很多時候自動運行的腳本編寫完成後,是要在深夜服務器負載最低時以無人職守方式運行的,那麼當管理員去檢查腳本運行情況時會希望看到哪些命令執行成功了,哪些命令出現了問題,並且為了方便管理需要將正確輸出與錯誤輸出分寫保存在兩個不同的記錄文件中,那麼分離重定向就顯得尤為重要了。下面我們檢查系統中是否存在tom用戶,如果存在則將tom相關信息記錄至user文件中,否則記錄至error文件中:

[root@centos6 ~]# id tom >> user 2>> error

2.1.1 命令序列

在Linux中我們可以使用控制字符(;、&&、||、&)來控制命令的執行方式。其中[&]控制符使得命令開啟一個子Shelll並在後台執行;使用[;]控制字符可以把多個命令組合,但多個命令之間沒有任何邏輯上的關系,僅按循序執行;使用[&&]控制字符也可以將多個命令組合,但僅當前一個命令執行成功後才會執行[&&]控制符後面的命令;[||]控制字符的作用與[&&]剛好相反,僅當前一個命令執行失敗才會執行[||]控制符後面的命令。下面通過實例演示。

1.火狐浏覽器通過前端啟動,使得當前Shell將暫時無法使用:

[root@centos6 ~]# firefox

2.後台運行浏覽器,不影響當前Shell的使用:

[root@centos6 ~]# firefox &

3.所有命令按順序執行(不管前面的命令是否成功,後面的命令一定正常執行):

[root@centos6 ~]# ls /tmp ; ls /root ; ls /home

4.如果某個文件存在則顯示該文件內容,否則報錯(僅當ls執行成功才會執行cat):

[root@centos6 ~]# ls test.txt && cat test.txt

5.如果有gedit編輯器則打開該程序,否則打開vim編輯器:

[root@centos6 ~]# gedit || vim

6.如果id tom執行成功則說明用戶存在屏幕將顯示Hi,tom,否則顯示No such user:

[root@centos6 ~]# id tom &>/dev/null && echo “Hi,tom” || echo “No such user”

實例5首先通過&>重定向符將id命令的所有輸出屏蔽,讓後使用&&與||來判斷id命令是否執行成功,成功就顯示問候語否則顯示沒有該用戶。

2.1.2 作業控制

Bash環境中通過命令開啟進程的時候使用&符可以使得該進程進入後台執行,或者一個命令執行後使用Ctrl+z快捷鍵可以將該進程放入後台並暫停執行,以後隨時使用jobs命令可以查看這些後台進程,並且會為每個這樣的進程分配一個編號,通過fg <編號>的形式可以將這些後台進程再次調回前台執行。

[root@centos6 ~]# firefox &

[root@centos6 ~]# jobs

[1]+ Running firefox &

[root@centos6 ~]# fg 1

2.1.3 花括號{}的使用

通過括號擴展可以生產命令行或腳本需要的字串,括號中可以包含連續的序列或使用逗號分割的多個項目,連續的序列包括一個起點與一個終點並使用..分割。接下來看看具體的語法格式案例:

[root@centos6 ~]# echo {a,b,c}

a b c

[root@centos6 ~]# echo user{1,5,8}

user1 user5 user8

[root@centos6 ~]# echo {0..10}

0 1 2 3 4 5 6 7 8 9 10

[root@centos6 ~]# echo {0..10..2}

0 2 4 6 8 10

[root@centos6 ~]# echo a{2..-1}

a2 a1 a0 a-1

[root@centos6 ~]# mkdir /tmp/{dir1,dir2,dir3}

[root@centos6 ~]# ls -ld /tmp/dir{1,2,3}

[root@centos6 ~]# chmod 777 /tmp/dir{1,2}

本文出自 “丁丁歷險” 博客,請務必保留此出處http://manual.blog.51cto.com/3300438/1131800

Copyright © Linux教程網 All Rights Reserved