1、認識BASH這個shell
1.1鲜戒、硬件专控、核心與shell
- 通過shell將我們輸入的指令與Kernel溝通,讓Kernel可以控制硬件來正確無誤的工作遏餐。
- 只要能夠操作應(yīng)用程序的接口都能夠成為殼程序伦腐。
狹義的殼程序指的是指令列方面的軟件,如bash失都,廣義的殼程序則包括圖形接口的軟件柏蘑,因為圖形接口也能夠操作各種應(yīng)用程序來呼叫核心工作。
1.2粹庞、學(xué)習(xí)文字接口shell的必要性
- 幾乎各家的distributions使用的bash都一樣咳焚;
- 文字接口速度快;
- 想成為系統(tǒng)管理員庞溜,shell與shell scripts必須要學(xué)革半;
1.3、系統(tǒng)的合法shell與/etc/shells功能
- cat /etc/shells:可以查看系統(tǒng)有哪些可用的shells强缘;
- cat /etc/passwd:登錄時使用者獲取的shell可以通過這個命令查看
- /bin/bash是Linux預(yù)設(shè)的shell督惰,目前也是Linux distribution的標(biāo)準shell不傅,bash兼容sh旅掂;
1.4、Bash shell的功能
- 命令編修能力
在家目錄里的.bash_history里面記錄了你之前使用過的命令- 命令與檔案的不全功能
Tab接在一竄指令的第一個字的后面访娶,則為命令補全商虐;
Tab接在一竄指令的第二個字以后,則為檔案補全;- 命令別名設(shè)定功能:alias
例如:alias lm='ls -al'
直接輸入alias可以查看目前的別名- 程序化腳本:shell scripts
- 通配符
shell支持許多的通配符來幫助用戶查詢與下達指令秘车;
例如:ls -l /usr/bin/X*
1.5典勇、Bash shell的內(nèi)建命令:type
為了方便shell的操作,bash已經(jīng)內(nèi)建了很多指令叮趴,例如cd等
可以利用type來判斷該指令是內(nèi)建指令還是外部指令割笙;
type 【-tpa】name
1.6、指令的下達
反斜杠“\”可用于跳脫 如果[Enter]
2眯亦、Shell的變量功能
2.1伤溉、什么是變量
變量就是某個一特定字符串代表不固定的內(nèi)容。
- 數(shù)據(jù)的可變性和方便性妻率;
- 影像bash環(huán)境操作的變量
- 腳本程序設(shè)計(shell script)的幫手
2.2乱顾、變量的取用與設(shè)定:echo,變量設(shè)定規(guī)則宫静,unset
變量輸出:echo
等,可以保留原本的特性炭懊;單引號內(nèi)的特殊字符則僅為一般字符(純文本)父阻;
5荒椭、可用跳脫字符\將特殊符號如回車鍵味悄、(指令)生蚁;
7、若該變量為擴增變量內(nèi)容弯淘,則可用“{變量}累加內(nèi)容,如PATH="$PATH":/home/bin
8庐橙、若該變量需要其他子程序執(zhí)行态鳖,則需要使用export來使變量變?yōu)榄h(huán)境變量羽戒;
9亡电、通常大寫字符為系統(tǒng)默認變量届巩,自行設(shè)定變量可以使用小寫字符;
10或辖、取消變量的使用方法使用unset:變量名稱瘾英,如unset myname
2.3、環(huán)境變量的功能:env與常見環(huán)境變量說明颂暇,set缺谴,export
- 用env觀察環(huán)境變量與常見環(huán)境變量說明
命令:evn
常見環(huán)境變量:
1、HOME:代表用戶的家目錄
2耳鸯、SHELL:目前環(huán)境使用的SHELL,預(yù)設(shè)使用/bin/bash
3湿蛔、HISTSIZE:記錄我們曾經(jīng)下達過的指令的數(shù)量
4、MAIL:郵件信箱檔案
5片拍、PATH:執(zhí)行文件搜索路徑
6煌集、LANG:語系數(shù)據(jù)
7、RANDOM:隨機數(shù)變零- 用set觀察所有變量(含環(huán)境變量和自定義變量)
命令:set
比較重要的變量有:
1捌省、PS1:就是我們得命令提示符
1)\d:可顯示出【星期 月 日】的日期格式
2)\H:完整的主機名
3)\h:主機名第一個小數(shù)點之前的名字
4)\t:顯示時間HH:MM:SS
5)\T:顯示時間苫纤,為12小時格式的HH:MM:SS
6)\A:顯示時間,為24小時格式的HH:MM
7)@:顯示時間纲缓,為12小時的am/pm
8)\u:目前使用者的賬號名稱:如root
9)\v:BASH的版本信息
10)\w:完整的工作目錄名稱卷拘,由根目錄寫起的目錄名稱
11)\W:利用basename函數(shù)取得的工作目錄名稱
12)#:下達的第幾個指令
13)$:提示字符,如果是root時祝高,提示字符為#栗弟,否則就是:關(guān)于本shell的PID
代表的是目前這個shell的線程代號工闺,亦即所謂的PID
echo $$
3乍赫、?:關(guān)于上個執(zhí)行指令的回傳值
上一個回傳指令所傳回的值陆蟆。當(dāng)我們執(zhí)行某些指令時雷厂,這些指令都會回傳一個執(zhí)行后的代碼,一般來說叠殷,如果成功的執(zhí)行該指令改鲫,則會回傳一個0值,如果執(zhí)行過程發(fā)生錯誤,就會回傳錯誤代碼像棘;
4稽亏、自定義變量轉(zhuǎn)成環(huán)境變量
子程序會繼承父程序的環(huán)境變量,但是不會繼承父程序的自定義變量
如果想將父程序的自定義變量在子程序使用缕题,使用export 變量名稱
2.4截歉、影響顯示結(jié)果的語系變量(local)
查詢Linux支持的語系:locale -a
l修訂編碼:locale
2.5、變量的有效范圍
全局變量=環(huán)境變量
自定義變量=局部變量
內(nèi)存配置關(guān)系:
1避除、當(dāng)啟動一個shell怎披,操作系統(tǒng)會分配一記憶區(qū)塊給shell使用胸嘁,次內(nèi)存的扁郎可以讓子程序取用瓶摆;
2、若在父程序利用export功能性宏,可以讓自定義便領(lǐng)的內(nèi)容寫到上述記憶區(qū)塊中群井;
3、當(dāng)加載另一個shell時毫胜,子shell可以將父shell的環(huán)境變量所在的記憶塊導(dǎo)入自己的環(huán)境變量區(qū)塊當(dāng)中书斜;
2.6、變量鍵盤讀取酵使、數(shù)組與宣告:read荐吉,declare,array
- read 【-pt】variable
-p:后面接提示字符
-t:后面可接等待的秒數(shù)- declare/typeset
宣告變量的類型
declare 【-aixr】variable
-a:將后面名為variable的變量定義為數(shù)據(jù)類型
-i:將后面名為variable的變量定義為整數(shù)數(shù)字口渔;
-x:用法和export一樣
-r:將變量設(shè)定為readonly類型样屠,該變量不可被更改內(nèi)容,也不能unset
變量默認類型為字符串
declare -i sum=200+300
將環(huán)境變量變?yōu)樽远x變量
declare +x sum
將自定義變量變?yōu)榄h(huán)境變量
declare -x sum- array:數(shù)組變量類型
數(shù)組定義方式 var[index]=content
var[0]=1
2.7缺脉、與文件系統(tǒng)及程序的限制關(guān)系
限制用戶的某些系統(tǒng)資源痪欲,包括可以開啟的檔案數(shù)量,可以使用的cpu時間攻礼,可以使用的內(nèi)容總量等等业踢;
ulimit 【-SHacdfltu】 【配額】
2.8、變量內(nèi)容的刪除礁扮、取代與替換:刪除與取代知举,測試與替換
- 變量內(nèi)容的刪除與取代
1、{variable#/:}
代表刪除前面所有的內(nèi)容,取最短的那個
3倦畅、{path%:bin}
echo ${path%%:*bin}- 變量內(nèi)容的取代
echo ${path/sbin/SBIN}
兩斜線中間的是舊字符串欲账,后面的新字符串屡江;- 變量的測試與內(nèi)容個替換
1、判斷某個變量是否存在赛不,若變量存在則使用既有的設(shè)定惩嘉,若變量不存在則給予一個常用的設(shè)定;
username={username:-root}
3、如果想將舊變量一起替換掉殿较,則用=號耸峭;
var={str?無此變數(shù)}
3劳闹、命令別名與歷史記錄
3.1、命令別名設(shè)定:alias洽瞬,unalias
alias:查看別名
別名還可以取代既有的指令
取消別名:unalias
3.2本涕、歷史命令:history,HISTSIZE
history [n]:列出最近的n筆命令行表伙窃;
history[c]:將目前的shell中的所有history內(nèi)容全部消除菩颖;
history [-arw] histfiles
-a:將目前新增的histroy指令新增如histfiles中,若沒有加histfiles为障,則預(yù)設(shè)寫入~/.bash_history
-r:將histfiles的內(nèi)容讀到目前這個shell的history記憶中
-w:將目前的history記憶內(nèi)容寫入histfiles中晦闰;
history還可以幫助執(zhí)行指令
1、产场!number
執(zhí)行第幾筆指令
2鹅髓、!commond
由最近的指令向前搜尋指令竄開頭位commond的那個指令
3京景、!!
就是執(zhí)行上一個指令
4窿冯、Bash shell的操作環(huán)境
4.1、路徑與指令搜索順序
指令運作順序
1确徙、以相對路徑/絕對路徑執(zhí)行指令醒串,如/bin/ls 或 ./ls
2、有alias找到該指令來執(zhí)行
3鄙皇、由bash內(nèi)建的指令來執(zhí)行
4芜赌、透過$PATH這個變量的順序搜索尋到的第一個指令來執(zhí)行
4.2、bash的進站與歡迎訊息:/etc/issue,/etc/motd
進站歡迎信息伴逸,在/etc/issue里面
4.3缠沈、環(huán)境配置文件:login,non-login shell,/etc/profile,/.bash_profile,source,/.bashrc
1洲愤、系統(tǒng)有一些環(huán)境文件案的存在颓芭,讓bash在啟動時直接讀取這些配置文件,以規(guī)劃好bash的操作環(huán)境柬赐。而這些配置文件又可以分為全體系統(tǒng)的配置文件以及用戶個人偏好設(shè)置文件亡问。想要保留設(shè)置,就得將這些設(shè)定寫入配置文件肛宋;
2州藕、login shell與non-login shell
login shell會讀取這兩個配置文件:
a)/etc/profile:這是系統(tǒng)整體的設(shè)定,你最好不要修改這個檔案酝陈;
b) /.bash_profile或/.bash_login或~./profile:屬于使用者個人設(shè)定床玻,你要改自己的數(shù)據(jù),就寫入這里后添;
4.4笨枯、終端的環(huán)境設(shè)定:stty薪丁,set
stty可以幫助設(shè)定終端機按鍵代表意義
stty -a :將目前所有的stty參數(shù)列出來遇西;
例如:stty erase ^h
set可以幫助我們設(shè)定整個指令輸出/輸入的環(huán)境
set 【-uvCHhmBx】
echo $- :顯示目前所有的set設(shè)定值
4.5、通配符號與特殊符號
- 通配符
"* " :代表0個到無窮多個任意字符严嗜。
"粱檀?":代表一定有一個任意字符。
"[] " :同樣代表一定有一個括號內(nèi)的字符(非任意字符)漫玄。例如adcd代表一定有一個字符茄蚯,可能是a,b睦优,c渗常,d這四個任何一個。
"[-] ":若有減號在中括號內(nèi)汗盘,代表在編碼順序內(nèi)的所有字符皱碘,例如0-9代表0到9之間的所有數(shù)字,因為數(shù)字的語系編碼是連續(xù)的隐孽。
"[^]" :若中括號內(nèi)的第一個字符為指數(shù)符號,那表示反向選擇癌椿,例如[abc]代表一定有一個字符,只要非a菱阵,b踢俄,c的其他字符就接受的意思。- 特殊字符
“#”:批處理符號,這個最長被使用在script當(dāng)中晴及,視為說明都办!在后的數(shù)據(jù)均不執(zhí)行
"":跳脫符號,將特殊字符或通配符還原成一般字符
"|":管線,分割兩個管線命令的界定
";":連續(xù)指令下達分隔符琳钉,連續(xù)性命令的界定(注意世舰!與管線命令并不相同)
"~":用戶的家目錄
"()
"()":在中間為子shell的起始與結(jié)束
"{}":在中間為命令區(qū)塊的組合
5躲庄、數(shù)據(jù)流重導(dǎo)向
5.1查剖、何為數(shù)據(jù)流重導(dǎo)向
數(shù)據(jù)流重導(dǎo)向:數(shù)據(jù)流重導(dǎo)向可以將standard output與stardard error output分別傳送到其他的檔案或裝置區(qū),而分別傳送所用的特殊字符則如下所示
1噪窘、標(biāo)準輸入 stdin:代碼未0笋庄,使用<或<<;
2、標(biāo)準輸出 stdout:代碼未1倔监,使用>或>>直砂;
3、標(biāo)準錯誤輸出stderr:代碼為2浩习,使用2>或2>>;
例如:ll / > ~/rootfile
該檔案建立方式:
1静暂、該檔案若不存在(如~/rootfile)若不存在,系統(tǒng)會自動的將他建立起來谱秽,
2洽蛀、當(dāng)這個檔案存在的時候,系統(tǒng)會先將這個檔案清空疟赊,然后再寫入數(shù)據(jù)郊供;
3、也就是若以>輸出到一個已經(jīng)存在的檔案中近哟,那個檔案就會被覆蓋掉驮审;
例子:
find /home -name.bashrc > list_right 2> list_error
- /dev/null 垃圾桶黑洞裝置與特殊寫法
如果我們知道錯誤會發(fā)生,所以要將錯誤信息忽略掉而不顯示或存儲椅挣,這個/dev/null可以吃掉任何導(dǎo)向這個裝置的信息
例如:
find /home -name.bashrc 2> /dev/null
如果要將正確與錯誤的數(shù)據(jù)統(tǒng)統(tǒng)寫入同一個檔案
find /home -name.bashrc > list 2>&1- standard input : < 與 <<
將原本需要有鍵盤輸入的數(shù)據(jù)头岔,改由檔案內(nèi)容來取代
使用命令輸出重導(dǎo)向的必要性:
1、屏幕輸出的信息很重要鼠证,而且我們需要將他存下來的時候峡竣;
2、背景執(zhí)行中的程序量九,不希望他干擾屏幕正常的輸出結(jié)果時适掰;
3结窘、一些系統(tǒng)的執(zhí)行命令的執(zhí)行結(jié)果狞玛,希望他可以保存下來撒遣;
4最铁、一些執(zhí)行命令的可能已知錯誤訊息時,想以2> /dev/null將他丟棄掉费就;
5诉瓦、錯誤訊息與正確信息的分別輸出時;
5.2力细、命令執(zhí)行的判斷依據(jù)
想要一次執(zhí)行多個指令方法
- cmd;cmd(不考慮指令相關(guān)性的連續(xù)下達指令)
例如:sync睬澡;sync;shutdown -h now?=0),則開始執(zhí)行cmd2逝慧;
2昔脯、若cmd1執(zhí)行完畢且為錯誤(?=0),則cmd2不執(zhí)行捐祠;
2碱鳞、若cmd1執(zhí)行完畢且為錯誤($?!=0),則開始執(zhí)行cmd2踱蛀;
例如:ls /tmp/abc && touch /tmp/abc/hehe
ls /tmp/abc || mkdir /tmp/abc
ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
一般來說,假設(shè)判斷式有3個贵白,也就是
command1 && command2 || command
6率拒、管線命令
bash命令執(zhí)行的時候又輸出的數(shù)據(jù)出現(xiàn),如果這群數(shù)據(jù)必須要經(jīng)過幾道手續(xù)之后才能得到我們所想要的格式禁荒,則可以使用管線命令猬膨。管線命令使用的是|這個界定符號。
管線命令僅會處理standard output呛伴,對于standard error output會予以忽略勃痴。
管線命令必須要能夠接受來自前一個指令的數(shù)據(jù)成為standard input繼續(xù)處理才行。
6.1热康、截取命令:cut沛申,grep
cut的主要用途在于將同一行里面的數(shù)據(jù)進行分解,最長使用在分析一些數(shù)據(jù)或文字數(shù)據(jù)的時候姐军。
例如: echo $PATH | cut -d ':' -f 3
cut是將一行訊息當(dāng)中铁材,取出某部分我們想要的尖淘,兒grep則是分析一行信息,若當(dāng)中有我們所需要的信息著觉,就講該行拿出來村生。
例如:last | grep ’root‘
6.2、排序命令:sort饼丘,uniq趁桃,wc
sort 指令用于排序,而且可以依據(jù)不同的數(shù)據(jù)類型來排序肄鸽;
unip 指令用于將重復(fù)的資料刪除僅顯示一個镇辉;
wc 指令用于計算這個檔案里面有多少字,多少行贴捡,多少字符
6.3忽肛、雙向重導(dǎo)向:tee
tee 指令用于在數(shù)據(jù)流處理過程中將某段信息保存下來;
6.4烂斋、字符轉(zhuǎn)換命令:tr屹逛,col,join汛骂,paste罕模,expand
tr 用于刪除一段訊息當(dāng)中的文字,或者是進行文字訊息的替換帘瞭;
col 用來簡單的獎tab按鍵取代成為空格淑掌;
join 處理兩個檔案之間的數(shù)據(jù),而且蝶念,主要是在處理兩個檔案中抛腕,有相同數(shù)據(jù)的哪一行,才將他加在一起媒殉;
paste 直接將兩行貼在一起担敌,而且中間以tab鍵隔開;
expand 將tab按鍵轉(zhuǎn)換成空格廷蓉;
6.5全封、分割命令
split 將一個大檔案,依據(jù)檔案大小火行數(shù)來分割桃犬,將大檔案分割成為小檔案刹悴;
6.6、參數(shù)代換:xargs
產(chǎn)生某個指令的參數(shù)攒暇,xargs可以讀入stdin的數(shù)據(jù)土匀,并且以空格符或者斷行符作為分辨,將stdin的資料分割成為arguments扯饶;
6.7恒削、關(guān)于減號-的用途
管線命令在 bash 的連續(xù)處理程序中是相當(dāng)重要癿!另外池颈,在 log file 的分析當(dāng)中也是相當(dāng)重要的一 環(huán), 所以請?zhí)貏h留意!另外钓丰,在管線命令當(dāng)中躯砰,常常會使用到前一個指令的stdout 作為這次的
stdin , 某些指令需要用到文件名 (例如 tar) 杢迚行處理時携丁,該 stdin 不 stdout 可以刟用減號 "-" 來替 代琢歇,