一泉蝌、認識BASH
????BASH是目前Linux系統(tǒng)應(yīng)用最多的shell,也是大多數(shù)Linux系統(tǒng)默認的shell.
shell是操作系統(tǒng)的接口,它的地位如下圖:
使用shell的幾個好處:
命令行界面的shell:大家都一樣歇万。幾乎各家distribution使用的bash都是一樣的。這樣你可以隨意轉(zhuǎn)換不同的distribution勋陪。
遠程管理:命令行較快贪磺。速度快而且不太會出現(xiàn)短線或者信息外流的問題。
bash是GNU計劃中重要的計劃之一诅愚,目前也是distributions的標準shell寒锚。bash的優(yōu)點有:
?????命令記憶功能:(history)在命令行中使用上下箭頭鍵就可以找到前/后一個輸入的命令;
????命令與文件補全功能:[Tab]鍵補全违孝。[Tab]接在一串命令的第一個字后面刹前,則為命令補全;[Tab]接在一串命令的第二個字以后時雌桑,為文件補齊喇喉。在bash shell下不妨多按幾次[Tab]鍵。
????命令別名設(shè)置筹燕。 alias lm = 'ls -al'
????程序腳本
????通配符 * 的使用.
二轧飞、shell的變量功能
變量的取用 echo
變量設(shè)定規(guī)則
1. 變量與內(nèi)容以一個等號 [=] 來連接,如下所示:
? ? ?[myname=VBird]
2. 等號兩邊不能直接空格符撒踪,如下所示為錯誤:
? ? ?[myname = VBird] 或 [myname=VBird Tsai]
3. 變量名稱只能是英文字母與數(shù)字,但是開頭字符不能是數(shù)字制妄,如下為錯誤:
? ? ?[2myname=VBird]
4. 變量內(nèi)容若有空格符可使用雙引號["]或單引號[']將變量內(nèi)容結(jié)合起來掸绞,但
雙引號內(nèi)的特殊字符如$等,可以保有原來的特性,如下所示:
[var="lang is $LANG"] 則 [echo $var] 可得 [lang is zh_TW.UTF-8]
單引號內(nèi)的特殊字符則僅為一般字符(純文本)衔掸,如下所示:
? ? ? ? ?[var='lang is $LANG'] 則 [echo $var] 可得 [lang is $LANG]
5. 可用跳脫字符[ \ ]將特殊符號(如 [Enter]烫幕,$,\敞映,空格符较曼,'等)變成一般字符,如:
? ? ?[myname=VBird\ Tsai]
6. 在一串指令的執(zhí)行中振愿,還需要籍由其他額外的指令提供的信息時捷犹,可以使用反單引號[`指令`]或[$(指令)]。
特別注意冕末,那個 ` 是鍵盤上方的數(shù)字鍵 1 左邊那個按鍵萍歉,而不是單引號!例如想要取得核心版本的設(shè)定:
? ? ?[version=$(uname -r)] 再 [echo $version] 可得 [3.10.0-229.e17.x86_64]
7. 若該變量為擴增變量內(nèi)容時档桃,則可用 “$變量名稱” 或 ${變量} 累加內(nèi)容枪孩,如下所示:
? ? ?[PATH="$PATH":/home/bin] 或 [PATH=${PATH}:/home/bin]
8. 若該變量需要在其他子程序執(zhí)行,則需要以 export 來使變量變成環(huán)境變量:
? ? ?[export PATH]
9. 通常大寫字符為系統(tǒng)默認變量藻肄,自行設(shè)定變量可以使用小寫字符蔑舞,方便判斷(純粹依照使用者興趣與嗜好);
10.取消變量的方法為使用 unset : [uset 變量名稱] 例如取消 myname 的設(shè)定:
[unset myname]
環(huán)境變量
set:顯示(設(shè)置)shell變量 包括的私有變量以及用戶變量嘹屯,不同類的shell有不同的私有變量 bash,ksh,csh每中shell私有變量都不一樣
env:顯示(設(shè)置)用戶變量變量
export:顯示(設(shè)置)當前導(dǎo)出成用戶變量的shell變量斗幼。
shell(這里指bash)的初始化過程是這樣的:
1.bash檢查文件/etc/profile是否存在
2.如果存在,bash就讀取該文件呆馁,否則桐经,跳過
3.bash檢查主目錄下的文件.bash_profile是否存在。
4.如果存在浙滤,bash就讀取該文件阴挣,否則纺腊,跳過
5.bash檢查主目錄下的.bash_login是否存在揖膜。
6.如果存在,bash就讀取該文件壹粟,否則拜隧,跳過
7.bash檢查主目錄下的文件.profile是否存在
8.如果存在干奢,bash就讀取該文件,否則,跳過佑稠。
這些步驟都執(zhí)行完后旗芬,就出現(xiàn)提示符了舌胶,ksh默認提示符是$.
所以可以通過更改相關(guān)文件里的配置設(shè)置你的環(huán)境變量.
變量讀取、數(shù)組疮丛、宣告
變量內(nèi)容的刪除與替換
三幔嫂、bash shell操作環(huán)境
bash shell對指令的搜尋順序:
1.以相對/絕對路徑運行命令,例如『 /bin/ls 』或『 ./ls 』誊薄;
2.由 alias 找到該命令來運行履恩;
3.由 bash 內(nèi)建的 (builtin) 命令來運行;
4.透過 $PATH 這個變量的順序搜尋到的第一個命令來運行呢蔫。
通過type命令查看命令搜尋順序似袁,例如:type -a vi
. bash 也有進站畫面與歡迎訊息.在終端機接口 (tty1 ~ tty6) 登入的時候,會有幾行提示的字符串,那就是進站畫面. 那個字符串寫在 /etc/issue 里面.
如果想要讓使用者登入后取得一些訊息昙衅,例如想要讓大家都知道的訊息扬霜, 那么可以將訊息加入 /etc/motd里面去!例如:當?shù)侨牒蠖妫嬖V登入者著瓶, 系統(tǒng)將會在某個固定時間進行維護工作,可以這樣做:?
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.?
那么當你的使用者(包括所有的一般賬號與 root)登入主機后啼县,就會顯示這樣的訊息出來:
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.?
終端機的環(huán)境設(shè)定
四材原、數(shù)據(jù)流重導(dǎo)向
將命令執(zhí)行后的數(shù)據(jù)輸出到指定地方
/dev/null? 是可以當垃圾桶用的文件,可以將不需要的錯誤輸出重定向到此文件,這些信息將會自動清除.
如果將正確和錯誤信息都寫入文件,需要特殊寫法:
命令執(zhí)行判斷依據(jù)
&&
? ? ? cmd1 && cmd2
? ? ? 若cmd1執(zhí)行完畢且正確執(zhí)行($?=0),則開始執(zhí)行cmd2
? ? ? 若cmd2執(zhí)行完畢且為錯誤($? !=0)季眷,則cmd2不執(zhí)行
||
? ? ? cmd1 || cmd2
? ? ? 若cmd1執(zhí)行完畢且正確執(zhí)行($?=0)余蟹,則cmd2不執(zhí)行
? ? ? 若cmd2執(zhí)行完畢且為錯誤($? !=0),則開始執(zhí)行cmd2
分號子刮;
? ? ? ?cmd;cmd
? ? ? ?多條命令順序執(zhí)行威酒,執(zhí)行順序是從左到右的順序。
()運算符:
為了在當前shell中執(zhí)行一組命令挺峡,可以用命令分隔符(即",")隔開每一個命令葵孤,并把所有的命令用圓括號()括起來。
{}運算符:
如果使用{}來代替()橱赠,那么相應(yīng)的命令將在子shell而不是當前shell中作為一個整體被執(zhí)行尤仍,只有在{}中所有命令的輸出作為一個整體被重定向時,其中的命令才被放到子shell中執(zhí)行狭姨,否則在當前shell執(zhí)行宰啦。
command1 && command2 || command3
? ? ? 如果command1執(zhí)行正確,則執(zhí)行command2
? ? ? 如果command1執(zhí)行為錯誤饼拍,則執(zhí)行command3
五绑莺、管線命令
擷取命令
排序命令
tee(雙向重定向)
管道符或者“>”操作符都是單向的數(shù)據(jù)流,為了在數(shù)據(jù)流處理的國中將某段信息保存到文件惕耕,同時希望這個數(shù)據(jù)流繼續(xù)輸出到后續(xù)的命令纺裁,那么tee就是為了完成這樣的工作情景。
Linux中常用的字符轉(zhuǎn)換命令有:tr,col,join,paste,expand司澎。
(1)tr:可以用來刪除一段信息當中的文字欺缘,或者是進行文字信息的轉(zhuǎn)換。
a)tr 'SET1' 'SET2'?tr的默認操作是替換, 作用是把標準輸入中含有的SET1中的字符依次換成SET2中對應(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 當tr帶有-d參數(shù)的時候表示刪除標準輸入中所有在SET1 中出現(xiàn)的字符谚殊。
例如:echo “Hello, Kevin” | tr -d 'a-z'
輸出結(jié)果是:H, K上述語句的作用就是刪除了標準輸入中的所有小寫字母。
c) tr -s SET1 當tr帶有-s參數(shù)的時候表示替換掉標準輸入中在SET1中重復(fù)出現(xiàn)的字符蛤铜,只保留一個嫩絮。
例如: echo "Hello, Kevin" | tr -s 'a-z'
輸出結(jié)果是:Helo, Kevin 結(jié)果中刪除重復(fù)出現(xiàn)的l只保留了一個丛肢。
(2) col:在許多UNIX說明文件里,都有RLF控制字符剿干。當我們運用shell特殊字符">"和">>"蜂怎,把說明文件的內(nèi)容輸出成純文本文件時,控制字符會變成亂碼置尔,col指令則能有效濾除這些控制字符杠步。
a)col -b過濾掉所有的控制字符,包括RLF和HRLF榜轿。
? ?b)col -x 將tab建換成對等的空格鍵
(3)join: 它處理兩個文件之間的數(shù)據(jù)幽歼,主要是將兩個文件中有相同數(shù)據(jù)的行合并在一起。要注意的是在使用join之前谬盐,索要處理的兩個文件應(yīng)當是經(jīng)過排序的甸私,否則有些對比的項目會被略過。
-t:分段的分隔符飞傀。 join默認以空格符分隔數(shù)據(jù)皇型,并且對比“第一個字段”的數(shù)據(jù),如果兩個文件相同助析,則將兩條數(shù)據(jù)連城一行,且第一個字段放在第一個椅您。
-i: 忽略大小寫的差異外冀。
-1: 數(shù)字1后面代表的是第一個文件用哪個字段來分析
?-2:數(shù)字2后面代表的是第二個文件用哪個字段來分析
例如: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對兩個文件進行處理:join test1 test2 獲得以下結(jié)果:
John 120
Kevin 140
Luna 110
Max 130
(4)paste: 直接將兩個文件中具有相同數(shù)據(jù)的行貼在一起掀泳,且中間以tab建隔開雪隧。
-d: 后面可以接分隔符,默認是以tab來分隔的
- :如果file部分寫成-员舵,表示數(shù)據(jù)來自stdin
還是按照上面的例子對于排序后的test1_s和test2_s用paste進行處理 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ù)字,自定義一個tab按鍵代表多少個字符马僻。
參數(shù)代換 xargs
減號"-"用途
替代stdin和stdout.