BASH Shell 經常使用命令

1、命令別名(alias)shell

假如我須要知道這個目錄底下的全部檔案(包含隱藏檔)及全部的檔案屬性,那麼我就必需要下達 ls -al 這樣的指令列,有沒有更快的取代方式?使用命令別名!也就是說, lm 會等於 ls -al 這樣的一個功能你能夠在指令列輸入 alias 就能夠知道目前的命令別名有哪些了!也能夠直接下達命令來設定別名:bash

alias lm='ls -al'

2、變量設定規則spa

  1. 變量與變量內容以等號『=』來連結;命令行

  2. 等號兩邊不能直接接空格符;code

  3. 變量名稱只能是英文字母與數字,可是數字不能是開頭字符;排序

  4. 如有空格符可使用雙引號『 " 』或單引號『 ' 』來將變量內容結合起來,但需要特別留意,雙引號內的特殊字符能夠保有變量特性,可是單引號內的特殊字符則僅爲通常字符;索引

  5. 必要時須要以跳脫字符『 \ 』來將特殊符號(如Enter, $, \, 空格符, '等)變成通常符號;ip

  6. 在一串指令中,還須要藉由其它的指令提供的信息,可使用 quote 『 ` command` 』;字符串

  7. 若該變量爲擴增變量內容時,則需以雙引號及 $變量名稱如:『 "$PATH":/home』繼續累加內容;it

  8. 若該變量須要在其它子程序執行,則須要以 export 來使變量能夠動做,如『export PATH』;

  9. 一般大寫字符爲系統預設變量,自行設定變量可使用小寫字符,方便判斷(純粹依照使用者興趣與嗜好);

  10. 取消變量的方法爲:『unset 變量名稱』。

3、變量的有效範圍

變量的設定只在目前這個 shell 環境當中存在,在下個或者是在子程序中 ( 子 shell ) 將不會存在!要讓變量在下個程序也能夠繼續的使用,大概就是使用 export!此外,其實除了 shell 的父、子程序外,在腳本( scripts )的編寫當中,因爲有的軟件會使用到 2 個以上的 scripts 作爲一個完整的套件!也就是說,假如你有兩支程序,一支爲 scripts1.sh 以及 scripts2.sh ,而 scripts2.sh 會去引用 scripts1.sh 的變數,這個時候,你在 scripts1.sh 當中設定的變量請『千萬記得以 export 設定』,不然你的變量將沒法在兩個 scripts 之間互相被引用!當這個 scripts 執行完畢以後,剛剛在 scripts 當中設定的變量也就『失效了!』。

4、read命令

直接讀取用戶輸入的變量

[test @test test]# read name 
testing <==這個時候屏幕會等待使用者由鍵盤輸入 
[test @test test]# echo $name 
testing <==剛剛輸入的數據變成了變量的內容

5、array命令

[test @test test]# a[索引]=內容 
[test @test test]# echo ${a[索引]}  
[test @test test]# a[1]=4 
[test @test test]# a[2]=8 
[test @test test]# echo ${a[1]} ${a[2]} 
4 8

6、eval命令

功能說明:從新運算求出參數的內容。

語  法:eval [參數]

補充說明:eval可讀取一連串的參數,而後再依參數自己的特性來執行。

參  數:參數不限數目,彼此之間用分號分開。
 
1.eval命令將會首先掃描命令行進行全部的替換,再執行命令。該命令使用於那些一次掃描沒法實現其功能的變量。該命令對變量進行兩次掃描。這些須要進行兩次掃描的變量有時候被稱爲複雜變量。
2.eval也能夠用於回顯簡單變量,不必定時複雜變量。
NAME=ZONE
eval echo $NAME等價於echo $NAME
3.兩次掃描
test.txt內容:hello shell world!
myfile="cat test.txt"
(1)echo $myfile  #result:cat test.txt
(2)eval echo $myfile  #result:hello shell world!
從(2)能夠知道第一次掃描進行了變量替換,第二次掃描執行了該字符串中所包含的命令
4.得到最後一個參數
echo "Last argument is $(eval echo \$$#)"
echo "Last argument is $(eval echo $#)"

7、萬用字符與特殊字符

因爲在 bash 當中常會使用到一些萬用字符,與搭配特殊符號來將指令作更好的利用(例如最常提到的正規表示法 Regulare Express )!底下咱們列出一些經常使用的萬用字符與特殊符號:

符號 內容
* 萬用字符,表明一個或多個字符(或數字)
? 萬用字符,表明一個字母
# 批註,這個最常被使用在 script 當中,視爲說明!
\ 跳脫符號,將『特殊字符或萬用字符』還原成通常字符
| 分隔兩個管線命令的界定;
; 連續性命令的界定(注意!與管線命令並不相同)
~ 使用者的家目錄
$ 亦便是變量以前須要加的變量取代值
& 將指令變成背景下工做
! 邏輯運算意義上的『非』 not 的意思!
/ 路徑分隔的符號
>, >> 輸出導向,分別是『取代』與『累加』
' 單引號,不具備變量置換的功能
" 具備變量置換的功能!
` ` 兩個『 ` 』中間爲能夠先執行的指令!
(   ) 在中間爲子 shell 的起始與結束
[  ] 在中間爲字符的組合
{   } 在中間爲命令區塊的組合!
組合按鍵 執行結果
Ctrl + C 終止目前的命令
Ctrl + D 輸入結束(EOF),例如郵件結束的時候;
Ctrl + M 就是 Enter 啦!
Ctrl + S 暫停屏幕的輸出
Ctrl + Q 恢復屏幕的輸出
Ctrl + U 在提示字符下,將整列命令刪除
Ctrl + Z 『暫停』目前的命令

8、連續指令的使用方式

這裏須要再提幾個重要的信息,咱們剛剛上面提過說,兩個指令前後寫在一塊兒,能夠這樣寫:
 
command1; command2
 
利用分號『 ; 』來分隔,這個分號的意思,表明不論 command1 執行結果爲什麼,command2 都會被執行!那麼若是我是兩個相關的指令,第一個 command1 若是執行結果有錯誤,第二個就不被執行,能夠這樣作嗎?固然能夠,就使用下面兩個連結的咚咚:
 
command1 && command2
command1 || command2
 
還記得咱們以前的變量內容中,那個 ? 表明什麼嗎?沒錯,就是表明前一個執行的指令內容有沒有錯誤,若是有錯誤就回傳爲 1 ,沒有錯誤就回傳爲 0 ,你能夠經由 echo $? 來查詢得知。那麼 && 就是表明,當 command1 執行結果傳回值爲 0 的時候,也就是沒有錯誤訊息時,則 command2 纔會開始執行,而 || 偏偏相反,當 command1 有錯誤訊息時, command2 纔會執行!

9、命令重導向

a > b 表示將你目前的內容a重導向到b

除了這個 > 的符號以外,在 bash 命令執行的過程當中,主要有三種輸出入的情況,分別是:
標準輸入;代碼爲 0 ;或稱爲 stdin ;使用的方式爲 <
標準輸出:代碼爲 1 ;或稱爲 stdout;使用的方式爲 1>
錯誤輸出:代碼爲 2 ;或稱爲 stderr;使用的方式爲 2>

1> :是將正確的數據輸出到指定的地方去
2> :是將錯誤的數據輸出到指定的地方去

若是我須要將正確的數據和錯誤的數據分別輸出到不一樣的地方,能夠以下指定

[test @test test]# find / -name testing 1> list_right 2> /dev/null

若是須要寫到一個文件中

[test @test test]# find / -name testing 1> list 2> list  <==錯誤寫法

[test @test tset]# find / -name testing 1> list 2>&1    <==正確寫法

請特別留意這一點!同時寫入同一個檔案須要使用 2>&1 纔對!

10、管道命令(pipe)

 bash 命令執行的時候有輸出的數據會出現!那麼若是這羣數據必須要通過幾道手續以後才能獲得咱們所想要的格式,應該如何來設定?這就牽涉到管線命令的問題了( pipe ),管線命令使用的是『 | 』這個界定符號!

這個管線命令『 | 』僅能處理經由前面一個指令傳來的正確信息,也就是 standard output ( STDOUT ) 的信息,對於 stdandard error 並無直接處理的能力。

在每一個管線的部分都是『指令』呢!然後一個指令的輸入乃是由前一個指令的輸出而來的!底下咱們來談一談一些基本的管線命令指令介紹:

cut
語法:

[root @test /root ]# cut -d "分隔字符" [-cf] fields
參數說明:
-d  :後面接的是用來分隔的字符,預設是『空格符』
-c  :後面接的是『第幾個字符』
-f  :後面接的是第幾個區塊?
範例:
[root @test /root]# 
cat /etc/passwd | cut -d ":" -f 1 
將 passwd 這個檔案裏面,每一行裏頭的 : 
用來做爲分隔號,而列出第一個區塊!也就是姓名所在啦!
[root @test /root]# last | cut -d " " -f1  
以空格符爲分隔,並列出第一個區間! 
[root @test /root]# last | cut -c1-20 
將 last 以後的數據,每一行的 1-20 個字符取出來!

sort
語法:

[root @test /root ]# sort [-t 分隔符] [(+起始)(-結束)] [-nru] 
參數說明: 
-t 分隔符:使用分隔符來隔開不一樣區間,預設是 tab 
+start -end:由第 start 區間排序到 end 區間 
-n         :使用『純數字』排序(不然就會以文字型態來排序) 
-r         :反向排序 
-u         :相同出現的一行,只列出一次! 
範例: 
[root @test /root]# cat /etc/passwd | sort 
將列出來的我的帳號排序! 
[root @test /root]# cat /etc/passwd | sort -t: +2n 
將我的帳號中,以使用者 ID 來排序(以 : 來分隔,第三個爲 ID , 
但第一個代號爲 0 之故)
[root @test /root]# cat /etc/passwd | sort -t: +2nr 
反相排序囉!

wc
語法:

[root @test /root ]# wc [-lmw] 
參數說明: 
-l   :多少行 
-m   :多少字符 
-w   :多少字

uniq
語法:

[root @test /root ]# uniq 
參數說明: 
範例: 
[root @test /root]# last | cut -d" " -f1 | sort | uniq

tr
語法:

[root @test /root ]# tr [-ds] SET1 
參數說明: 
-d  :刪除 SET1 這個字符串 
-s  :取代掉重複的字符! 
範例: 
[root @test /root]# last | tr '[a-z]' '[A-Z]'         <==將小寫改爲大寫 
[root @test /root]# cat /etc/passwd | tr -d :       <==嘿嘿! : 這個符號在 /etc/passwd 中不見了! 
[root @test /root]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM   <==將 DOS 檔案的字尾符號 ^M 的符號去除!

split
語法:

[root @test /root ]# split [-bl] 輸入檔案 輸出檔案前導字符 
參數說明: 
-b  :以檔案 size 來分 
-l  :以行數來分 
範例: 
[root @test /root]# split -l 5 /etc/passwd test   <==會產生 testaa, testab, testac... 
等等的檔案

管線命令在 bash 的連續的處理程序中是至關重要的!另外,在 log file 的分析當中也是至關重要的一環,因此請特別留意!

相關文章
相關標籤/搜索