友情鏈接

第10章 shell基礎知識

shell腳本在日常的linux系統管理工作中是必不可少的,如果不會寫shell腳本,你就不算是一個合格的管理員。

11.1  什麼是shell

shell是系統跟計算機硬件交互時使用的中間介質,它只是系統的一個工具。實際上,在shell和計算機硬件之間還有一層東西——系統內核。用戶直接面對的不是計算機硬件而是shell,用戶把指令告訴shell,然後shell再傳輸給系統內核,接着內核再去支配計算機硬件去執行各種操作。

Red Hat/CentOS發行版默認安裝的shell版本是bash(Bourne Again Shell),它是sh(Bourne Shell)的增強版本。

10.1.1記錄歷史命令

我們執行過的命令linux都會記錄,預設可以記錄1000條命令。這些命令保存在用戶的家目錄的.bash_history文件中。但需要注意,只有當用戶正常退出當前shell時,在當前shell中運行的命令纔會保存至.bash_history文件中。

!是與命令歷史有關的一個特殊字符,常用應用有3個。

!!:連續兩個!表示執行上一條命令

!n:表示執行歷史命令中的第幾條命令

!字符串(字符串大於等於1):表示執行歷史命令中最近一次以字符串開頭的命令

10.1.2   命令和文件名補全

Tab鍵可以補全一個命令、路徑、或者一個文件名。連續按兩次tab鍵,系統則會把所有的命令或者文件名都列出來。

10.1.3   別名

alias是bash特有的功能之一,我們可以通過alias把一個常用的並且很長的指令另外取一個簡單易記的名字。如果不想用了,可以使用unalias命令解除別名功能。直接執行alias命令,會看到目前系統預設的別名。

自定義別名的格式:

alias [命令別名]=[‘具體的命令’]

10.1.4   通配符

在bash下,可以使用*匹配零個或多個字符,用?匹配一個字符。

10.1.5   輸入/輸出重定向

輸入重定向用於改變命令的輸入,輸出重定向用於改變命令的輸出。輸出重定向更常用,它經常用於將命令的結果輸入到文件中,而不是屏幕上。輸入重定向的命令是<,輸出重定向的命令是>,錯誤重定向的命令是2>以及追加重定向的命令是>>。

10.1.6   管道符

|用於將前一個指令的輸出作爲後一個指令的輸入。

實例1

命令:

cat /etc/passwd | wc -l

解釋:

查看/etc/passwd的行數

10.1.7   作業控制

當進行進程時,你可以使它暫停(按Ctrl+Z組合鍵),然後使用fg(foreground的簡寫)命令恢復它,或是利用bf(background的簡寫)命令使它到後臺運行。此外,你也可以使它終止(按Ctrl+C組合鍵)。

使用vi命令編輯test1.txt,隨便輸入一些內容,按Esc鍵後,使用Ctrl+Z組合鍵暫停任務。此時提示test1.txt已經停止了,然後使用fg命令恢復它,此時又進入剛纔的vi窗口了。再次使其暫停,然後輸入jobs,可以看到被暫停或者在後臺運行的任務。如果想把暫停的任務放在後臺重新運行,就是用bg命令。多個被暫停的任務會有編號,使用jobs命令可以看到兩個人物,使用bg命令或者fg命令時,則需要在後面加上編號。

如何關掉在後臺運行的任務呢?如果你沒有推出剛纔的shell,那麼應該先使用命令fg編號把任務調到前臺,然後Ctrl+C組合鍵結束任務。另一種情況,關閉當前的shell,再次打開另一個shell時,使用jobs命令並不會顯示在後臺運行或者被暫停的任務。要想關閉這些任務,則需要先知道它們的pid。使用&把任務放到後臺運行時,會顯示pid信息。如果忘掉這個pid,還可以使用ps aux命令找到那個進程。如果想結束該進程,需要使用kill命令。kill命令很簡單,直接在後面加pid即可。如果遇到結束不了的進程,可以在kill後面加一個選項,即kill -9 [pid]。

10.2  變量

環境變量PATH,它是shell預設的一個變量。通常,shell預設的變量都是大寫的。變量就是使用一個較簡單的字符串來代替某些具有特殊意義的設定以及數據。就拿PATH來講,這個PATH就代替了所有常用命令的絕對路徑的設定。有了PATH這個變量,我們運行某個命令時,就不需要再輸入全局路徑,直接輸入命令名即可。

實例1

10.2.1   命令env

使用env命令,可列出系統預設的全部系統變量。

登陸不同的用戶,這些環境變量的值也不同。

HOSTNAME:表示主機名稱

SHELL:當前用戶的shell類型

HISTSIZE:歷史記錄數

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

PATH:該變量決定了shell將到哪些目錄中尋找命令或者程序

PWD:當前目錄

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

HOME:當前用戶的家目錄

LOGNAME:當前用戶的登錄名

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

10.2.2   set命令

set命令不僅可以顯示系統預設的變量,也可以顯示用戶自定義的變量。

雖然可以自定義變量,但是該變量只能在當前shell中生效。使用bash命令可以再打開一個shell,此時先前設置的變量已經不存在了,退出當前的shell回到原來的bash,設定的變量還在。

想讓設置的變量環境一直有效的兩種情況如下:

情況一:

允許系統內所有用戶登錄後都能使用改變量。具體方法:在/etc/profile文件的最後一行加入export myname=Aming,然後運行source /etc/profile就可以生效了。此時再運行bash或者切換到其他賬戶就可以看到效果了。

情況二:

僅允許當前用戶使用該變量。具體方法:再用戶主目錄下的.bashrc文件的最後一行加入export myname=Aming,然後運行source /etc/profile就可以生效了。此時再運行bash就可以看到效果了。

這裏source的作用是將目前設定的配置刷新,即不用註銷再登陸也能生效。

在linux下自定義設置變量的規則如下:

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

2、變量名只能由字母、數字以及下劃線組成,而且不能以數字開頭。

3、當變量內容帶有特殊符號(如空格)時,需要加上單引號。

4、當變量內容中本身帶有單引號時,此時就需要加雙引號了。

5、當變量內容需要用到其他命令時,運行結果則可以使用反引號。

變量內容可以累加其他變量的內容,但需要加上雙引號。如果把雙引號錯加爲單引號,則不能得到想要的內容。

雙引號和單引號的區別:使用雙引號時,不會取消雙引號中特殊符號本身的作用,而使用單引號時,裏面的特殊字符將全部失去其本身的作用。

如在當前shell中運行bash命令,則會進入一個新的shell,這個shell就是原來shell的子shell。用pstree命令可以查看,如果pstree命令沒有安裝,可以通過yum install –y psmisc命令安裝。pstree會把linux系統中的所有進程以樹形結構顯示出來。在父shell中設定變量後,進入子shell時,該變量是不會生效的。如果想讓這個變量在子shell中生效,則要用到export指令。

其實export的作用就是聲明一下這個變量,讓該shell的子shell也知道該變量的值。設置變量之後,如果想取消這個變量,只要輸入unset 變量名即可。

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

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

10.3.2   /etc/bashrc:這個文件主要預設umask以及PS1.這個PS1就是我們在輸入命令時前面的那串字符。

\u指用戶,\h指主機名,\W指當前目錄,\$指字符#(如果是普通目錄,則顯示$),上面兩個是系統文件,各個用戶的主目錄下還有以下幾個隱藏文件。

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

10.3.4   .bashrc:該文件包含專屬於自己的shell的bash信息,當登錄或每次打開新的shell時,該文件會被讀取。

10.3.5   .bash_history:該文件用於記錄命令歷史。

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

10.4  linux shell中的特殊符號

10.4.1   *代表零個或多個任意字符

10.4.2   ?代表一個任意的字符

10.4.3   註釋符號#

#後面的內容都會被忽略

10.4.4脫義字符\

這個字符會將後面的特殊符號(如*)還原爲普通字符。

10.4.5   管道符

它的作用是將前面命令的輸出作爲後面命令的輸入,這裏提到的前面的命令並不是所有的命令都可以,一般針對文檔操作的命令比較常用。例如cat、less、head、tail、grep、cut、sort、wc、uniq、tee、tr、split、sed、awk等,其中grep、sed、awk是正則表達式必須掌握的工具。

10.4.6   命令cut

cut命令用來截取某一字段,其格式爲

cut –d  ‘分隔符’ [-cf] n,這裏的n是數字。該命令有如下選項:

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

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

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

實例1

命令:

head -n5 /etc/passwd | cut -d ':' -f 1

解釋:

截取/etc/passwd的第一段

-d選項後面加冒號作爲分隔符,-f 1表示截取第一段,-f和1之間的空格可有可無。

實例2

-c選項後可以是1個數字n,也可以是一個區間n1-n2,還可以是多個數字n1、n2和 n3。

命令:

head -n2 /etc/passwd | cut -c1-10

解釋:

截取/etc/passwd前兩句的第1到10個字符

實例3

命令:

head -n2 /etc/passwd | cut -c1,3,10

解釋:

截取/etc/passwd前兩句的第1,3,10三個字符

10.4.7   命令sort

sort命令用作排序,其格式爲:

sort [-t 分隔符] [-kn1,n2] [-nru],這裏的n1和n2指的是數字,其他選項的含義如下。

-t:後面跟分隔符,作用跟cut的-d選項一樣

-n:表示使用純數字排序。

-r:表示反向排序。

-u:表示去重複。

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

如果sort不加任何選項,則從首字符向後依次按ASCII碼值進行比較,最後將它們按升序輸出。

實例1

命令:

head -n5 /etc/passwd | sort

解釋:

/etc/passwd的前5行從首字符向後依次按ASCII碼值進行比較,最後將它們按升序輸出。

實例2

命令:

head -n5 /etc/passwd | sort -t: -k3 –n

解釋:

/etc/passwd的前5行,以冒號爲分隔符,按純數字對第3個區域進行排序。

實例3

-k選項後面跟數字n1和n2表示對第n1和n2區域內的字符串排序,-r選項則表示反向排序。

命令:

head -n5 /etc/passwd | sort -t: -k3,5 -r

解釋:

/etc/passwd的前5行,以冒號爲分隔符,對第3到第5區域內的字符串進行反向排序

10.4.8   命令wc

wc用於統計文檔的行數、字符數或詞數。該命令的常用選項有-l(統計行數)、-m(統計字符數)、-w(統計詞數)

10.4.9   命令uniq

命令uniq用來刪除重複的行,該命令只有-c選項常用,它表示統計重複的行數,並把行數寫在前面。

實例1

使用uniq前,必須先給文件排序,否則不管用

命令:

sort testb.txt | uniq -c

解釋:

給testb.txt排序,然後統計重複的行數

10.4.10  命令tee

命令tee後面跟文件名,其作用類似於重定向>,但它比重定向多一個功能,即把文件寫入後面所跟的文件時,還顯示在屏幕上。該命令常用於管道符|後。

實例1

命令:

解釋:

將aaaaaaaa添加到testb.txt中並在屏幕上顯示出來

10.4.11  命令tr

tr命令用於替換字符,常用來處理文檔中出現的特殊符號,如DOS文檔中出現的符號^M。該命令常用的選項有以下兩個。

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

-s:表示刪除重複的字符

實例1

tr命令常用於把小寫字母變成大寫字母,如tr ‘[a-z]’ ‘[A-Z]’。

命令:

head -n2 /etc/passwd | tr '[a-z]' '[A-Z]'

解釋:

把/etc/passwd的前兩行小寫變大寫

實例2

tr命令還可以替換一個字符

命令:

grep  ‘root’ /etc/passwd | tr ‘r’ ‘R’

解釋:

把/etc/passwd中有root字符串的行找出來,並把r編程R。

注:不過,替換、刪除以及去重複等操作都是針對一個字符來講的,有一定的侷限性。如果是針對一個字符串,就不能用了,這個命令只需要簡單瞭解一下即可。

10.4.12  命令split

split命令用於切割文檔,常用的選項爲-b和-l。

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

實例1

命令:

解釋:

以500byte爲單位來分割/etc/passwd文檔

注:如果split不指定目標文件名,則會以xaa、xab……這樣的文件名來存取切割後的文件。當然,我們也可以指定目標文件名。

實例2

命令:

解釋:

以500byte爲單位來分割/etc/passwd文檔,並制定文件名爲123

-l:表示依據行數來分割。

實例3

命令:

解釋:

以10行來分割passwd

10.4.13  特殊符號$

符號$可以用作變量前面的標識符,還可以和!結合起來使用。

實例1

命令:

解釋:

!$表示上條命令中的最後一個變量。

10.4.14  特殊符號;

如果想要在一行中輸入兩個以上的命令,需要在命令之間加;。

實例1

命令:

10.4.15  特殊符號~

符號~表示用戶的家目錄,root用戶的家目錄是/root,普通用戶則是/home/username。

實例1

命令:

10.4.16  特殊符號&

如果想把一條命令放在後臺執行,則需要加上符號&。它通常用於命令運行時間較長的情況。

實例1:

命令:

10.4.17  重定向符號

重定向符號>和>>,表示取代和追加的意思。當我們運行一個命令報錯時,報錯信息會輸出到當前屏幕。如果想重定向到一個文本,則要用重定向符號2>或者2>>,它們分別表示錯誤重定向和錯誤追加重定向。

實例1

命令:

10.4.18  中括號[]

中括號內爲字符組合,代表字符組合中的任意一個,可以是一個範圍(1-3,a-z)。

實例1

命令:

10.4.19  特殊符號&&和||

用於多條命令中間的特殊符號有;、&&、||。

command1; command2

command1&&command2

command1|| command2

使用;時,不管command1是否執行成功,都會執行command2。

使用&&時,只用command1執行成功,command2纔會執行,否則command2不執行。

使用||時,command1執行成功後則command2不執行,否則執行command2,即command1和command2中總有一條命令去執行。

只有當ls test2成功執行後,纔會執行touch test2。因爲test2不存在,所以ls test2沒有執行成功,所有&&後面的touch test2並沒有執行。

如ls test2執行不成功,則會執行touch test2。因爲test2不存在,所以ls test2沒有執行成功,轉而執行||後面的touch test2,所以增加了test2這個文件。


友情鏈接:阿銘linux

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