認識與學習BASHshell
認識 BASH 這個 Shellbash
Bash shell 的功能學習
查詢指令是否爲 Bash shell 的內置命令: type字體
範例一:查詢一下 ls 這個指令是否爲 bash 內置?編碼
[dmtsai@study ~]$ type ls
複製代碼
Shell 的變量功能spa
變量的取用與設置:echo, 變量設置規則, unset.net
echo $PATH命令行
設置變量:code
[dmtsai@study ~]$ echo ${myname}
<==這裏並無任何數據~由於這個變量還沒有被設置!是空的!
[dmtsai@study ~]$ myname=VBird
[dmtsai@study ~]$ echo ${myname}
VBird <==出現了!由於這個變量已經被設置了
複製代碼
:如何進入到您目前核心的模塊目錄?cdn
[dmtsai@study ~]$ cd /lib/modules/$(uname -r)/kernel # 以此例較佳!
複製代碼
其實上面的指令能夠說是做了兩次動做,亦便是:
環境變量的功能
用 env 觀察環境變量與常見環境變量說明
用 set 觀察全部變量 (含環境變量與自訂變量)
影響顯示結果的語系變量 (locale)
變量鍵盤讀取、陣列與宣告: read, array, declare
read
範例一:讓使用者由鍵盤輸入一內容,將該內容變成名爲 atest 的變量 [dmtsai@study ~] echo ${atest} This is a test <==你剛剛輸入的數據已經變成一個變量內容!
declare / typeset
範例一:讓變量 sum 進行 100+300+50 的加總結果
declare 或 typeset 是同樣的功能,就是在「宣告變量的類型」。若是使用 declare 後面並無接任何參數,那麼 bash 就會主動的將全部的變量名稱與內容統統叫出來,就好像使用 set 同樣啦!
[dmtsai@study ~]$ sum=100+300+50
[dmtsai@study ~]$ echo ${sum}
100+300+50 <==咦!怎麼沒有幫我計算加總?由於這是文字體態的變量屬性啊!
[dmtsai@study ~]$ declare -i sum=100+300+50
[dmtsai@study ~]$ echo ${sum}
450
複製代碼
範例:設置上面提到的 var[1] ~ var[3] 的變量。
[dmtsai@study ~]$ var[1]="small min"
[dmtsai@study ~]$ var[2]="big min"
[dmtsai@study ~]$ var[3]="nice min"
[dmtsai@study ~]$ echo "${var[1]}, ${var[2]}, ${var[3]}"
small min, big min, nice min
複製代碼
與文件系統及程序的限制關係: ulimit
變量內容的刪除、取代與替換
範例一:先讓小寫的 path 自訂變量設置的與 PATH 內容相同
[dmtsai@study ~]$ path=${PATH}
[dmtsai@study ~]$ echo ${path}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
複製代碼
範例二:假設我不喜歡 local/bin,因此要將前 1 個目錄刪除掉,如何顯示?
[dmtsai@study ~]$ echo ${path#/*local/bin:}
/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
複製代碼
範例六:將 path 的變量內容內的 sbin 取代成大寫 SBIN:
[dmtsai@study ~]$ echo ${path/sbin/SBIN}
/usr/local/bin:/usr/bin:/usr/local/SBIN:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
複製代碼
這個部分就容易理解的多了!關鍵字在於那兩個斜線,兩斜線中間的是舊字串
後面的是新字串,因此結果就會出現如上述的特殊字體部分囉!
[dmtsai@study ~]$ echo ${path//sbin/SBIN}
/usr/local/bin:/usr/bin:/usr/local/SBIN:/usr/SBIN:/home/dmtsai/.local/bin:/home/dmtsai/bin
複製代碼
若是是兩條斜線,那麼就變成全部符合的內容都會被取代喔!
咱們將這部份做個總結說明一下:
變量設置方式 | 說明 |
---|---|
{變量#關鍵 字} | |
{變量##關鍵字} | 若變量內容從頭開始的數據符合「關鍵字」,則將符合的最短數據刪除若變量內容從頭開始的數據符合「關鍵字」,則將符合的最長數據刪除 |
{變量%關鍵 字} | |
{變量%%關鍵字} | 若變量內容從尾向前的數據符合「關鍵字」,則將符合的最短數據刪除 若變量內容從尾向前的數據符合「關鍵字」,則將符合的最長數據刪除 |
{變量/舊字串/新字串} | |
{變量//舊字串/新字串} | 若變量內容符合「舊字串」則「第一個舊字串會被新字串取代」 若變量內容符合「舊字串」則「所有的舊字串會被新字串取代」 |
Bash Shell 的操做環境:
bash 的環境配置文件
source :讀入環境配置文件的指令
萬用字符與特殊符號
符號 意義
表明「 0 個到無窮多個」任意字符
複製代碼
? 表明「必定有一個」任意字符
[ ] 一樣表明「必定有一個在括號內」的字符(非任意字符)。例如 [abcd] 表明「必定有一個字符, 多是 a, b, c, d 這四個任何一個 [ -] 如有減號在中括號內時,表明「在編碼順序內的全部字符」。例如 [0-9] 表明 0 到 9 之間的全部數字,由於數字的語系編碼是連續的! [^] 若中括號內的第一個字符爲指數符號 (^) ,那表示「反向選擇」,例如 abc 表明必定有一個字符,只要是非 a, b, c 的其餘字符就接受的意思。
除了萬用字符以外,bash 環境中的特殊符號有哪些呢?下面咱們先彙整一下:
數據流重導向
標準輸入 (stdin) :代碼爲 0 ,使用 < 或 << ;
標準輸出 (stdout):代碼爲 1 ,使用 > 或 >> ;
標準錯誤輸出(stderr):代碼爲 2 ,使用 2> 或 2>> ; 爲了理解 stdout 與 stderr ,咱們先來進行一個範例的練習: 範例一:觀察你的系統根目錄 (/) 下各目錄的文件名、權限與屬性,並記錄下來
[dmtsai@study ~] ll / > ~/rootfile ==屏幕並沒有任何信息 [dmtsai@study ~]$ ll ~/rootfile ==有個新文件被建立了! -rw-rw-r--. 1 dmtsai dmtsai 1078 Jul 9 18:51 /home/dmtsai/rootfile
1> :以覆蓋的方法將「正確的數據」輸出到指定的文件或設備上; 1>>:以累加的方法將「正確的數據」輸出到指定的文件或設備上; 2> :以覆蓋的方法將「錯誤的數據」輸出到指定的文件或設備上; 2>>:以累加的方法將「錯誤的數據」輸出到指定的文件或設備上;
範例五:將指令的數據所有寫入名爲 list 的文件中
[dmtsai@study ~]$ find /home -name .bashrc > list 2> list ==錯誤
[dmtsai@study ~]$ find /home -name .bashrc > list 2>&1 ==正確
[dmtsai@study ~]$ find /home -name .bashrc &> list ==正確
複製代碼
standard input : < 與 << 瞭解了 stderr 與 stdout 後,那麼那個 < 又是什麼呀?呵呵!以最簡單的說法來講, 那就 是「將本來須要由鍵盤輸入的數據,改由文件內容來取代」的意思。 咱們先由下面的 cat 指令操 做來了解一下什麼叫作「鍵盤輸入」吧!
範例六:利用 cat 指令來建立一個文件的簡單流程
[dmtsai@study ~]$ cat < catfile
testing
cat file test
< ==這裏按下 [ctrl]+d 來離開
[dmtsai@study ~]$ cat catfile
testing
cat file test
複製代碼
命令執行的判斷依據: ; , &&, ||
cmd ; cmd (不考慮指令相關性的連續指令下達)
在某些時候,咱們但願能夠一次執行多個指令,例如在關機的時候我但願能夠先執行兩次sync 同步化寫入磁盤後才 shutdown 計算機,那麼能夠怎麼做呢?這樣作呀:
複製代碼
[root@study ~]# sync; sync; shutdown -h now
在某些時候,咱們但願能夠一次執行多個指令,例如在關機的時候我但願能夠先執行兩次 sync 同步化寫入磁盤後才 shutdown 計算機,那麼能夠怎麼做呢?這樣作呀: [root@study ~]# sync; sync; shutdown -h now
$? (指令回傳值) 與 && 或 ||
cmd1&&cmd2
若 cmd1 執行完畢且正確執行(?=0),則開始執行 cmd2。 2. 若 cmd1 執行完畢且爲錯誤 (?≠0),則 cmd2 不執行。
cmd1 ||cmd2
若 cmd1 執行完畢且正確執行(?=0),則 cmd2 不執行。 2. 若 cmd1 執 行完畢且爲錯誤 (?≠0),則開始執行 cmd2。
範例一:使用 ls 查閱目錄 /tmp/abc 是否存在,若存在則用 touch 建立 /tmp/abc/hehe
[dmtsai@study ~]$ ls /tmp/abc && touch /tmp/abc/hehe
ls: cannot access /tmp/abc: No such file or directory
複製代碼
ls 很乾脆的說明找不到該目錄,但並無 touch 的錯誤,表示 touch 並無執行
管線命令 (pipe)
擷取命令: cut, grep
範例一:將 PATH 變量取出,我要找出第五個路徑。
[dmtsai@study ~]$ echo ${PATH}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
[dmtsai@study ~]$ echo ${PATH} | cut -d ':' -f 5
#如同上面的數字顯示,咱們是以「 : 」做爲分隔,所以會出現 /home/dmtsai/.local/bin
#那麼若是想要列出第 3 與第 5 呢?,就是這樣:
[dmtsai@study ~]$ echo ${PATH} | cut -d ':' -f 3,5
範例一:將 last 當中,有出現 root 的那一行就取出來;
[dmtsai@study ~]$ last|grep 'root'
範例二:與範例一相反,只要沒有 root 的就取出!
[dmtsai@study ~]$ last | grep -v 'root'
複製代碼
排序命令: sort, wc, uniq
範例一:我的賬號都記錄在 /etc/passwd 下,請將賬號進行排序。
[dmtsai@study ~]$ cat /etc/passwd | sort
範例一:使用 last 將賬號列出,僅取出賬號欄,進行排序後僅取出一位;
[dmtsai@study ~]$ last | cut -d ' ' -f1 | sort| uniq
範例一:那個 /etc/man_db.conf 裏面到底有多少相關字、行、字符數?
[dmtsai@study ~]$ cat /etc/man_db.conf | wc
131 723 5171
#輸出的三個數字中,分別表明: 「行、字數、字符數」
複製代碼
雙向重導向: tee
[dmtsai@study ~]$ last | tee last.list | cut -d " " -f1
複製代碼
這個範例可讓咱們將 last 的輸出存一份到 last.list 文件中;
字符轉換命令: tr, col, join, paste, expand
tr 能夠用來刪除一段訊息當中的文字,或者是進行文字訊息的替換!
複製代碼
範例一:將 last 輸出的訊息中,全部的小寫變成大寫字符:
[dmtsai@study ~]$ last | tr '[a-z]' '[A-Z]'
複製代碼
事實上,沒有加上單引號也是能夠執行的,如:「 last tr [a-z] [A-Z] 」
join 看字面上的意義 (加入/參加) 就能夠知道,他是在處理兩個文件之間的數據, 並且,
複製代碼
主要是在處理「兩個文件當中,有 "相同數據" 的那一行,纔將他加在一塊兒」的意思。
這個 paste 就要比 join 簡單多了!相對於 join 必需要比對兩個文件的數據相關性, paste 就
複製代碼
直接「將兩行貼在一塊兒,且中間以 [tab] 鍵隔開」
expand 這玩意兒就是在將 [tab] 按鍵轉成空白鍵啦。
複製代碼
分區命令: split
範例一:個人 /etc/services 有六百多K,若想要分紅 300K 一個文件時?
[dmtsai@study ~]$ cd / | split -b 300k /etc/services services
[dmtsai@study tmp]$ ll -k services*
-rw-rw-r--. 1 dmtsai dmtsai 307200 Jul 9 22:52 servicesaa
-rw-rw-r--. 1 dmtsai dmtsai 307200 Jul 9 22:52 servicesab
-rw-rw-r--. 1 dmtsai dmtsai 55893 Jul 9 22:52 servicesac
複製代碼
參數代換: xargs
關於減號 - 的用途
管線命令在 bash 的連續的處理程序中是至關重要的!另外,在 log file 的分析當中也是至關 重要的一環, 因此請特別留意!另外,在管線命令當中,經常會使用到前一個指令的 stdout 做爲此次的 stdin , 某些指令須要用到文件名稱 (例如 tar) 來進行處理時,該 stdin 與 stdout 能夠利用減號 "-" 來替代, 舉例來講:
[root@study ~]# mkdir /tmp/homeback
[root@study ~]# tar -cvf - /home | tar -xvf - -C /tmp/homeback
複製代碼
上面這個例子是說:「我將 /home 裏面的文件給他打包,但打包的數據不是紀錄到文件,而是 傳送到 stdout; 通過管線後,將 tar -cvf - /home 傳送給後面的 tar -xvf - 」。後面的這個 - 則 是取用前一個指令的 stdout, 所以,咱們就不須要使用 filename 了!這是很常見的例子喔! 注意注意!