前言
只有光頭才能變強
這個學期開了Linux的課程了,授課的老師也是比較負責任的一位。總的來說也算是比較系統地學習了一下Linux了~~~
本文章主要是總結Linux的基礎操作以及一些簡單的概念~如果不熟悉的同學可下個Linux來玩玩(或者去買一個伺服器玩玩【學生版的不是很貴】),對於開發者來說,能使用Linux做一些基本的操作是必要的!
那麼接下來就開始吧,當然了我的Linux僅僅是入門水平,如果有錯的地方還需請大家多多包涵,並不吝在評論區指出錯誤~
一、為什麼我們要學習Linux
相信大部分人的PC端都是用Windows系統的,那我們為什麼要學習Linux這個作業系統呢???Windows圖形化介面做得這麼好,日常基本使用的話,學習成本幾乎為零。
而Linux不一樣,可能剛接觸Linux的人會認為:Linux好麻煩哦,不好玩,都是字元介面。不直觀、這個破系統是用來幹嘛的~~
日常用的話Windows是比較順手的,但是我們要知道的是:我們開發出來的程式一般都是放在Linux下執行的。
那可能就會有人提出疑問了:Windows同樣是作業系統,為啥要放在Linux下,而不放在Windows下呢??相信Windows也是可以執行我們寫出來的程式的。
我總結了Linux的幾個優點:
- 免費
- 很多軟體原生是在Linux下執行的,龐大的社群支援,生態環境好。
- 開源,可被定製,開放,多使用者的網路作業系統。
- 相對安全穩定
參考資料:
所以開發者選擇了Linux來跑我們自己寫出來的程式。
二、Linux的基礎知識
Linux系統的組成:
- linux核心(linus 團隊管理)
- shell:使用者與核心互動的介面
- 檔案系統:ext3、ext4等。windows 有 fat32 、ntfs
- 第三方應用軟體
2.1Shell的基本知識
除了Shell、其他的都應該挺好懂的,那麼Shell是什麼東西呢???
Shell是系統的使用者介面,提供了使用者與核心進行互動操作的一種介面(命令直譯器)
Shell可以執行:
- 內部命令
- 應用程式
- shell指令碼
使用type
命令可以區分內部命令和外部命令
於是乎,我們利用Shell就可以幹下面這些事了:
- 命令列解釋(這是用得最多的!)
- 命令的多種執行順序
- 萬用字元( wild-card characters )
- 命令補全、別名機制、命令歷史
- I/O重定向( Input/output redirection )
- 管道( pipes )
- 命令替換(
- Shell程式語言( Shell Script )
Shell的主要版本有以下這麼多:
- 我們常用(預設)的就是bash(bourne again shell)
使用ps
命令觀察正在執行的shell
2.2Linux基本目錄結構
在Windows下,會有基本的目錄結構的:
Linux下也不例外了,也是有基本的目錄結構的:
Linux 檔案系統是一個目錄樹的結構,檔案系統結構從一個根目錄開始,根目錄下可以有任意多個檔案和子目錄,子目錄中又可以有任意多個檔案和子目錄
- bin 存放二進位制可執行檔案(ls,cat,mkdir等)
- boot 存放用於系統引導時使用的各種檔案
- dev 用於存放裝置檔案
- etc 存放系統配置檔案
- home 存放所有使用者檔案的根目錄
- lib 存放跟檔案系統中的程式執行所需要的共享庫及核心模組
- mnt 系統管理員安裝臨時檔案系統的安裝點
- opt 額外安裝的可選應用程式包所放置的位置
- proc 虛擬檔案系統,存放當前記憶體的對映
- root 超級使用者目錄
- sbin 存放二進位制可執行檔案,只有root才能訪問
- tmp 用於存放各種臨時檔案
- usr 用於存放系統應用程式,比較重要的目錄/usr/local 本地管理員軟體安裝目錄
- var 用於存放執行時需要改變資料的檔案
2.3命令基本格式
cmd [options] [arguments]
,options稱為選項,arguments稱為引數
選項和引數都作為Shell命令執行時的輸入,它們之間用空格分隔開。
- Linux是區分大小寫的
一般來說,後面跟的選項如果單字元選項前使用一個減號-
。單詞選項前使用兩個減號--
- 這是一般的情況,有些命令還是不歸屬這種規律的(相對較少)~~~
- 例子:
ls -a
和ls -all
,a
單個字元使用一個-
,一個單詞all
使用兩個--
在Linux中,可執行的檔案也進行了分類:
- 內建命令:出於效率的考慮,將一些常用命令的解釋程式構造在Shell內部。
- 外接命令:存放在/bin、/sbin目錄下的命令
- 實用程式:存放在/usr/bin、/usr/sbin、/usr/share、/usr/local/bin等目錄下的實用程式
- 使用者程式:使用者程式經過編譯生成可執行檔案後,可作為Shell命令執行
- Shell指令碼:由Shell語言編寫的批處理檔案,可作為Shell命令執行
2.4萬用字元
學過一些正規表示式的或者有點基礎的同學對萬用字元應該就不陌生的了,在Linux也有萬用字元(在搜尋的時候挺有用的)
- *:匹配任何字元和任何數目的字元
- ?:匹配單一數目的任何字元
- [ ]:匹配[ ]之內的任意一個字元
- [! ]:匹配除了[! ]之外的任意一個字元,!表示非的意思
2.5檔案的型別
在Linux下檔案的型別有這麼多:
-
普通檔案
-
-
目錄
d
-
符號連結
l
- 硬連結: 與普通檔案沒什麼不同,inode 都指向同一個檔案在硬碟中的區塊
- 軟連結: 儲存了其代表的檔案的絕對路徑,是另外一種檔案,在硬碟上有獨立的區塊,訪問時替換自身路徑(簡單地理解為 Windows 中常見的快捷方式)。
- 字元裝置檔案
c
- 塊裝置檔案
b
- 套接字
s
- 命名管道
p
我們常見的就是普通檔案,目錄和符號連結。其他的瞭解一下即可~
符號連結參考資料:
2.5.1使用者主目錄
可能在網上查閱資料的時候會出現使用者主目錄這麼一個名詞,那他是什麼呢???
前面已經說了,我們的Linux是多使用者的網路系統!所以,我們可以在Linux下建立多個使用者,每個使用者都會有自己專屬的空間。
- 所以,在建立使用者時,系統管理員會給每個使用者建立一個主目錄,通常在
/home/
目錄下 - 比如:使用者osmond的主目錄為:
/home/osmond
使用者對自己主目錄的檔案擁有所有權,可以在自己的主目錄下進行相關操作。
三、常用的命令
上面說了一堆的基礎概念,這是給我們敲命令之前打了一點基礎,在敲命令的同時也會遇到一些比較重要的知識點的。那就到時候再說說了~~~
3.1常用的檔案、目錄操作命令
這是我們使用得最多的命令了,Linux最基礎的命令!
- 可用
pwd
命令檢視使用者的當前目錄 - 可用
cd
命令來切換目錄 -
.
表示當前目錄 -
..
表示當前目錄的上一級目錄(父目錄) -
-
表示用 cd 命令切換目錄前所在的目錄 -
~
表示使用者主目錄的絕對路徑名
絕對路徑:
- 以斜線(/)開頭 ,描述到檔案位置的完整說明 ,任何時候你想指定檔名的時候都可以使用
相對路徑 :
- 不以斜線(/)開頭 ,指定相對於你的當前工作目錄而言的位置 ,可以被用作指定檔名的簡捷方式
tips:輸入命令的時候要常用tab鍵來補全
-
ls
:顯示檔案或目錄資訊 -
mkdir
:當前目錄下建立一個空目錄 -
rmdir
:要求目錄為空 -
touch
:生成一個空檔案或更改檔案的時間 -
cp
:複製檔案或目錄 -
mv
:移動檔案或目錄、檔案或目錄改名 -
rm
:刪除檔案或目錄 -
ln
:建立連結檔案 -
find
:查詢檔案 -
file/stat
:檢視檔案型別或檔案屬性資訊 -
cat:
檢視文字檔案內容 -
more:
可以分頁看 -
less:
不僅可以分頁,還可以方便地搜尋,回翻等操作 -
tail -10
: 檢視檔案的尾部的10行 -
head -20
:檢視檔案的頭部20行 -
echo
:把內容重定向到指定的檔案中 ,有則開啟,無則建立 -
管道命令 |
:將前面的結果給後面的命令,例如:ls -la | wc
,將ls的結果加油wc命令來統計字數 -
重定向 > 是覆蓋模式,>> 是追加模式
,例如:echo "Java3y,zhen de hen xihuan ni" > qingshu.txt
把左邊的輸出放到右邊的檔案裡去
學了這些命令我們能幹嘛?其實就是在Windows下複製檔案、貼上檔案、建立檔案、檢視檔案這幾種~~~
3.1.1常用的檔案、目錄操作練習題
鞏固一下基礎,來做做題目:
- (1)Linux的shell程式預設是
bash 程式
; - (2)Linux命令格式包含三個部分,分別是:
命令
、選項
、引數
; - (3)Linux命令選項前為單個減號(-),後面一般為
單字元
,選項前為雙減號(–),後面一般為單詞
; - (4)Linux命令中使用的萬用字元有
? * []
; - (5)命令 ls /usr/bin/w* 的效果是
列出指定目錄下的所有以w開頭的檔案或目錄
; - (6)命令 ls /usr/bin/w?? 的效果是
列出指定目錄下的以w開頭名稱長度為3的所有檔案或目錄
; - (7)命令 ls /usr/bin/[xyz]* 的效果是
列出指定目錄下的檔名以x或y或z開頭的所有檔案或目錄
; - (8)命令 ls /usr/bin/[!a-h]* 的效果是
列出指定目錄下的檔名不以a到h區間字母開頭的所有檔案或目錄
; - (9)目錄操作時,“.” 表示
當前目錄
; - (10)目錄操作時,“..” 表示
上一級目錄
; - (11)目錄操作時,“-” 表示
上一次工作目錄
; - (12)目錄操作時,“~” 表示
使用者主目錄
; - (13)命令ln可以建立檔案連結,這種連結分為:
硬連結
和軟連結
; - (14)命令touch可以改變檔案的三種時間,分別是:
access time
、modify time
、change time
;
進入/tmp目錄,建立一個檔案,goldXX(XX為學號的末兩位),檢視檔案的時間
在賬戶的主目錄中,建立一個dog目錄,進入dog目錄後,建立一個catXX(XX為學號的末兩位)目錄,進入catXX目錄,顯示當前目錄;然後返回上一級目錄,刪除catXX目錄;
複製/etc/passwd檔案到賬戶主目錄,修改賬戶主目錄下passwd為passwdXX(XX為學號的末兩位)
查詢檔名叫做zcat的檔案;複製該檔案到/tmp目錄;用長格式列出該檔案;然後刪除/tmp目錄下的所有檔案,並檢查檔案是否已被刪除
複製/etc/hosts檔案到賬戶主目錄下;在賬戶主目錄中建立一個硬連結檔案(檔名為hostsYYY(YYY為學生姓名拼音縮寫)),連結到主目錄下的hosts檔案;分別檢視hosts和hostsYYY的檔案的inode資訊
複製/usr/bin/vdir檔案到賬戶主目錄下;在賬戶主目錄中建立一個軟連結檔案(檔名為newdir),連結到主目錄下的vdir檔案;分別檢視vdir和newdir的檔案的inode資訊
用長格式列出目錄/usr/bin目錄下的所有檔案,輸出重新定向到檔案outXX(XX為學生學號末兩位),檢查結果;用長格式列出目錄/etc目錄下的所有檔案,輸出結果補充到檔案outXX末尾
用長格式列出/usr/bin目錄下的所有檔案,通過管道與more命令連線,實現對檔案列表的瀏覽
>和>>
有何區別?
答:>
是覆蓋方式重定向到新的檔案;>>
是以補充方式,新增到原檔案的末尾。
通過管道和more命令,瀏覽檔案列表方便在哪裡?
答:對於檔案列表超出一個螢幕顯示的情況,這種方式可以分屏瀏覽,比較方便。
3.2檔案打包和壓縮命令
在Windows作業系統下,我們會使用WinRAR或者快壓等等的壓縮軟體來進行壓縮或者解壓。
在Linux下當然也存在壓縮或解壓的操作咯,下面我們就來學習一下在Linux下是怎麼壓縮和解壓的!
壓縮的方式也是有好幾種,我們常用的有下面這三種:
- gzip
- bzip2
- tar
常用的壓縮的命令就有:
gzip filename
bzip2 filename
tar -czvf filename
常用的解壓命令有:
gzip -d filename.gz
bzip2 -d filename.bz2
tar -xzvf filename.tar.gz
3.3正規表示式+grep
上面我們已經學過了cat、more、less、tail
這些檢視文字檔案的命令了,但是我想快速檢視這個文字檔案下的某些關鍵字是否存在,那怎麼辦???
在Windows下就比較簡單的,幾乎所有的文字編輯器(記事本)都支援CTRL+F
,往裡面輸入關鍵字就可查詢出來:
那在Linux下,沒有圖形介面,沒有CTRL+F
的情況下,如果不懂一些命令的話,那還真是難找對應的字元出來。下面我就來說說如何快速查詢一個文字檔案下的某些字元。
3.3.1正規表示式
首先我們就來說說正規表示式,如果接觸過的同學就知道:這玩意並不好記。一旦不用就很容易就忘記了,所以只能在用的時候查查了~~~所以下面我就直接給出一些規則了,不多說啦。
3.3.2grep命令
grep(global search regular expression)是一個強大的文字搜尋工具。grep 使用正規表示式搜尋文字,並把匹配的行列印出來。
格式:grep [options] PATTERN [FILE...]
- PATTERN 是查詢條件:可以是普通字串、可以是正規表示式,通常用單引號將RE括起來。
- FILE 是要查詢的檔案,可以是用空格間隔的多個檔案,也可是使用Shell的萬用字元在多個檔案中查詢PATTERN,省略時表示在標準輸入中查詢。
- grep命令不會對輸入檔案進行任何修改或影響,可以使用輸出重定向將結果存為檔案
例子:
-
在檔案 myfile 中查詢包含字串 mystr的行
grep -n mystr myfile
-
顯示 myfile 中第一個字元為字母的所有行
grep `^[a-zA-Z]` myfile
-
在檔案 myfile 中查詢首字元不是 # 的行(即過濾掉註釋行)
grep -v `^#` myfile
-
列出/etc目錄(包括子目錄)下所有檔案內容中包含字串“root”的檔名
grep -lr root /etc/*
用grep查詢/etc/passwd檔案中以a開頭的行,要求顯示行號;查詢/etc/passwd檔案中以login結束的行;
3.4幾種提高工作效率的方法
-
自動補全命令
- TAB鍵
-
歷史命令
- 上下箭頭鍵
- 別名alias
這裡感覺要說說的就只有別名alias了,我們下面看看例子就懂了!
顯示shell當前已經定義的別名;執行其中的兩個定義別名的命令;定義一個別名grep,要求其採用彩色方式顯示結果
3.5Shell變數 和 Shell環境
在Windows下有使用者的環境變數,系統的環境變數。在Linux一樣也是有的。
Shell 變數大致可以分為三類:
-
內部變數:由系統提供,使用者只能使用不能修改。
- ?
- GROUPS
- 環境變數:這些變數決定了使用者工作的環境,它們不需要使用者去定義,可以直接在 shell 中使用,其中某些變數使用者可以修改。
-
使用者變數:由使用者建立和修改,在 shell 指令碼編寫中會經常用到。
-
變數賦值(定義變數)
varName=Value
export varName=Value
- 引用變數
$varName
-
Shell變數的作用域:
- 區域性變數的作用範圍僅僅限制在其命令列所在的Shell或Shell指令碼檔案中;
- 全域性變數的作用範圍則包括本Shell程式及其所有子程式。
- 區域性變數與全域性變數互換:可以使用
export
內建命令將區域性變數設定為全域性變數。 可以使用export
內建命令將全域性變數設定為區域性變數。
export命令:
-
顯示當前Shell可見的全域性變數
export [-p]
-
定義變數值的同時宣告為全域性變數。
export <變數名1=值1> [<變數名2=值2> ...]
-
宣告已經賦值的某個(些)區域性變數為全域性變數。
export <變數名1> [<變數名2> ...]
-
宣告已經賦值的某個(些)全域性變數為區域性變數。
export -n <變數名1> [<變數名2> ...]
Shell環境變數:
- 環境變數定義 Shell 的執行環境,保證 Shell 命令的正確執行。
- Shell用環境變數來確定查詢路徑、註冊目錄、終端型別、終端名稱、使用者名稱等。
- 所有環境變數都是全域性變數(即可以傳遞給 Shell 的子程式),並可以由使用者重新設定。
Shell變數:查詢、顯示和取消:
-
顯示當前已經定義的所有變數
- 所有環境變數:
env
- 所有變數和函式(包括環境變數) :
set
- 所有環境變數:
-
顯示某(些)個變數的值
echo $NAME1 [$NAME2 ……]
-
取消變數的宣告或賦值
unset <NAME>
3.5.1Shell變數 和 Shell環境練習題
定義Shell變數stuXX(XX為學生學號末兩位),初值為學生姓名全拼,用echo命令顯示stuXX變數的值;用unset命令取消stuXX變數,檢查結果;用env命令觀察當前有哪些已經定義好的shell環境變數
Shell環境變數的值是否可以修改?為什麼?
答:環境變數的值一般情況下,可以修改。但一定要慎重修改,因為一旦修改錯誤,對shell正常執行造成嚴重影響,甚至導致shell無法執行。
四、VI編輯器
相信沒有用過Linux的同學在看一些段子的時候都會看到過兩個編輯器:
- vim
- emacs
下面我們學習如何簡單使用vi。vi 是 “Visual interface” 的簡稱,它可以執行輸出、刪除、查詢、替換、塊操作等眾多文字操作,而且使用者可以根據自己的需要對其進行定製,這是其他編輯程式所沒有的。
- vi可以看做成我們Windows下的記事本
- vim 即 Vi IMproved,vi 克隆版本之一
使用Vi來編輯檔案:
Vi有三種模式:
4.1普通模式
-
G
用於直接跳轉到檔案尾 -
ZZ
用於存檔退出Vi -
ZQ
用於不存檔退出Vi -
/和?
用於查詢字串 -
n
繼續查詢下一個 -
yy
複製一行 -
p
粘帖在下一行,P貼上在前一行 -
dd
刪除一行文字 -
x
刪除游標所在的字元 -
u
取消上一次編輯操作(undo)
4.2插入模式
在 Normal 模式下輸入插入命令 i、 a 、 o
進入insert模式。使用者輸入的任何字元都被vim當做檔案內容儲存起來,並將其顯示在螢幕上。
- 在文字輸入過程中,若想回到Normal模式下,按 Esc 鍵即可。
4.3命令列模式
Normal 模式下,使用者按冒號 :
即可進入 Command 模式,此時 vim 會在顯示視窗的最後一行 (螢幕的最後一行) 顯示一個 “:” 作為 Command 模式的提示符,等待輸入命令。
-
:w
儲存當前編輯檔案,但並不退出 -
:w
newfile 存為另外一個名為 “newfile” 的檔案 -
:wq
用於存檔退出Vi -
:q!
用於不存檔退出Vi -
:q
用於直接退出Vi (未做修改)
設定Vi環境:
- :set autoindent 縮排,常用於程式的編寫
- :set noautoindent 取消縮排
- :set number 在編輯檔案時顯示行號
- :set nonumber 不顯示行號
- :set tabstop=value 設定顯示製表符的空格字元個數
- :set 顯示設定的所有選項
- :set all 顯示所有可以設定的選項
4.4Vi練習題
在使用者主目錄下,執行vi程式,編輯檔案install.log;移動游標到第10行,第五個字元;按大寫字母G,達到檔案末尾;不存檔退出;
在使用者主目錄下,執行vi程式,編輯檔案install.log;用/命令查詢字串sudo,複製包含字串sudo的行
在使用者主目錄下,執行vi程式,編輯檔案install.log;進入命令模式,設定顯示行號;用?命令查詢字串openssh,用命令n查詢下一個
四、總結
本文主要講解了Linux的最基礎的知識,可以簡單地操作Linux了。命令可以說是學不完的,只能是記住Linux是有這個功能,到時候去網上查查也很方便。
主要是多練、多玩就可以記住一些常用的Linux命令了~~~~
下面我就花點時間畫個Linux命令的腦圖(當然了,命令僅限於是本文章的知識點,等寫到使用者、網路等知識點的時候再繼續補充上去!)
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y。為了大家方便,剛新建了一下qq群:742919422,大家也可以去交流交流。謝謝支援了!希望能多介紹給其他有需要的朋友
文章的目錄導航: