shell基礎知識

shell基礎知識
(1)記錄命令歷史

我們執行的命令Linux都會記錄,這些命令保存在用戶的家目錄的 .bash_history文件中。只有當用戶正常退出當前shell時,在當前shell中運行的命令纔會保存至 .bash_history文件中。

!是與命令歷史有關的一個特殊字符,該字符常用的應用有以下3個。
  • !!:連續兩個!表示執行上一條指令。
    在這裏插入圖片描述
  • !n:這裏的n是數字,表示執行命令歷史中的第n條指令。(!101表示執行命令歷史中的第101個命令)在這裏插入圖片描述
  • !字符串(字符串大於等於1):例如!pw表示執行命令歷史中最近一次以pw開頭的命令。如圖。在這裏插入圖片描述
(2)命令和文件名補全

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

(3)別名

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

在這裏插入圖片描述
另外,可以自定義命令的別名,其格式爲alias[命令別名]=[‘具體的命令’],如圖。
在這裏插入圖片描述

(4)通配符
在bash下,可以使用*來匹配零個或多個字符,用?匹配一個字符,如圖。

在這裏插入圖片描述

(5)輸入/輸出重定向

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

在這裏插入圖片描述

(6)管道符
管道符 | ,它用於將前一個指令的輸出作爲後一個指令的輸入。
(7)作業控制
當運行進程時,你可以使它暫停(Ctrl+Z組合鍵),然後使用fg(foreground的簡寫)命令恢復它,或是利用bg(background的簡寫)命令使它到後臺運行。此外,也可以使它終止(Ctrl+C組合鍵)。

#vi test1.txt
testtesttest111

使用vi命令編輯test1.txt,隨便輸入一些內容,按Esc鍵後,使用Ctrl+Z組合鍵暫停任務,如圖。在這裏插入圖片描述
此時提示 vi test1.txt已經停止了,然後使用fg命令恢復它,此時又進入剛纔的vi窗口。再次使其暫停,然後輸入jobs,可以看到被暫停或者在後臺運行的任務,如圖。

在這裏插入圖片描述
如果想把暫停的任務放在後臺重新運行,就使用bg命令。

#bg
[1]+ vi test1.txt &
[1]+ Stopped vi test1.txt

但是vi似乎並不支持在後臺運行,於是換一個其他命令。

#vmstat 1 > /tmp/1.log
^Z //此處按Ctrl+z
[2]+ Stopped vmstat 1> /tmp/1.log
#jobs
[1]- Stopped vi test1.txt
[2]+Stopped vmstat 1 > /tmp/1.log
#bg 2
[2]+ vmstat 1 > /tmp/1.log &

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

在這裏插入圖片描述

(1)命令env
使用env命令,可列出系統預設的全部系統變量,如圖。(截了一部分)

在這裏插入圖片描述
登陸不同的用戶,這些環境變量的值也不同。當前顯示的是root賬戶的環境變量。以下是常見的環境變量。

  • HOSTNAME:表示主機的名稱
  • SHELL:表示當前用戶的shell類型
  • HISTSIZE:表示歷史記錄數
  • MAIL:表示當前用戶的郵件存放目錄
  • PATH:該變量決定了shell將到哪些目錄中尋找命令或程序
  • PWD:表示當前目錄
  • LNAG:這是與語言相關的環境變量,多語言環境可以修改此環境變量
  • HOME:表示當前用戶的家目錄
  • LOGNAME:表示當前用戶的登陸名
    env命令顯示的變量只是環境變量,系統預設的變量其實還有很多,可以使用set命令把系統預設的全部變量都顯示出來。
(2)命令set
set命令和env命令相似(只列出了前10行,截了一部分)

在這裏插入圖片描述
set命令不僅可以顯示系統預設的變量,也可以顯示用戶自定義的變量,如圖。
在這裏插入圖片描述
雖然可以自定義變量,但是該變量只能在當前shell中生效,如圖。在這裏插入圖片描述
使用bash命令可以再打開一個shell,此時先前設置的myname變量已經不存在了,退出當前的shell回到原來的shell,myname變量還在。如果想讓設置的環境變量一直生效,如圖。

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

#echo “export myname=liao” >> /etc/profile
#source /etc/profile
#bash
#echo $myname
liao
#exit
exit
#su test
$ echo $myname
liao

  • 僅允許當前用戶使用該變量。具體的操作方法是:是用戶主目錄下的 .bashrc文件的最後一行加入export myname=liao,然後運行source .bashrc就可以生效了。這時再登陸test賬戶,myname變量則不會生效了。
系統環境變量與個人環境變量的配置文件
  • /etc/profile:這個文件預設了幾個重要的變量,例如PATH、USER、LOGNAME、INPUTRC、MAIL、HOSTNAME、HISTSIZE、umask等
  • /etc/bashrc:這個文件主要預設umask以及PS1。這個PS1就是我們在輸入命令時前面的那串字符。例如,Linux系統的PS1就是[root@localhost~]#。

echo $PS1
[\u@\h \w]$
其中,\u指用戶,\h指主機名,\w指當前目錄,$指字符#(如果是普通用戶,則顯示爲$)

  • .bash_profile:該文件定義了用戶的個性化路徑與環境變量的文件名稱。每個用戶都可以使用該文件輸入專屬於自己的shell信息,當用戶登陸時,該文件僅僅執行一次。
  • .bashrc:該文件包含專屬於自己的shell的bash信息,當登陸或每次打開新的shell時,該文件被讀取。
  • .bash_history:該文件用於記錄命令歷史。
  • .bash_logout:當退出shell時,會執行該文件。可以將一些清理的工作放到這個文件中。
Linux shell中的特殊符號
(1)*代表零個或多個任意字符

在這裏插入圖片描述

(2)?只代表一個任意字符
不管是數字還是字母,只要是一個字符,都能匹配出來。
(3)註釋符號#
表示註釋說明,即#後面的內容都會被忽略。

#abc=123 #asdsds
#echo $abc
123

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

在這裏插入圖片描述

(5)管道符|
它的作用是將前面命令的輸出作爲後面命令的輸入。這裏提到的後面的命令,並不是所有的命令都可以,一般針對文檔操作的命令比較常用。例如cat、less、head、grep、cut、sed、awk等。(wc -l用來計算一個文檔有多少行)

#cat test.txt |wc -l
0

(6)命令cut
cut命令用來截取某一個字段,其格式爲 cut -d ' 分隔字符 ' [-cf] n,這裏的n是數字。
  • -d:後面跟分隔字符,分隔字符要用單引號括起來
  • -c:後面跟的是第幾字符
  • -f:後面跟的是第幾區塊
    如圖

在這裏插入圖片描述

(7)命令sort
sort命令用做排序,其格式爲 sort [-t 分隔符] [-kn1,n2] [-nru],這裏n1和n2指的是數字
  • -t:後面跟分隔字符
  • -n:表示使用純數字排序
  • -r:表示反向排序
  • -u:表示去重複
  • -kn1,n2:表示由n1區間排序到n2區間,可以只寫-kn1,即對n1字段排序

sort不加任何選項,則從首字符向後依次按ASCII碼進行比較,最後將它們按升序輸出。在這裏插入圖片描述
-t後面跟分隔符,-k後面跟單個數字表示對第幾個區域的字符串排序,-n則表示使用純數字排序,如圖。在這裏插入圖片描述
-k後面跟數字n1和n2表示對第n1和第n2區域內的字符串排序,-r則表示反向排序,(-k3,5表示對第3區域至第5區域的字符串排序)如圖。

在這裏插入圖片描述

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

在這裏插入圖片描述

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

#vi test.txt \把下面的內容寫入test.txt並保存
111
222
111
333

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

在這裏插入圖片描述

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

在這裏插入圖片描述

(11)命令tr
tr命令用於替換字符,常用來處理文檔中出現的特殊符號。
  • -d:表示刪除某個字符,後面跟要刪除的字符
  • -s:表示刪除重複的字符
    tr命令常用於把小寫字母變成大寫字母,如 tr ‘[a-z]’ ‘[A-Z]’

#head -n2 /etc/passwd |tr ‘[a-z]’ ‘[A-Z]’
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN

tr命令還可以替換一個字符。不過替換、刪除以及去重複等操作都是針對一個字符來講的,有一定的侷限性,如果針對一個字符串,就不能再使用了。

(12)命令split
split命令用於切割文檔,常用 -b和 -l。
  • -b:表示依據大小來分割文檔,單位爲byte,如圖。

在這裏插入圖片描述
如果split不指定目標文件名,則會以xaa、xab…這樣的文件名來存取切割後的文件。我們也可以指定目標文件名,如圖。

在這裏插入圖片描述

  • -l:表示依據行數來分割文檔,如圖。

在這裏插入圖片描述

(13)特殊符號$
符號$可以用作變量前面的標識符,還可以和!結合起來使用,如圖。(!$表示上一條命令中的最後一個變量)

在這裏插入圖片描述

(14)特殊符號 ;
一般我們都是一行輸入一個命令,然後回車就運行了。如果想在一行中運行兩個或多個命令,需要在命令之間加符號 ;,如圖。

在這裏插入圖片描述

(15)特殊符號 ~
符號~表示用戶的家目錄,root用戶的家目錄是/root,普通用戶則是/home/username,如圖。

在這裏插入圖片描述

(16)特殊符號 &
如果想把一條命令放到後臺執行,則需要加上符號&,通常用於命令運行時間較長的情況。比如,可以用在sleep後,如圖。

在這裏插入圖片描述

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

#ls abc123
ls:無法訪問abc123:沒有那個文件或目錄
#ls abc123 2> /tmp/test123
#cat /tmp/test123
ls:無法訪問abc123:沒有那個文件或目錄
#ls abc123 2>> /tmp/test123
#cat /tmp/test123
ls:無法訪問abc123:沒有那個文件或目錄
ls:無法訪問abc123:沒有那個文件或目錄

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

在這裏插入圖片描述

(19)特殊符號&&和| |
前面分號可作爲多條命令間的分隔符,其實&&和| |也可以用於多條命令中間的特殊符號。
  • command1 ;command2
  • command1 && command2
  • command1 | | command2
  • 使用;時,不管command1是否執行成功,都會執行command2。
  • 使用&&時,只有command1執行成功後,command2纔會執行,否則command2不執行。
  • 使用 | |時,command1執行成功後則command2不執行,否則執行command2,即command1和command2中總有一條命令會執行。

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

在這裏插入圖片描述
當ls test3執行不成功,則會執行touch test3。因爲test3不存在,所以ls test3沒有執行成功,轉而執行| |後面的touch test3,所以增加了test3這個文件。

在這裏插入圖片描述

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