一、認(rèn)識(shí)BASH
????BASH是目前Linux系統(tǒng)應(yīng)用最多的shell,也是大多數(shù)Linux系統(tǒng)默認(rèn)的shell.
shell是操作系統(tǒng)的接口,它的地位如下圖:

使用shell的幾個(gè)好處:
命令行界面的shell:大家都一樣。幾乎各家distribution使用的bash都是一樣的。這樣你可以隨意轉(zhuǎn)換不同的distribution。
遠(yuǎn)程管理:命令行較快。速度快而且不太會(huì)出現(xiàn)短線或者信息外流的問(wèn)題。
bash是GNU計(jì)劃中重要的計(jì)劃之一,目前也是distributions的標(biāo)準(zhǔn)shell。bash的優(yōu)點(diǎn)有:
?????命令記憶功能:(history)在命令行中使用上下箭頭鍵就可以找到前/后一個(gè)輸入的命令;
????命令與文件補(bǔ)全功能:[Tab]鍵補(bǔ)全。[Tab]接在一串命令的第一個(gè)字后面,則為命令補(bǔ)全;[Tab]接在一串命令的第二個(gè)字以后時(shí),為文件補(bǔ)齊。在bash shell下不妨多按幾次[Tab]鍵。
????命令別名設(shè)置。 alias lm = 'ls -al'
????程序腳本
????通配符 * 的使用.
二、shell的變量功能
變量的取用 echo

變量設(shè)定規(guī)則
1. 變量與內(nèi)容以一個(gè)等號(hào) [=] 來(lái)連接,如下所示:
? ? ?[myname=VBird]
2. 等號(hào)兩邊不能直接空格符,如下所示為錯(cuò)誤:
? ? ?[myname = VBird] 或 [myname=VBird Tsai]
3. 變量名稱只能是英文字母與數(shù)字,但是開(kāi)頭字符不能是數(shù)字,如下為錯(cuò)誤:
? ? ?[2myname=VBird]
4. 變量?jī)?nèi)容若有空格符可使用雙引號(hào)["]或單引號(hào)[']將變量?jī)?nèi)容結(jié)合起來(lái),但
雙引號(hào)內(nèi)的特殊字符如$等,可以保有原來(lái)的特性,如下所示:
[var="lang is $LANG"] 則 [echo $var] 可得 [lang is zh_TW.UTF-8]
單引號(hào)內(nèi)的特殊字符則僅為一般字符(純文本),如下所示:
? ? ? ? ?[var='lang is $LANG'] 則 [echo $var] 可得 [lang is $LANG]
5. 可用跳脫字符[ \ ]將特殊符號(hào)(如 [Enter],$,\,空格符,'等)變成一般字符,如:
? ? ?[myname=VBird\ Tsai]
6. 在一串指令的執(zhí)行中,還需要籍由其他額外的指令提供的信息時(shí),可以使用反單引號(hào)[`指令`]或[$(指令)]。
特別注意,那個(gè) ` 是鍵盤上方的數(shù)字鍵 1 左邊那個(gè)按鍵,而不是單引號(hào)!例如想要取得核心版本的設(shè)定:
? ? ?[version=$(uname -r)] 再 [echo $version] 可得 [3.10.0-229.e17.x86_64]
7. 若該變量為擴(kuò)增變量?jī)?nèi)容時(shí),則可用 “$變量名稱” 或 ${變量} 累加內(nèi)容,如下所示:
? ? ?[PATH="$PATH":/home/bin] 或 [PATH=${PATH}:/home/bin]
8. 若該變量需要在其他子程序執(zhí)行,則需要以 export 來(lái)使變量變成環(huán)境變量:
? ? ?[export PATH]
9. 通常大寫字符為系統(tǒng)默認(rèn)變量,自行設(shè)定變量可以使用小寫字符,方便判斷(純粹依照使用者興趣與嗜好);
10.取消變量的方法為使用 unset : [uset 變量名稱] 例如取消 myname 的設(shè)定:
[unset myname]
環(huán)境變量
set:顯示(設(shè)置)shell變量 包括的私有變量以及用戶變量,不同類的shell有不同的私有變量 bash,ksh,csh每中shell私有變量都不一樣
env:顯示(設(shè)置)用戶變量變量
export:顯示(設(shè)置)當(dāng)前導(dǎo)出成用戶變量的shell變量。
shell(這里指bash)的初始化過(guò)程是這樣的:
1.bash檢查文件/etc/profile是否存在
2.如果存在,bash就讀取該文件,否則,跳過(guò)
3.bash檢查主目錄下的文件.bash_profile是否存在。
4.如果存在,bash就讀取該文件,否則,跳過(guò)
5.bash檢查主目錄下的.bash_login是否存在。
6.如果存在,bash就讀取該文件,否則,跳過(guò)
7.bash檢查主目錄下的文件.profile是否存在
8.如果存在,bash就讀取該文件,否則,跳過(guò)。
這些步驟都執(zhí)行完后,就出現(xiàn)提示符了,ksh默認(rèn)提示符是$.
所以可以通過(guò)更改相關(guān)文件里的配置設(shè)置你的環(huán)境變量.
變量讀取、數(shù)組、宣告



變量?jī)?nèi)容的刪除與替換



三、bash shell操作環(huán)境
bash shell對(duì)指令的搜尋順序:
1.以相對(duì)/絕對(duì)路徑運(yùn)行命令,例如『 /bin/ls 』或『 ./ls 』;
2.由 alias 找到該命令來(lái)運(yùn)行;
3.由 bash 內(nèi)建的 (builtin) 命令來(lái)運(yùn)行;
4.透過(guò) $PATH 這個(gè)變量的順序搜尋到的第一個(gè)命令來(lái)運(yùn)行。
通過(guò)type命令查看命令搜尋順序,例如:type -a vi
. bash 也有進(jìn)站畫面與歡迎訊息.在終端機(jī)接口 (tty1 ~ tty6) 登入的時(shí)候,會(huì)有幾行提示的字符串,那就是進(jìn)站畫面. 那個(gè)字符串寫在 /etc/issue 里面.
如果想要讓使用者登入后取得一些訊息,例如想要讓大家都知道的訊息, 那么可以將訊息加入 /etc/motd里面去!例如:當(dāng)?shù)侨牒?,告訴登入者, 系統(tǒng)將會(huì)在某個(gè)固定時(shí)間進(jìn)行維護(hù)工作,可以這樣做:?
linux-peej:~ # vi /etc/motd?
Hello everyone, Our server will be maintained at 2015/06/28 0:00 ~ 24:00. Please don't login server at that time.?
那么當(dāng)你的使用者(包括所有的一般賬號(hào)與 root)登入主機(jī)后,就會(huì)顯示這樣的訊息出來(lái):
Last login: Sat Jun 28 11:20:16 2015 from 192.168.137.1?
Hello everyone, Our server will be maintained at 2009/02/28 0:00 ~ 24:00. Please don't login server at that time.?

終端機(jī)的環(huán)境設(shè)定


四、數(shù)據(jù)流重導(dǎo)向
將命令執(zhí)行后的數(shù)據(jù)輸出到指定地方


/dev/null? 是可以當(dāng)垃圾桶用的文件,可以將不需要的錯(cuò)誤輸出重定向到此文件,這些信息將會(huì)自動(dòng)清除.
如果將正確和錯(cuò)誤信息都寫入文件,需要特殊寫法:

命令執(zhí)行判斷依據(jù)
&&
? ? ? cmd1 && cmd2
? ? ? 若cmd1執(zhí)行完畢且正確執(zhí)行($?=0),則開(kāi)始執(zhí)行cmd2
? ? ? 若cmd2執(zhí)行完畢且為錯(cuò)誤($? !=0),則cmd2不執(zhí)行
||
? ? ? cmd1 || cmd2
? ? ? 若cmd1執(zhí)行完畢且正確執(zhí)行($?=0),則cmd2不執(zhí)行
? ? ? 若cmd2執(zhí)行完畢且為錯(cuò)誤($? !=0),則開(kāi)始執(zhí)行cmd2
分號(hào);
? ? ? ?cmd;cmd
? ? ? ?多條命令順序執(zhí)行,執(zhí)行順序是從左到右的順序。
()運(yùn)算符:
為了在當(dāng)前shell中執(zhí)行一組命令,可以用命令分隔符(即",")隔開(kāi)每一個(gè)命令,并把所有的命令用圓括號(hào)()括起來(lái)。
{}運(yùn)算符:
如果使用{}來(lái)代替(),那么相應(yīng)的命令將在子shell而不是當(dāng)前shell中作為一個(gè)整體被執(zhí)行,只有在{}中所有命令的輸出作為一個(gè)整體被重定向時(shí),其中的命令才被放到子shell中執(zhí)行,否則在當(dāng)前shell執(zhí)行。
command1 && command2 || command3
? ? ? 如果command1執(zhí)行正確,則執(zhí)行command2
? ? ? 如果command1執(zhí)行為錯(cuò)誤,則執(zhí)行command3
五、管線命令
擷取命令




排序命令






tee(雙向重定向)
管道符或者“>”操作符都是單向的數(shù)據(jù)流,為了在數(shù)據(jù)流處理的國(guó)中將某段信息保存到文件,同時(shí)希望這個(gè)數(shù)據(jù)流繼續(xù)輸出到后續(xù)的命令,那么tee就是為了完成這樣的工作情景。



Linux中常用的字符轉(zhuǎn)換命令有:tr,col,join,paste,expand。
(1)tr:可以用來(lái)刪除一段信息當(dāng)中的文字,或者是進(jìn)行文字信息的轉(zhuǎn)換。
a)tr 'SET1' 'SET2'?tr的默認(rèn)操作是替換, 作用是把標(biāo)準(zhǔn)輸入中含有的SET1中的字符依次換成SET2中對(duì)應(yīng)的字符。
例如:echo "Hello, Kevin" | tr 'a-z' 'A-Z'
輸出結(jié)果是:HELLO,KEVIN
例如:echo "Hello, Kevin" | tr 'he' 'XX'
輸出結(jié)果是:HXllo, KXvin
b) tr -d SET1 當(dāng)tr帶有-d參數(shù)的時(shí)候表示刪除標(biāo)準(zhǔn)輸入中所有在SET1 中出現(xiàn)的字符。
例如:echo “Hello, Kevin” | tr -d 'a-z'
輸出結(jié)果是:H, K上述語(yǔ)句的作用就是刪除了標(biāo)準(zhǔn)輸入中的所有小寫字母。
c) tr -s SET1 當(dāng)tr帶有-s參數(shù)的時(shí)候表示替換掉標(biāo)準(zhǔn)輸入中在SET1中重復(fù)出現(xiàn)的字符,只保留一個(gè)。
例如: echo "Hello, Kevin" | tr -s 'a-z'
輸出結(jié)果是:Helo, Kevin 結(jié)果中刪除重復(fù)出現(xiàn)的l只保留了一個(gè)。
(2) col:在許多UNIX說(shuō)明文件里,都有RLF控制字符。當(dāng)我們運(yùn)用shell特殊字符">"和">>",把說(shuō)明文件的內(nèi)容輸出成純文本文件時(shí),控制字符會(huì)變成亂碼,col指令則能有效濾除這些控制字符。
a)col -b過(guò)濾掉所有的控制字符,包括RLF和HRLF。
? ?b)col -x 將tab建換成對(duì)等的空格鍵
(3)join: 它處理兩個(gè)文件之間的數(shù)據(jù),主要是將兩個(gè)文件中有相同數(shù)據(jù)的行合并在一起。要注意的是在使用join之前,索要處理的兩個(gè)文件應(yīng)當(dāng)是經(jīng)過(guò)排序的,否則有些對(duì)比的項(xiàng)目會(huì)被略過(guò)。
-t:分段的分隔符。 join默認(rèn)以空格符分隔數(shù)據(jù),并且對(duì)比“第一個(gè)字段”的數(shù)據(jù),如果兩個(gè)文件相同,則將兩條數(shù)據(jù)連城一行,且第一個(gè)字段放在第一個(gè)。
-i: 忽略大小寫的差異。
-1: 數(shù)字1后面代表的是第一個(gè)文件用哪個(gè)字段來(lái)分析
?-2:數(shù)字2后面代表的是第二個(gè)文件用哪個(gè)字段來(lái)分析
例如:test1中有如下數(shù)據(jù):
Kevin 100
Luna 100
Max 100
John 100
test2中有如下數(shù)據(jù):
Luna 10
John 20
Max 30
Kevin 40
分別將test1和test2排序并保存在test1_s和test2_s中,然后用join對(duì)兩個(gè)文件進(jìn)行處理:join test1 test2 獲得以下結(jié)果:
John 120
Kevin 140
Luna 110
Max 130
(4)paste: 直接將兩個(gè)文件中具有相同數(shù)據(jù)的行貼在一起,且中間以tab建隔開(kāi)。
-d: 后面可以接分隔符,默認(rèn)是以tab來(lái)分隔的
- :如果file部分寫成-,表示數(shù)據(jù)來(lái)自stdin
還是按照上面的例子對(duì)于排序后的test1_s和test2_s用paste進(jìn)行處理 paste -d ' ' test1_s test2_s將獲得以下結(jié)果:
John 100 John 20
Kevin 100 Kevin 40
Luna 100 Luna 10
Max 100 Max 30
(5)expand: 將tab轉(zhuǎn)換成空格鍵。
-t : 后面可以接數(shù)字,自定義一個(gè)tab按鍵代表多少個(gè)字符。
參數(shù)代換 xargs

減號(hào)"-"用途

替代stdin和stdout.