【Linux】Shell使用

記錄命令歷史

我們敲過的命令,linux是會有記錄的,預設可以記錄1000條歷史命令這些命令保存在用戶的家目錄中的.bash_history文件中有一點需要你知道的是,只有當用戶正常退出當前shell時,在當前shell中運行的命令纔會保存至.bash_history文件中

與命令歷史有關的有一個有意思的字符那就是”!”常用的有這麼幾個應用:(1!! (連續兩個”!”),表示執行上一條指令;(2!n(這裏的n是數字),表示執行命令歷史中第n條指令,例如”!100”表示執行命令歷史中第100個命令;(3!字符串(字符串大於等於1),例如!ta,表示執行命令歷史中最近一次以ta爲開頭的指令

[image]

別名

前面也出現過alias的介紹,這個就是bash所特有的功能之一了我們可以通過alias把一個常用的並且很長的指令別名一個簡潔易記的指令如果不想用了,還可以用unalias解除別名功能直接敲alias會看到目前系統預設的alias 

[image]

看到了吧,系統預設的
alias指令也就這幾個而已,你也可以自定義你想要的指令別名。alias語法很簡單,alias [命令別名]=[’具體的命令’]。

作業控制

當運行一個進程時,你可以使它暫停(按Ctrl+z),然後使用fg命令恢復它,利用bg命令使他到後臺運行,你也可以使它終止(按Ctrl+c

變量

前面章節中筆者曾經介紹過環境變量PATH,這個環境變量就是shell預設的一個變量,通常shell預設的變量都是大寫的變量,說簡單點就是使用一個較簡單的字符串來替代某些具有特殊意義的設定以及數據就拿PATH來講,這個PATH就代替了所有常用命令的絕對路徑的設定因爲有了PATH這個變量,所以我們運行某個命令時不再去輸入全局路徑,直接敲命令名即可你可以使用echo命令顯示變量的值

[image]

除了PATH, HOME, LOGNAME外,系統預設的環境變量還有哪些呢?

[image]

使用env命令即可全部列出系統預設的全部系統變量了不過登錄的用戶不一樣這些環境變量的值也不一樣當前顯示的就是root這個賬戶的環境變量了下面筆者簡單介紹一下常見的環境變量:

PATH決定了shell將到哪些目錄中尋找命令或程序

HOME當前用戶主目錄

HISTSIZE歷史記錄數

LOGNAME當前用戶的登錄名

HOSTNAME指主機的名稱

SHELL前用戶Shell類型

LANG語言相關的環境變量,多語言可以修改此環境變量

MAIL當前用戶的郵件存放目錄

PWD當前目錄

env命令顯示的變量只是環境變量,系統預設的變量其實還有很多,你可以使用set命令把系統預設的全部變量都顯示出來

[image]

限於篇幅,筆者在上例中並沒有把所有顯示結果都截圖。set不僅可以顯示系統預設的變量,也可以連同用戶自定義的變量顯示出來用戶自定義變量?是的,用戶自己同樣可以定義變量

[image]

雖然你可以自定義變量,但是該變量只能在當前shell中生效,不信你再登錄一個shell試試?

[image]

使用bash命令即可再打開一個shell,此時先前設置的myname變量已經不存在了,退出當前shell回到原來的shellmyname變量還在那要想設置的變量一直生效怎麼辦?有兩種情況:

1 要想系統內所有用戶登錄後都能使用該變量

需要在/etc/profile文件最末行加入 “export myname=Aming” 然後運行”source /etc/profile”就可以生效了此時你再運行bash命令或者直接su - test賬戶看看

[image]

2)只想讓當前用戶使用該變量

需要在用戶主目錄下的.bashrc文件最後一行加入“export myname=Aming” 然後運行”source .bashrc”就可以生效了這時候再登錄test賬戶,myname變量則不會生效了上面用的source命令的作用是,講目前設定的配置刷新,即不用註銷再登錄也能生效

筆者在上例中使用”myname=Aming”來設置變量myname,那麼在linux下設置自定義變量有哪些規則呢?

a. 設定變量的格式爲”a=b”,其中a爲變量名,b爲變量的內容,等號兩邊不能有空格;

b. 變量名只能由英數字以及下劃線組成,而且不能以數字開頭;

c. 當變量內容帶有特殊字符(如空格)時,需要加上單引號;

[image]

有一種情況,需要你注意,就是變量內容中本身帶有單引號,這就需要用到雙引號了

[image]

d. 如果變量內容中需要用到其他命令運行結果則可以使用反引號;

[image]

e. 變量內容可以累加其他變量的內容,需要加雙引號;

[image]

在這裏如果你不小心把雙引號加錯爲單引號,將得不到你想要的結果

[image]

通過上面幾個例子也許你能看得出,單引號和雙引號的區別:用雙引號時不會取消掉裏面出現的特殊字符的本身作用(這裏的$),而使用單引號則裏面的特殊字符全部失去它本身的作用

在前面的例子中筆者多次使用了bash命令,如果在當前shell中運行bash指令後,則會進入一個新的shell,這個shell就是原來shell的子shell了,不妨你用pstree指令來查看一下

[image]

pstree這個指令會把linux系統中所有進程通過樹形結構打印出來限於篇幅筆者沒有全部列出,你可以直接輸入pstree查看即可在父shell中設定一個變量後,進入子shell後該變量是不會生效的,如果想讓這個變量在子shell中生效則要用到export指令,筆者曾經在前面用過

[image]

export其實就是聲明一下這個變量的意思,讓該shell的子shell也知道變量abc的值是123.如果export後面不加任何變量名,則它會聲明所有的變量

[image]

在最後面連同我們自定義的變量都被聲明瞭

前面光講如何設置變量,如果想取消某個變量怎麼辦?只要輸入”unset 變量名即可

[image]

unset abc後,再echo $abc則不再輸出任何內容

系統環境變量與個人環境變量的配置文件

上面講了很多系統的變量,那麼在linux系統中,這些變量被存到了哪裏呢,爲什麼用戶一登陸shell就自動有了這些變量呢?

/etc/profile :這個文件預設了幾個重要的變量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umas等等

/etc/bashrc :這個文件主要預設umask以及PS1。這個PS1就是我們在敲命令時,前面那串字符了,例如筆者的linux系統PS1就是 [root@localhost ~]# ,你不妨看一下PS1的值

[image]

\u就是用戶,\h 主機名, \W 則是當前目錄,\$就是那個’#’了,如果是普通用戶則顯示爲’$’

除了兩個系統級別的配置文件外,每個用戶的主目錄下還有幾個這樣的隱藏文件:

.bash_profile :定義了用戶的個人化路徑與環境變量的文件名稱每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次

.bashrc :該文件包含專用於你的shellbash信息,當登錄時以及每次打開新的shell,該該文件被讀取例如你可以將用戶自定義的alias或者自定義變量寫到這個文件中

.bash_history :記錄命令歷史用的

.bash_logout :當退出shell時,會執行該文件可以把一些清理的工作放到這個文件中

 

linux shell中的特殊符號

你在學習linux的過程中,也許你已經接觸過某個特殊符號,例如”*”,它是一個通配符號,代表零個或多個字符或數字下面筆者就說一說常用到的特殊字符

1. * :代表零個或多個字符或數字

[image]

test後面可以沒有任何字符,也可以有多個字符,總之有或沒有都能匹配出來

2. ? :只代表一個任意的字符

[image]

不管是數字還是字母,只要是一個都能匹配出來

3. # :這個符號在linux中表示註釋說明的意思,即”#”後面的內容linux忽略掉

[image]

在命令的開頭或者中間插入”#” linux都會忽略掉的這個符號在shell腳本中用的很多

4. \ :脫意字符,將後面的特殊符號(例如”*” )還原爲普通字符

[image]

5. | :管道符,前面多次說過,它的作用在於將符號前面命令的結果丟給符號後面的命令這裏提到的後面的命令,並不是所有的命令都可以的,一般針對文檔操作的命令比較常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等,其中grep, sed, awk爲正則表達式必須掌握的工具,在後續內容中詳細介紹

6. $ :除了用於變量前面的標識符外,還有一個妙用,就是和’!’結合起來使用

[image]

‘!$’表示上條命中中最後一個變量(也許稱爲變量不合適,總之就是上條命令中最後出現的那個東西)例如上邊命令最後是test.txt那麼在當前命令下輸入!$則代表test.txt。

1grep :過濾一個或多個字符,將會在後續內容中詳細介紹其用法

[image]

2) cut :截取某一個字段

語法:cut -d “分隔字符” [-cf] n 這裏的n是數字

-d :後面跟分隔字符,分隔字符要用雙引號括起來

-c :後面接的是第幾個字符

-f :後面接的是第幾個區塊

[image]

-d 後面跟分隔字符,這裏使用冒號作爲分割字符,-f 1 就是截取第一段,-f1之間的空格可有可無

[image]

-c 後面可以是1個數字n,也可以是一個區間n1-n2,還可以是多個數字n1,n2,n3

[image]

3) sort :用做排序

語法:sort [-t 分隔符] [-kn1,n2] [-nru] 這裏的n1 < n2

-t 分隔符 :作用跟cut-d一個意思

-n :使用純數字排序

-r :反向排序

-u :去重複

-kn1,n2 :由n1區間排序到n2區間,可以只寫-kn1,即對n1字段排序

[image]

[image]

[image]

4) wc :統計文檔的行數字符數詞數,常用的選項爲:

-l :統計行數

-m :統計字符數

-w :統計詞數

[image]

5 uniq :去重複的行,筆者常用的選項只有一個:

-c :統計重複的行數,並把行數寫在前面

[image]

有一點需要注意,在進行uniq之前,需要先用sort排序然後才能uniq,否則你將得不到你想要的,筆者上面的試驗當中已經是排序過所以省略掉那步了

6tee :後跟文件名,類似與重定向”>”,但是比重定向多了一個功能,在把文件寫入後面所跟的文件中的同時,還顯示在屏幕上

[image]

7tr :替換字符,常用來處理文檔中出現的特殊符號,如DOS文檔中出現的^M符號常用的選項有兩個:

-d :刪除某個字符,-d 後面跟要刪除的字符

-s :把重複的字符去掉

最常用的就是把小寫變大寫: tr ‘[a-z]’ ‘[A-Z]’

[image]

當然替換一個字符也是完全可以的

[image]

不過替換刪除以及去重複都是針對一個字符來講的,有一定侷限性如果是針對一個字符串就不再管用了,所以筆者建議只是簡單瞭解這個tr即可,以後你還會學到更多可以實現針對字符串操作的工具

[image]

8split :切割文檔,常用選項:

-b :依據大小來分割文檔,單位爲byte

[image]

格式如上例,後面的passwd爲分割後文件名的前綴,分割後的文件名爲passwdaa, passwdab, passwdac …

-l :依據行數來分割文檔

[image]

6.  :分號平時我們都是在一行中敲一個命令,然後回車就運行了,那麼想在一行中運行兩個或兩個以上的命令如何呢?則需要在命令之間加一個”;”

[image]

7. ~ :用戶的家目錄,如果是root則是 /root ,普通用戶則是 /home/username

[image]

8. & :如果想把一條命令放到後臺執行的話,則需要加上這個符號通常用於命令運行時間非常長的情況

[image]

使用jobs可以查看當前shell中後臺執行的任務fg可以調到前臺執行這裏的sleep命令就是休眠的意思,後面跟數字,單位爲秒,常用語循環的shell腳本中

[image]

此時你按一下CTRL +z 使之暫停,然後再輸入bg可以再次進入後臺執行

[image]

如果是多任務情況下,想要把任務調到前臺執行的話,fg後面跟任務號,任務號可以使用jobs命令得到

[image]

9. >, >>, 2>, 2>> :前面講過重定向符號以及>> 分別表示取代和追加的意思,然後還有兩個符號就是這裏的2>  2>> 分別表示錯誤重定向和錯誤追加重定向,當我們運行一個命令報錯時,報錯信息會輸出到當前的屏幕,如果想重定向到一個文本里,則要用2>或者2>>。

[image]

10. [ ] :中括號,中間爲字符組合,代表中間字符中的任意一個

[image]

11. &&  ||

在上面剛剛提到了分號,用於多條命令間的分隔符另外還有兩個可以用於多條命令中間的特殊符號,那就是 “&&””||”。下面筆者把這幾種情況全列出:

1) command1 ; command2

2) command1 && command2

3) command1 || command2

使用”;”時,不管command1是否執行成功都會執行command2 使用”&&”時,只有command1執行成功後,command2纔會執行,否則command2不執行;使用”||”時,command1執行成功後command2 不執行,否則去執行command2,總之command1command2總有一條命令會執行

[image]

 

以上參考原文:http://www.92csz.com/study/linux/12.htm

學習更多參考:http://www.92csz.com/study/linux/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章