Linux學(xué)習(xí)日記——BASH

一、認(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.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,716評(píng)論 0 5
  • 前言:操作系統(tǒng)就是一組軟件,控制著整個(gè)硬件與管理系統(tǒng)的活動(dòng)監(jiān)測(cè),為了這組軟件不被用戶錯(cuò)誤地使用,導(dǎo)致系統(tǒng)崩潰,就將...
    boker_han閱讀 338評(píng)論 0 0
  • 第11章 認(rèn)識(shí)與學(xué)習(xí) bash 標(biāo)簽: 鳥(niǎo)哥的linux私房菜 [toc] 11.1認(rèn)識(shí)bash這個(gè)shell 什...
    rockhand閱讀 455評(píng)論 1 2
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,260評(píng)論 2 33
  • 1、認(rèn)識(shí)BASH這個(gè)shell 1.1、硬件、核心與shell 通過(guò)shell將我們輸入的指令與Kernel溝通,...
    努力爬行中的蝸牛閱讀 286評(píng)論 0 0

友情鏈接更多精彩內(nèi)容