Linux學習筆記(詳細)


1、vi 和 vim編輯器

1.1、簡介

所有的Linux系統都會內建vi文本編輯器。

vim具有程序編輯的能力,可以看做是vi的增強版本,可以主動的以字體顏色辨別語法的正確性,方便程序設計。代碼補完、編譯及錯誤跳轉等方便編程的功能特別豐富,在程序員中被廣泛使用。

1.2、vi和vim常用的三種模式

1560765242696

1.2.1、正常模式

以vim打開一個檔案就直接進入一般模式了(這是默認的模式)。在這個模式種,你可以使用【上下左右】按鍵移動光標,你可以使用【刪除字符】或【刪除整行】來處理檔案內容,也可以使用【復制、貼上】來處理你的文件數據。(在正常模式下,我們可以使用快捷鍵。

1.2.2、插入模式/編輯模式

在這個模式下,程序員可以輸入內容。

按下【i,I,o,O,a,A,r,R】等任何一個字母之后才會進入編輯模式,一般來說按i即可。

1.2.3、命令行模式

在這個模式種,可以提供你相關指令,完成讀取、存盤、替換、離開vim、顯示行號等的動作則是在此模式中達成的。

1.2.4、在vi和vim模式下的命令

i		#進入輸入模式
a		#進入輸入模式 光標前進一位
ESC		#退出輸入模式
wq		#保存並退出
q		#退出
q!		#強制退出

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1.3、vi和vim快捷鍵

1.3.1、復制

#復制
yy(正常模式)			#拷貝當前行 
p(正常模式)			#粘貼
5yy(正常模式)			#拷貝當前行向下5行

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4

1.3.2、刪除

#刪除
dd(正常模式)			#刪除一行
5dd(正常模式)			#刪除當前行向下的5行

   
   
  
  
          
  • 1
  • 2
  • 3

1.3.3、查找

#查找
/hello + 回車(正常模式)   #查找關鍵字hello
n(正常模式)			#查找下一個

   
   
  
  
          
  • 1
  • 2
  • 3

1.3.4、行號

#文件的行號
:set nu(命令模式)		#設置行號
:set nonu(命令模式)	#取消行號

   
   
  
  
          
  • 1
  • 2
  • 3

1.3.5、行首/行末

#跳轉到最末行
G(正常模式)
#跳轉到最首行
gg(正常模式)

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4

1.3.6、撤銷

#撤銷
u(正常模式)

   
   
  
  
          
  • 1
  • 2

1.3.7、將光標移到第n行

#將光標移到第10行
#1、顯示行號 :set nu (命令模式)
#2、輸入10 (正常模式)
#3、輸入shift+g (正常模式)

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4

在這里插入圖片描述

2、實用指令

pwd			#查看當前所在目錄

   
   
  
  
          
  • 1

2.1、關機&重啟

shutdown -h now				#立刻進行關機
shutdown -h 1				#"hello,1分鍾后會關機了"
shutdown -r now				#現在重新啟動計算機
halt						#關機,作用和上面一樣
reboot						#現在重新啟動計算機
sync						#把內存的數據同步到磁盤(把沒保存的東西保存,關機之前使用這個命令)

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.2、用戶的注銷

#注銷 此指令在圖形運行級別無效 此命令在普通用戶下無效
logout

exit #用戶退出登錄
Ctrl + D #用戶退出登錄

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.3、用戶管理

在這里插入圖片描述

說明:

1、Linux系統是一個多用戶多任務的操作系統,任何一個要使用系統資源的用戶,都必須首先向系統管理員申請一個賬號,然后以這個賬號的身份進入系統。

2、Linux的用戶至少要屬於一個用戶組。

2.3.1、添加用戶

useradd [選項] 用戶名    #[選擇]是參數

useradd -d 新的用戶名 #給新創建的用戶指定家目錄 ConterOS
useradd -m 新的用戶名 #給新創建的用戶指定家目錄 Unbutu

#比如:
useradd -m yangxinhu #創建了一個用戶 並且home下會自動生成一個yangxinhu的目錄

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

當創建用戶成功后,會自動的創建和用戶同名的家目錄

2.3.2、刪除用戶

userdel 用戶名   #刪除用戶 但是保存用戶家目錄
userdel -r 用戶名	#刪除用戶 同時刪除用戶家目錄

   
   
  
  
          
  • 1
  • 2

刪除用戶時,一般不將用戶家目錄刪除

2.3.3、設置密碼

passwd 用戶名

   
   
  
  
          
  • 1

2.3.4、查看用戶

w     #查看用戶列表

id 用戶名 #查看指定用戶信息

whoami #查看當前用戶名

who am i #查看當前登錄用戶名

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.3.5、切換用戶

su - 用戶名

   
   
  
  
          
  • 1

2.4、用戶組

介紹:類似於角色,系統可以對有共性的多個用戶進行統一的管理。

2.4.1、新增組

groupadd 組名

useradd -g 用戶組 用戶名 #增加一個用戶的時候直接將他指定到一個組

  • 1
  • 2
  • 3

2.4.2、刪除組

groupdel 組名

   
   
  
  
          
  • 1

2.4.3、修改用戶的組

usermod -g 用戶組 用戶名

   
   
  
  
          
  • 1

2.4.4、用戶和組的相關文件

2.4.4.1、用戶配置文件(用戶信息)/etc/passwd

用戶(user)的配置文件,記錄用戶的各種信息

每行的含義:用戶名:口令:用戶標識號:組標識號:注釋性描述:主目錄:登錄Shell

2.4.4.2、組配置文件(組信息)/etc/group

組(group)的配置文件,記錄Linux包含的組的信息

每行含義:組名:口令:組標識號:組內用戶列表

2.4.4.3、口令配置文件(密碼和登錄信息,是加密)/etc/shadow

口令的配置文件

每行的含義:登錄名:加密口令:最后一次修改時間:最小時間間隔:最大時間間隔:警告時間:不活動時間:失效時間:標志

2.5、指定運行級別

在這里插入圖片描述

運行級別說明:

0:關機

1:單用戶【找回丟失密碼】

2:多用戶狀態無網絡服務

3:多用戶狀態有網絡服務

4:系統未使用保留給用戶

5:圖形界面

6:系統重啟

常用運行級別是3和5,要修改默認的運行級別可改文件/etc/inittab的id:5:initdefault:這一行中的數字

命令:

init[0123456]   #切換到制定運行級別的指令 如:切換到5 init 5

   
   
  
  
          
  • 1

2.6、進入單用戶找回密碼

注意:只有在裝有Linux系統的主機上操作,才可以進入單用戶修改密碼(雲服務器另有提供方式)。

2.6.1、啟動Ubuntu18操作系統並長按【Shift】鍵進入選項,選擇 Advanced options for Ubuntu 這一項 按回車【Enter】鍵

注意:這個界面是可能出現的,如果沒有出現,直接跳過這一步。

在這里插入圖片描述

2.6.2、選中Ubuntu,with Linux xxxx-generic(recovery mode)按【E】鍵,不要按回車

在這里插入圖片描述

2.6.3、使用上下左右鍵,找到recovery nomodeset,並將其刪除

在這里插入圖片描述

2.6.4、然后在這一行的最后添加:

quiet splash rw init=/bin/bash

   
   
  
  
          
  • 1

在這里插入圖片描述

2.6.5、按ctrl+x或F10啟動系統就可以進入single模式而不需要密碼了。

2.7、幫助指令

當我們對某個指令不熟悉時,我們可以使用Linux提供的幫助指令來了解這個指令的使用方法。

2.7.1、man

man [命令或配置文件]   #獲得幫助信息

#案例:查看ls命令的幫助信息
man ls

  • 1
  • 2
  • 3
  • 4

2.7.2、help

#實例:查看cd的用法
help cd   #獲得shell內置命令的幫助信息

   
   
  
  
          
  • 1
  • 2

2.8、文件目錄類

2.8.1、pwd

pwd		#顯示當前工作目錄的絕對路徑

   
   
  
  
          
  • 1

2.8.2、ls

ls [選擇] [目錄或是文件]	#顯示當前目錄下的目錄和文件
#-a 顯示當前目錄所有的文件和目錄,包括影藏的
#-l 以列表的方式顯示信息
#-h 顯示更人性化

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4

2.8.3、cd

cd [參數]   #切換到指定目錄
cd ~ 或者 cd   #回到自己的家目錄
cd ..   #回到上一級目錄

   
   
  
  
          
  • 1
  • 2
  • 3

2.8.4、mkdir

mkdir [選項] 要創建的目錄   #用於創建目錄
# -p 創建多級目錄

rmdir 目錄 #刪除指定目錄 這個命令只能刪除空的目錄
rm -rf 目錄 #刪除指定目錄包括目錄下的所有文件和目錄

  • 1
  • 2
  • 3
  • 4
  • 5

2.8.5、touch

touch 文件名稱  #創建一個空文件

   
   
  
  
          
  • 1

2.8.6、cp

cp [選項] source dest  #拷貝 source是源文件 dest是目標路徑
#-r 遞歸復制整個文件夾
#\cp -r sorce dest 強制覆蓋,不要提示我

   
   
  
  
          
  • 1
  • 2
  • 3

2.8.7、rm

rm  #移除
#-r 遞歸刪除整個文件夾
#-f 強制刪除不提示

   
   
  
  
          
  • 1
  • 2
  • 3

2.8.8、mv

mv #移動文件與目錄或者是重命名
#mv oldNameFile newNameFile (重命名)
#mv /temp/movefile /targetFolder (移動)

   
   
  
  
          
  • 1
  • 2
  • 3

2.8.9、cat

cat [選項] 文件 #查看文件內容
#-n 顯示行號

   
   
  
  
          
  • 1
  • 2

2.8.10、more

more 文件   #查看文件內容

   
   
  
  
          
  • 1

2.8.11、> & >>

>   #輸出重定向 (覆蓋寫)
>> 	#追加

ls -l>文件 #列表的內容寫入文件a.txt中(覆蓋寫)
ls -al>>文件 #列表的內容追加到文件aa.txt的末尾
cat 文件1>文件2 #將文件1的內容覆蓋到文件2 cat /etc/profile > c.txt
echo "內容">>文件 #將內容寫入文件中

#使用
#1、將/home目錄下的文件列表寫入到/home/1.txt中
ls -al>>/home/1.txt
#2、將當前日歷信息追加到/home/mycal文件中
cal >> /home/mycal

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.8.12、echo

echo [選擇] [輸出內容]  #輸出內容到控制台
#經常使用echo指令輸出環境變量 echo $PATH

   
   
  
  
          
  • 1
  • 2

2.8.13、head

head   #顯示文件的開頭部分內容,默認情況下head指令顯示文件的前10行內容
head 文件   #查看文件頭10行內容
head -n 5 文件   #查看文件頭5行內容,5可以是任意行數

   
   
  
  
          
  • 1
  • 2
  • 3

2.8.14、tail

tail  #顯示文件中尾部的內容,默認情況下tail指令顯示文件的后10行內容
tail 文件   #查看文件后10行內容
tail -n 5 文件   #查看文件后5行內容,5可以是任意行數
tail -f 文件		#實時追蹤該文檔的所有更新,工作中經常使用,如實時監控日志文件

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4

2.8.15、ln

#軟鏈接指令 類似於windows里的快捷方式,主要存放了鏈接其他文件的路徑
ln -s [源文件或目錄] [軟鏈接名]    #給源文件創建一個軟鏈接(相當於給源文件創建了一個快捷方式)
rm -rf [軟鏈接名]   #刪除軟鏈接 在刪除軟鏈接目錄時,后面不要帶/,否則提示資源忙

   
   
  
  
          
  • 1
  • 2
  • 3

2.8.16、history

history   #查看已經執行過的歷史命令,也可以執行歷史指令
history 10   #查看最近使用的10個命令 10這個數字可以改變
!指令編號    #執行第多少條指令 !178 執行編號為178的指令

   
   
  
  
          
  • 1
  • 2
  • 3

2.9、時間日期類

2.9.1、date

date		#顯示當前時間
date +%Y 	#顯示當前年份
date +%m		#顯示當前月份
date +%d		#顯示當前是哪一天
date "+%Y-%m-%d %H:%M:%S"	#顯示年月日時分秒
date -s 字符串時間  #設置系統當前時間 date -s "2019-06-19 10:03:00"

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.9.2、cal

cal		#查看當前日歷
cal [選項]   #顯示選擇的年份的所有日歷 cal 2019

   
   
  
  
          
  • 1
  • 2

2.10、搜索查找類

2.10.1、find

#find指令 將從指定目錄向下遞歸的遍歷其各個子目錄,將滿足條件的文件或者目錄顯示在終端
find [搜索范圍] [選項]
#選項說明
#-name <查詢方式> 按照指定的文件名查找模式查找文件
#-user <用戶名> 查找屬於指定用戶名所有文件
#-size <文件大小> 按照指定的文件大小查找文件

#按文件名,根據名稱查找/home目錄下的hello.txt文件
find /home -name hello.txt
#按擁有者,查找/opt目錄下,用戶名稱為root的文件
find /opt -user root
#查找整個linux系統下大於20M的文件(+n 大於 -n 小於 n 等於)
find / -size +20M
#查詢根目錄下,所有后綴為.txt的文件
find / -name *.txt

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2.10.2、locate

#locate指令 可以快速定位文件路徑。locate指令利用事先建立的系統中所有文件名稱及路徑的locate數據庫實現快速定位給定的文件。locate指令無需遍歷整個文件系統,查詢速度較快。為了保證查詢結果的准確度,管理員必須頂起更新locate時刻。
locate 搜索文件
#由於locate指令基於數據庫進行查詢,所以第一次運行前。必須使用updatedb指令創建locate數據庫

#使用locate指令快速定位hello.txt文件所在目錄
updatedb
locate hello.txt

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.10.3、grep & 管道符號 |

#grep過濾查找
#管道符 "|" ,表示將前一個命令的處理結果,輸出傳遞給后面的命令處理。

grep [選項] 查找內容 源文件

#選項
# -n 顯示匹配行及行號
# -i 忽略字母大小寫

#應用實例 : 請在hello.txt文件中,查找 "yes" 所在行,並且顯示行號
cat hello.txt | grep -ni yes
#cat hello.txt 將hello.txt的內容瀏覽出來
# | 是將cat瀏覽出來的內容交給后面的命令處理
#grep yes 是將 | 交過來的內容進行過濾查找

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.11、壓縮和解壓縮類

2.11.1、gzip & gunzip

#gzip用於壓縮
#gunzip用於解壓

gzip 文件 #壓縮文件,只能將文件壓縮為 *.gz 文件
gunzip 文件.gz #解壓縮文件命令

  • 1
  • 2
  • 3
  • 4
  • 5

2.11.2、zip & unzip

#zip用於壓縮
#unzip用於解壓
#在項目打包發布中很有用

zip [選項] xxx.zip 將要壓縮的內容 #壓縮文件和目錄的命令
unzip [選項] xxx.zip #解壓縮文件

#zip常用選項:-r 遞歸壓縮,即壓縮目錄
#unzip常用選項:-d <目錄> 指定解壓后文件的存放目錄

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.11.3、tar

#打包指令 最后打包后的文件是.tar.gz的文件

tar [選擇] xxx.tar.gz 打包的內容 #打包目錄,壓縮后的文件格式是.tar.gz

#常用選項
#-c 產生.tar打包文件
#-v 顯示詳細信息
#-f 指定壓縮后的文件名
#-z 打包同時壓縮
#-x 解包.tar文件

#案例
#1、壓縮多個文件,將/home/a1.txt和/home/a2.txt壓縮成a.tar.gz
tar -zcvf /home/a.tar.gz /home/a1.txt /home/a2.txt
#2、將/home的文件夾壓縮成myhome.tar.gz
tar -zcvf myhome.tar.gz /home/
#3、將a.tar.gz解壓到當前目錄下
tar -zxvf a.tar.gz
#4、將myhome.tar.gz解壓到/opt目錄下(指定的目錄必須是存在的)
tar -zxvf myhome.tar.gz -C /opt/

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3、組管理和權限管理(難點、重點)

在Linux中的每個用戶必須屬於一個組,不能獨立於組外。

在linux中每個文件有所有者、所在組、其他組的概念。

在這里插入圖片描述

3.1、文件/目錄所有者

一般為文件的創建者,誰創建了這個文件,就自然的成為這個文件的所有者。

3.1.1、查看文件的所有者

ls -ahl
#實例:創建一個組police,在創建一個用戶tom,然后使用tom來創建一個文件,看看情況如何
#-----root用戶下
groupadd police
useradd -g police tom
#------切換到tom用戶 創建ok.txt
touch ok.txt
#查看所有者
ls -ahl

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在這里插入圖片描述

文件所有者圖示

在這里插入圖片描述

ok.txt的所有者是tom,tom在police組中,ok.txt的所在組是police

一般文件的所在組,是所有者所在的組

3.1.2、修改文件的所有者

chown (change owner改變所有者)

chown 用戶名 文件名

chown -R 用戶名 目錄名
#將目錄下的所有目錄文件的所有者以遞歸的方式修改
#詳情請參見3.7

#案例:使用root創建一個文件apple.txt,然后將其修改成tom
#------使用root用戶 創建apple.txt
touch /home/apple.txt
#查看所有者 apple.txt是屬於root的
ls -ahl

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在這里插入圖片描述

#還是在root用戶下操作 修改文件的所有者
chown tom /home/apple.txt
#再次查看apple.txt的所有者
ls -ahl

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4

在這里插入圖片描述

修改文件所有者圖示:

在這里插入圖片描述

文件所有者所在的組,不一定是文件所在組。

3.2、文件/目錄所在組

3.2.1、查看文件/目錄所在組

ls -ahl
#前面已經用到過了

   
   
  
  
          
  • 1
  • 2

3.2.2、修改文件所在組

chgrp(change group選擇組)

chgrp 組名 文件名

chgrp -R 組名 目錄名
#將目錄下的所有目錄文件的所在組使用遞歸的方式修改
#詳細請參見3.7

#實例:使用root用戶創建文件orange.txt,看看當前這個文件屬於哪個組,然后將這個文件所在組,修改到police組。
touch /home/orange.txt
ls -ahl

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在這里插入圖片描述

chgrp police /home/orange.txt
ls -ahl

   
   
  
  
          
  • 1
  • 2

在這里插入圖片描述

3.3、其他組

除文件的所有者和所在組的用戶外,系統的其他用戶都是文件的其他組。

3.4、改變用戶所在組

在添加用戶時,可以指定將該用戶添加到哪個組中,同樣的用root的管理權限可以改變某個用戶所在的組。

#改變用戶所在組
usermod -g 組名 用戶名	#改變該用戶所在的組
usermod -d 目錄名 用戶名 #改變該用戶登錄的初始目錄

#實例:創建一個土匪組(bandit),將tom這個用戶從原來所在的police組,修改到bandit(土匪)組。
groupadd bandit
usermod -g bandit tom
id tom #查看用戶

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在這里插入圖片描述

3.5、權限的基本介紹

進入/home目錄 使用命令查看文件

ls -l

   
   
  
  
          
  • 1

在這里插入圖片描述

以其中第一個apple.txt為例來解讀:

-   rw-  r--  r--  1 tom  root  0  Jun 20 00:02  apple.txt
1    2    3    4   5  6    7    8       9          10
#1 文件的類型
#[-:普通文件]
#[d:目錄]
#[l:軟鏈接]
#[c:字符設備(鍵盤,鼠標)]
#[b:快文件,硬盤]

#2 表示文件/目錄所有者權限
#3 文件/目錄所在組的用戶的權限
#4 文件/目錄其它組的用戶的權限
#-----[r:可讀]
#-----[w:可寫]
#-----[x:]
#-----[-:沒有權限]

#5
#如果是文件,表示硬鏈接的數
#如果是目錄,表示目錄的子目錄的個數

#6 文件/目錄所在用戶
#7 文件/用戶所在組
#8 文件的大小,單位:字節,,,如果是目錄,顯示4096
#9 文件/目錄最后的修改時間
#10 文件/目錄名

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在這里插入圖片描述

3.6、rwx權限詳解

3.6.1、rwx作用在文件上

[r] 代表可讀(read):可以讀取、查看

[w]代表可寫(write):可以修改,但是不代表可以刪除該文件,刪除一個文件的前提條件是對該文件所在的目錄有寫權限,才能刪除該文件。

[x]代表可執行(execute):可以被執行

3.6.2、rwx作用到目錄上

[r]代表可讀(read):可以讀取,ls查看目錄內容

[w]代表可寫(write):可以修改,目錄創建+刪除+重命名目錄

[x]代表可執行(execute):可以進入該目錄

3.7、權限的管理

3.7.1、修改權限

通過chmod指令,可以修改文件或者目錄的權限。

3.7.1.1、使用+、-、=變更權限

#u:所有者(user)
#g:所有組(group)
#o:其他人(other)
#a:所有人(all)(u、g、o的總和)

chmod u=rwx,g=rx,o=x 文件目錄名
#表示給所有者讀、寫、執行權限 ,給所有組讀和執行權限,給其他人執行權限

chmod o+w 文件目錄名
#表示給其他人添加寫的權限

chmod a-x 文件目錄名
#表示給所有人去除執行的權限

#案例
#1、給abc文件的所有者讀寫執行的權限,給所有組讀執行權限,給其他組讀執行權限
chmod u=rwx,g=rx,o=rx abc
#2、給abc文件的所有者除去執行的權限,增加所有組寫的權限
chmod u-x,g+w abc
#3、給abc文件的所有用戶添加讀的權限
chmod a+r abc

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

3.7.1.2、使用數字變更權限

#規則 
r=4   #二進制 100
w=2   #二進制 010
x=1	  #二進制 001
rwx=4+2+1=7 

chmod u=rwx,g=rx,o=x 文件目錄名
#相當於
chmod 751 文件目錄名

#案例:將/home/abc.txt文件的權限修改成rwxr-xr-x,使用數字的方式實現
chmod 755 /home/abc.txt

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3.7.2、修改文件的所有者

chown newowner file    #改變文件的所有者
chown newowner:newgroup file #改變用戶的所有者和所有組
-R  #如果是目錄 則使其下所有子文件或目錄遞歸生效

#案例
#1、請將/home/abc.txt文件的所有者修改成tom
chown tom abc.txt
#2、請將/home/kkk目錄下所有的文件和目錄的所有者都修改成tom
chown -R tom kkk/

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.7.3、修改文件所在的組

chgrp newgroup file #改變文件的所有組

#案例
#1、將/home/abc.txt文件的所在組修改成bandit(土匪)
chgrp bandit /home/abc.txt
#2、將/home/kkk 目錄下所有的文件和目錄的所在組都修改成bandit(土匪)
chgrp -R bandit /home/kkk

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.7.4、最佳實踐-警察和土匪游戲

police , bandit

jack,jerry:警察

xh , xq:土匪

#1、創建組
groupadd police
groupadd bandit

#2、創建警察和土匪
useradd -g police -m jack
useradd -g police -m jerry
useradd -g bandit -m xh
useradd -g bandit -m xq
#-----給用戶設置密碼
passwd 用戶名

#3、jack創建一個文件,自己可以讀寫,本組人可以讀,其它組沒有任何權限
#---切換到jack用戶
touch jack.txt
chmod o-r jack.txt
#或
chmod 640 jack.txt

#4、jack修改改文件,讓其他組人可以讀,本組人可以讀寫
chmod o=r,g=rw jack.txt
#或
chmod 664 jack.txt

#5、xh投靠 警察,看看是否可以讀寫
#----切換到root用戶 改變xh的組
usermod -g police xh

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

4、crond 任務調度

4.1、概念

任務調度:是指系統在某個時間執行的特定的命令或程序。

任務調度分類:1、系統工作:有些重要的工作必須周而復始的執行。如病毒掃描等。2、個別用戶工作:個別用戶可能希望執行某些程序,比如對mysql數據庫的備份。

在這里插入圖片描述

4.2、指令

crontab [選項]
#-e 編輯crontab定時任務
#-l 查詢crontab任務
#-r 刪除當前用戶所有的crontab任務

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4

4.2.1、創建定時任務

crontab -e  #然后進行編輯

   
   
  
  
          
  • 1

4.2.2、查看定時任務

crontab -l

   
   
  
  
          
  • 1

4.2.3、刪除所有定時任務

crontab -r

   
   
  
  
          
  • 1

4.2.4、重啟定時任務

service crond restart [重啟任務調度]

   
   
  
  
          
  • 1

4.3、快速入門

4.2.1、任務要求

設置任務調度文件:/etc/crontab

設置個人任務調度。執行crontab -e 命令

接着輸入任務到調度文件

如:

*/1****ls -l /etc/>/tmp/to.txt
#意思是說每小時的每分鍾執行ls -l /etc/ > /tmp/to.txt命令

   
   
  
  
          
  • 1
  • 2

4.2.2、步驟如下(Ubuntu18)

crontab -e
*/1****ls -l /etc/>/tmp/to.txt

   
   
  
  
          
  • 1
  • 2

在這里插入圖片描述

按Ctry + X 退出 ,按 Y 確定退出 ,最后按回車

在這里插入圖片描述

出現這一句,說明任務調度成功。

4.2.3、5個占位符說明

項目 含義 范圍
第一個 * 一小時當中的第幾分鍾 0-59
第二個 * 一天當中的第幾小時 0-23
第三個 * 一個月當中的第幾天 1-31
第四個 * 一年當中的第幾月 1-12
第五個 * 一周當中的星期幾 0-7(0和7都代表星期日)

4.2.4、特殊符號說明

特殊符號 含義
* 代表任何時間。比如第一個"*"就代表一小時中每分鍾都執行一次的意思。
, 代表不連續的時間。比如"0 8,12,16 * * * * 命令",就代表在每天的8點0分、12點0分、16點0分都執行一次命令
- 代表連續的時間范圍。比如"0 5 * * 1-6 命令",代表在周一到周六的凌晨5點0分執行命令
*/n 代表每隔多久執行一次。比如"*/10 * * * * 命令",代表每個10分鍾就執行一次命令

4.2.5、特定時間執行任務案例

時間 含義
45 22 * * * 命令 在22點45分執行命令
01 7 * * 1 命令 每周1的17點0分執行命令
0 5 1,15 * * 命令 每月1號和15號的凌晨5點0分執行命令
40 4 * * 1-5 命令 每周一到周五的凌晨4點40分執行命令
*/10 4 * * * 命令 每天的凌晨4點,每隔10分鍾執行一次命令
0 0 1,15 * 1 命令 每月1號和15號,每周1的0點0分都會執行命令。
注意:星期幾和幾號最好不要同時出現,
因為他們定義的都是天。非常容易讓管理員混亂。

4.4、應用實例

4.4.1、案例一

每隔1分鍾,就將當前的日期信息,追加到/home/mydate文件中

4.4.1.1、先編寫一個文件 mytask1.sh

date >> /home/mydate
ls -l

   
   
  
  
          
  • 1
  • 2

4.4.1.2、給mytask1.sh一個可執行權限

chmod u+x mytask1.sh

   
   
  
  
          
  • 1

4.4.1.3、crontab -e

4.4.1.4、調用文件

*/1 * * * * /home/mytask1.sh

   
   
  
  
          
  • 1

4.4.2、案例二

每隔1分鍾,將當前日期和日歷都追加到/home/mycal文件中

4.4.2.1、先編寫一個文件 mytask2.sh

date >> /home/mycal
cal >> /home/mycal

   
   
  
  
          
  • 1
  • 2

4.4.2.2、給mytask2.sh一個可執行權限

chmod u=rwx mytask2.sh

   
   
  
  
          
  • 1

4.4.2.3、crontab -e

4.4.2.4、調用文件

*/1 * * * * /home/mytask2.sh

   
   
  
  
          
  • 1

4.4.3、案例三

每天凌晨2:00將mysql數據庫testdb,備份到文件/home/mydb.bak中。

4.4.3.1、先編寫一個文件 /home/mytask3.sh

/usr/local/mysql/bin/mysqldump -u root -p a testdb > /home/mydb.bak

   
   
  
  
          
  • 1

4.4.3.2、給mytask3.sh一個可以執行權限

chmod 744 /home/mytask3.sh

   
   
  
  
          
  • 1

4.4.3.3、crontab -e

4.4.3.4、調用文件

*/1 * * * * /home/mytask3.sh

   
   
  
  
          
  • 1

5、Linux磁盤分區、掛載

5.1、分區基礎知識

5.1.1、分區的方式

5.1.1.1、mbr分區

  • 最多支持四個主分區

  • 系統只能安裝在主分區

  • 擴展分區要占一個主分區

  • MBR最大只支持2TB,但擁有最好的兼容性

5.1.1.2、gpt分區

  • 支持無限多個主分區(但操作系統可能限制,比如windows下最多128個分區)

  • 最大支持18EB的容量(1EB=1024PB , 1PB=1024TB)

  • windows7 64位以后支持gpt

在這里插入圖片描述

5.2、Linux分區

lsblk -f  #ls block 查看系統的分區和掛載的情況。

   
   
  
  
          
  • 1

在這里插入圖片描述

5.2.1、原理介紹

  • 對於Linux來說無論有幾個分區,分給哪一目錄使用,它歸根結底就只有一個根目錄,一個獨立且唯一的文件結構,Linux中每個分區都是用來組成整個文件系統的一部分。
  • Linux采用了一種叫“載入”的處理方法,它的整個文件系統中包含了一整套的文件和目錄,且將一個分區和一個目錄聯系起來。這時要載入的一個分區將使它的存儲空間在一個目錄下獲得。
  • 示意圖
    在這里插入圖片描述

5.2.2、硬盤說明

  • Linux硬盤分為IDE硬盤和SCSI硬盤,目前基本上是SCSI硬盤
  • 對於IDE硬盤,驅動器標識符為“hdx”,其中“hd”表示分區所在設備的類型,這里是指IDE硬盤了。“x”為潘浩(a為基本盤,b為基本從屬盤,c為輔助主盤,d為輔助從屬盤),“”代表分區,前四個分區用數字1到4表示,它們是主分區或擴展分區,從5開始就是邏輯分區。例:hda3表示為第一個IDE硬盤上的第三個主分區或擴展分區,hdb2表示為第二個IDE硬盤上的第二個主分區或擴展分區。
  • 對於SCSI硬盤則標識為“sdx~”,SCSI硬盤是用“sd”來表示分區所在設備的類型的,其余則和IDE硬盤的表示方法一樣。

5.3、掛載的經典案例

1561099968374

5.3.1、需求

給我們的Linux系統增加一個新的硬盤,並且掛載到/home/newdisk

5.3.2、實現

  • 1、虛擬機添加硬盤
  • 2、分區
  • 3、格式化
  • 4、掛載
  • 5、設置可以自動掛載

5.3.2.1、虛擬機添加硬盤

在【虛擬機】菜單中,選擇【設置】,然后設備列表里添加硬盤,然后一路【下一步】,中間只有選擇磁盤大小的地方需要修改,直到完成。然后重啟系統(才能識別)!

5.3.2.2、分區

fdisk /dev/sdb
m
n
p
1
Enter
Enter
w

#m 顯示命令列表
#p 顯示磁盤分區 同 fdisk -l
#n 新增分區
#d 刪除分區
#w 寫入並退出

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

5.3.2.3、格式化

mkfs -t ext4 /dev/sdb1    #ext4 是分區類型

   
   
  
  
          
  • 1

5.3.2.4、掛載

先創建目錄

mkdir /home/newdisk

   
   
  
  
          
  • 1

掛載

mount /dev/sdb1 /home/newdisk

#mount 設備名稱 掛載目錄 -------------掛載
#umount 設備名稱或者掛載目錄 ----------斷開掛載

  • 1
  • 2
  • 3
  • 4

在這里插入圖片描述

當能看到這個目錄時,就意味着掛載成功了,但是如果重新啟動操作系統,那么這個掛載會消失

5.3.2.5、設置可以自動掛載

設置永久掛載,當重啟系統時,仍然可以掛載到 /home/newdisk

vim /etc/fstab

   
   
  
  
          
  • 1

在這里插入圖片描述

這個文件中記錄了分區和掛載點的情況。

添加:

/dev/sdb1       /home/newdisk       ext4    defaults   0 0

   
   
  
  
          
  • 1

在這里插入圖片描述

啟動自動掛載:

mount -a   # mount auto

   
   
  
  
          
  • 1

重啟操作系統

reboot

   
   
  
  
          
  • 1

發現掛載關系自動成立。

5.4、磁盤情況查詢

5.4.1、查詢系統整體磁盤使用情況

df -h
df -l

#-h 是human 適合人觀察的方式展現出來

  • 1
  • 2
  • 3
  • 4

5.4.2、查詢指定目錄的磁盤占用情況

du -h /目錄
#查詢指定目錄的磁盤占用情況,默認為當前目錄
# -s 指定目錄占用大小匯總
# -h 帶計量單位
# -a 含文件
# --max-depth=1 子目錄深度
# -c 列出明細的同時,增加匯總值

#實例:查詢/opt目錄的磁盤占用情況,深度為1
du -ach --max-depth=1 /opt

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5.4.3、磁盤情況-工作實用指令

5.4.3.1、統計/home文件夾下文件的個數

ls -l /home | grep "^-" | wc -l   # "^-" 以-開頭的是文件

   
   
  
  
          
  • 1

5.4.3.2、統計/home文件夾下目錄的個數

ls -l /home | grep "^d" | wc -l   # "^d" 以d開頭的是目錄

   
   
  
  
          
  • 1

5.4.3.3、統計/home文件夾下文件的個數,包括子文件夾里

ls -lR /home | grep "^-" | wc -l   # "^-" 以-開頭的是文件 -R 遞歸

   
   
  
  
          
  • 1

5.4.3.4、統計/home文件夾下目錄的個數,包括子文件夾里

ls -lR /home | grep "^d" | wc -l   # "^d" 以d開頭的是目錄

   
   
  
  
          
  • 1

5.4.3.5、以樹狀顯示目錄結構

tree /home

   
   
  
  
          
  • 1

6、網絡配置

6.1、Linux網絡配置原理圖

在這里插入圖片描述

6.2、網絡IP和網關

6.2.1、查看虛擬網絡編輯器

在這里插入圖片描述

6.2.2、修改IP地址(修改虛擬網卡的IP)

在這里插入圖片描述

6.2.3、查看網關

在這里插入圖片描述

6.2.4、查看windows環境中VMnet8網絡配置(ipconfig指令)

也可以通過界面查找

在這里插入圖片描述

6.3、Linux網絡環境配置

6.3.1、指定固定IP

  • 說明:直接修改配置文件來指定IP,並可以連接到外網(程序員推薦)

  • 編輯:

    #vim /etc/sysconfig/network-scripts/ifcfg-eth0 #ConOS
    vim /etc/network/interfaces    #Ubuntu
    
         
         
        
        
                
    • 1
    • 2
  • 要求:將IP地址配置成靜態的,ip地址為192.168.184.130

vim /etc/network/interfaces

#靜態分配的配置方法
auto eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0
gateway 192.168.0.1
#保存退出

#重啟網絡服務
service network restart

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

這地方有問題 以后還要自己研究一下-----------------------------------------------------------------

7、進程管理

7.1、基本介紹

  • 在Linux中,每個執行的程序(代碼)都稱為一個進程。每一個進程都分配一個ID號。
  • 每一個進程,都會對應一個父進程,而這個父進程可以復制多個子進程。例如www服務器
  • 每個進程都可能以兩種方式存在的。前台后台(守護進程),所謂前台進程就是用戶目前的屏幕上可以進行操作的。后台進程則是實際在操作,但由於屏幕上無法看到的進程,通常使用后台方式執行。
  • 一般系統的服務都是以后台進程的方式存在,而且都會常駐在系統中。知道關機才能結束。

7.2、顯示系統執行的進程

7.2.1、查看進程的相關指令

ps    #查看目前系統中,有哪些正在執行的進程,以及這些進程執行的情況,可以不加任何參數
ps -a   #顯示當前終端的所有進程信息
ps -u   #以用戶的格式顯示進程信息
ps -x   #顯示后台進程運行的參數
ps -aux #查看詳細信息 太多可以使用more分頁查看 ps -aux | more
ps -aux | grep xxxx   #使用grep 過濾查找 System V展示風格

   
   
  
  
          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在這里插入圖片描述

  • 指令說明
參數 說明
USER 用戶名稱
PID 進程號
%CPU 進程占用CPU百分比
%MEM 進程占用物理內存百分比
VSZ 進程占用的虛擬內存大小(單位:kb)
RSS 進程占用的物理內存大小(單位:kb)
TT 終端名稱,縮寫
STAT 進程狀態,其中S-睡眠,
S-表示該進程是繪畫的先導進程,
N-表示進程擁有比普通優先級更低的優先級,
R-正在運行,
D-短期等待,
Z-僵死進程,
T-被跟蹤或者被停止等待
STARTED 進程的啟動時間
TIME CPU時間,即進程使用CPU的總時間
COMMAND 啟動進程所用的命令和參數,如果過長會被截斷顯示

7.2.2、查看父進程的相關指令

ps -ef #查看父進程
ps -ef | more  #分頁查看
#-e 顯示所有進程
#-f 全格式

ps -ef | grep xxx #是BSD風格

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 指令說明

    參數 說明
    UID 用戶ID
    PID 進程ID
    PPID 父進程ID
    C CPU用於計算執行優先級的因子。數值越大,表名進程是CPU密集型運算,執行優先級會降低;數值越小,表名進程是I/O密集型運算,執行優先級會提高
    STIME 進程啟動的時間
    TTY 完成的終端名稱
    TIME CPU時間
    CMD 啟動進程所用的命令和參數

7.3、終止進程kill和killall

  • 介紹:若是某個進程執行一般需要停止時,或是已消耗了很大的系統資源時,此時可以考慮停止該進程。使用kill命令來完成此項任務。

    kill [選項] 進程號     #通過進程號殺死進程
    killall 進程名稱       #通過進程名稱殺死進程,也支持通配符,這在系統因負載過大而變得很慢時很有用
    #常用選項 -9 表示強迫進程立即停止
    
         
         
        
        
                
    • 1
    • 2
    • 3

7.4、進程的監控

top [選項]
#-d 秒數 指定top命令每隔幾秒更新。默認是3秒在top命令的交互模式當中可以執行的命令
#-i 使top不顯示任何閑置或者僵死的進程。
#-p 通過指定監控進程ID來僅僅監控某個進程的狀態
#交互操作:
#u 回車,再輸入用戶名-----------------專門監控某個用戶
#k 回車,再輸入要結束的進程ID號--------終止指定的進程
#P 以CPU使用率排序,默認就是此項
#M 以內存的使用率排序
#N 以PID排序
#q 退出top

netstat [選項] #查看網絡情況
#-an 按一定順序排列輸出
#-p 顯示哪個進程在調用
netstat -anp | more #查看所有的網絡服務

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在這里插入圖片描述

8、服務(Service)管理

8.1、介紹

服務(Service)本質就是進程,但是是運行在后台的,通常都會監聽某個端口,等待其他程序的請求,比如(mysql,sshd防火牆等),因此我們又稱為守護進程,是Linux中非常重要的知識點。【原理圖】

在這里插入圖片描述

8.2、service管理指令

#service 服務名 [start | stop | restart | reload | status]
systemctl 服務名 [start | stop | restart | reload | status]

#實例1:查看當前防火牆的情況,關閉防火牆和重啟防火牆
service iptables status #ContOS
service iptables restart #ContOS

這地方還是有問題 稍后自行研究.............................

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

8.3、查看linux提供的服務

ls -l /etc/init.d

   
   
  
  
          
  • 1

8.4、給服務的各個運行級別設置自 啟動/關閉

chkconfig

chkconfig --list | grep xxx #查看服務 ContOS
chkconfig 服務名 --list
chkconfig --level 5 服務名 on/off

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

9、Shell編程

9.1、為什么要學習Shell編程

  • Linux運維工程師在進行服務器集群管理時,需要編寫Shell程序來進行服務器管理
  • 對於JavaEE和python程序員來說,工作的需要,你的老大會要求你編寫一些Shell腳本進行程序或者是服務器的維護,比如編寫一個定時備份數據庫的腳本。
  • 對於大數據程序員來說,需要編寫Shell程序來管理集群。

9.2、Shell是什么

Shell是一個命令行解釋器, 它為用戶提供了一個向Linux內核發送請求以便運行程序的界面系統級程序,用戶可以用Shell來啟動、掛起、停止甚至是編寫一些程序。

在這里插入圖片描述

9.3、Shell腳本的執行方式(fast start)

  • 多行注釋

    :<<!  .....    !
    
         
         
        
        
                
    • 1
  • 腳本以 #!/bin/bash 開頭(指定用什么進行解析)

  • 腳本的編寫:

    vim hello.sh  #創建一個shell腳本 腳本的后綴是什么都可以,沒有也行,一般為.sh
    #編輯
    #!/bin/bash #指定使用bash解析
    echo "hello world!"   #輸出hello world
    

    #保存並退出

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 腳本的執行

    • 第一種方式:

      sh hello.sh
      sh ./hello.sh
      sh /home/hello.sh
      
             
             
            
            
                    
      • 1
      • 2
      • 3
    • 第二種方式:

      先給hello.sh腳本加可執行權限,然后再直接執行

      chmod u+x hello.sh
      ./hello.sh   #相對路徑
      #或 
      /home/hello.sh  #絕對路徑
      
             
             
            
            
                    
      • 1
      • 2
      • 3
      • 4

9.4、Shell變量

9.4.1、Shell的變量的介紹

  • Linux Shell 中的變量分為,系統變量用戶自定義變量

  • 系統變量:

          H
         
         
          O
         
         
          M
         
         
          E
         
         
          、
         
        
        
         HOME 、
        
       
      </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.68333em; vertical-align: 0em;"></span><span class="mord mathit" style="margin-right: 0.08125em;">H</span><span class="mord mathit" style="margin-right: 0.02778em;">O</span><span class="mord mathit" style="margin-right: 0.10903em;">M</span><span class="mord mathit" style="margin-right: 0.05764em;">E</span><span class="mord cjk_fallback">、</span></span></span></span></span>PWD、<span class="katex--inline"><span class="katex"><span class="katex-mathml">
      
       
        
         
          S
         
         
          H
         
         
          E
         
         
          L
         
         
          L
         
         
          、
         
        
        
         SHELL、
        
       
      </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.68333em; vertical-align: 0em;"></span><span class="mord mathit" style="margin-right: 0.05764em;">S</span><span class="mord mathit" style="margin-right: 0.08125em;">H</span><span class="mord mathit" style="margin-right: 0.05764em;">E</span><span class="mord mathit">L</span><span class="mord mathit">L</span><span class="mord cjk_fallback">、</span></span></span></span></span>USER等等</p> <p>比如:echo $HOME 等用法</p> </li><li> <p>顯示當前shell中所有的變量: set</p> </li></ul> 
    

    9.4.2、shell變量的定義

    9.4.2.1、規則

    變量=#定義變量 注意:中間不能用空格隔開
    unset 變量       #撤銷變量
    readonly 變量    #聲明靜態變量 注意:靜態變量不能unset
    
         
         
        
        
                
    • 1
    • 2
    • 3
    • 變量名稱可以由字母、數字和下划線組成,但是不能以數字開頭。
    • 等號兩側不能有空格
    • 變量名稱一般習慣為大寫

    9.4.2.2、普通變量

    ##定義變量
    #!/bin/bash
    a=11						#定義變量a
    echo "a = $a"				#輸出a
    

    unset a #撤銷變量a
    echo "unset a = $a" #輸出a

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    結果:

    在這里插入圖片描述

    9.4.2.3、靜態變量

    ##聲明靜態變量
    #!/bin/bash
    readonly A=12
    echo "readonly A = $A"
    

    unset A
    echo "readonly A2 = $A"

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    結果:

    在這里插入圖片描述

    9.4.2.4、將命令的返回值賦值給變量(重點)

    A=`ls -la`    #反引號,運行里面的命令,並把結果返回給變量A
    A=$(ls -la)   #等價於反引號
    
         
         
        
        
                
    • 1
    • 2
    ###實例
    #!/bin/bash
    A=`date`
    echo "A = $A"
    

    echo "----------------"

    B=\((</span><span class="token function">date</span><span class="token variable">)</span></span> <span class="token keyword">echo</span> <span class="token string">"B = <span class="token variable">\)B"

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    結果:

    在這里插入圖片描述

    9.4.3、設置環境變量

    export 變量名=變量值     #將shell變量輸出為環境變量
    source 配置文件         #讓修改后的配置信息立即生效
    echo $變量名			 #查詢環境變量的值
    
         
         
        
        
                
    • 1
    • 2
    • 3
    ###實例
    #1、在/home/shell/tomcat.sh文件中定義TOMCAT_HOME環境變量
    #!/bin/bash
    export TOMCAT_HOME="hello,my name is tomcat!"
    

    #2、查看環境變量TOMCAT_HOME的值
    source /home/shell/tomcat.sh
    echo $TOMCAT_HOME

    #3、在另外一個shell程序(/home/shell/usetomcat.sh)中使用TOMCAT_HOME
    #!/bin/bash
    A=\(TOMCAT_HOME</span> <span class="token keyword">echo</span> <span class="token string">"A = <span class="token variable">\)A"

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    9.4.4、位置參數變量

    9.4.4.1、介紹

    當我們執行一個shell腳本時,如果希望獲取到命令行的參數信息,就可以使用到位置參數變量

    比如:

    ./myshell.sh 100 200  
    #這個就是一個執行shell的命令行,可以在myshell腳本中獲取到參數信息,類似於python的cmd傳參
    
         
         
        
        
                
    • 1
    • 2

    9.4.4.2、基本語法

    $n  #n為數字,$0代表命令本身,$1-$9代表第一到第九個參數,十以上的參數需要用大括號包含,如{10}
    $*  #這個變量代表命令行中所有的參數,$*把所有的參數看成一個整體
    $@  #這個變量也代表命令行中所有的參數,不過$@把每個參數區分對待
    $# #這個變量代表命令行中所有參數的個數
    
         
         
        
        
                
    • 1
    • 2
    • 3
    • 4
    #實例:寫一個腳本 打印出傳遞進去的11個參數及詳細
    #!/bin/bash
    echo "param[0] ---- $0"
    echo "param[1] ---- $1"
    echo "param[2] ---- $2"
    echo "param[3] ---- $3"
    echo "param[4] ---- $4"
    echo "param[5] ---- $5"
    echo "param[6] ---- $6"
    echo "param[7] ---- $7"
    echo "param[8] ---- $8"
    echo "param[9] ---- $9"
    echo "param[10] ---- ${10}"
    echo "param[11] ---- ${11}"
    

    echo "param count is \(#</span>"</span> <span class="token keyword">echo</span> <span class="token string">"param ----------- <span class="token variable">\)@"
    echo "param =========== $*"

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    結果:

    在這里插入圖片描述

    9.4.5、預定義變量

    • 就是shell設計者實現一鍵定義好的變量,可以直接在shell腳本中使用

    • $$   #當前進程的進程號(PID)
      $!   #當前運行的最后一個進程的進程號(PID)
      $?   #最后一次執行的命令的返回狀態。如果這個變量的值為0,證明上一個命令正確執行;如果這個變量的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。
      
             
             
            
            
                    
      • 1
      • 2
      • 3
    • 應用實例:在一個shell腳本中簡單使用一下預定義變量

      #!/bin/bash
      echo "當前進程的進程號 = $$"
      #后台的方式運行tomcat.sh
      ./tomcat.sh &   #后台運行
      

      echo "當前運行的最后一個進程的進程號 = \(!</span>"</span> <span class="token keyword">echo</span> <span class="token string">"最后一次執行的命令的返回狀態 = <span class="token variable">\)?"

      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      結果:

    在這里插入圖片描述

    9.5、運算符

    $((運算式))
    #或
    $[運算式]
    
         
         
        
        
                
    • 1
    • 2
    • 3
    expr m + n   #加
    expr m - n	 #減
    expr \*		 #乘
    expr /		 #除
    expr %		 #取余
    
         
         
        
        
                
    • 1
    • 2
    • 3
    • 4
    • 5

    案例1:

    #!/bin/bash
    M=100
    N=5
    

    echo "M + N = $((M + N))"

    echo "M - N = $[M - N]"
    MN1=</span><span class="token function">expr</span> $M \* $N<span class="token variable">
    echo "M * N = $MN1"

    C=</span><span class="token function">expr</span> $M / $N<span class="token variable">
    echo "M / N = $C"

    D=</span><span class="token function">expr</span> $M % $N<span class="token variable">
    echo "M % N = $D"

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    結果:

    在這里插入圖片描述

    案例二:求出命令行輸入兩個參數的和

    #!/bin/bash
    A=$1
    B=$2
    SUM=$[A+B]
    echo "sum = $SUM"
    
         
         
        
        
                
    • 1
    • 2
    • 3
    • 4
    • 5

    結果:

    在這里插入圖片描述

    9.6、條件判斷

    [ condition ]    #非空返回true 可使用$?嚴重(0位true,>1為false) 注意:condition前后要有空格
    
         
         
        
        
                
    • 1

    常用判斷條件

    • 兩個整數的比較
    符號 說明
    = 字符串比較
    -lt 小於
    -le 小於等於
    -eq 等於
    -gt 大於
    -ge 大於等於
    -ne 不等於
    • 按照文件權限進行判斷
    符號 說明
    -r 有讀的權限
    -w 有寫的權限
    -x 有執行的權限
    • 按照文件類型進行判斷
    符號 說明
    -f 文件存在並且是一個常規的文件
    -e 文件存在
    -d 文件存在並是一個目錄
    ##判斷 "ok"和"ok"是否相等
    #!/bin/bash
    if [ "ok" = "ok" ]
    then
            echo "equal"
    fi
    

    ##23是否大於22
    if [ 23 -gt 22 ]
    then
    echo "大於"
    fi

    ##判斷文件是否存在
    if [ -e /home/shell/aaa.txt ]
    then
    echo "存在"
    fi

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    9.7、流程控制

    9.7.1、if

    if [ 條件判斷式 ];then
        程序
    fi
    

    ###或者

    if [ 條件判斷式 ]
    then
    程序
    elif [ 條件判斷式 ]
    then
    程序
    fi

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    #編寫sh腳本 輸入參數,參數>=60,打印"及格了",參數<60,打印"不及格"
    #!/bin/bash
    if [ $1 -ge 60 ]
    then
            echo "及格了"
    elif [ $1 -lt 60 ]
    then
            echo "不及格"
    fi
    
         
         
        
        
                
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    9.7.2、case

    case $變量名 in
    "值1")
    程序1
    ;;
    "值2")
    程序2
    ;;
    ..........
    "值n")
    程序n
    ;;
    *)
    如果變量的值都不是以上的值,則執行此程序
    ;;
    esac
    
         
         
        
        
                
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    #實例
    

    #!/bin/bash
    case $1 in
    1)
    echo "一"
    ;;
    2)
    echo "二"
    ;;
    3)
    echo "三"
    ;;
    *)
    echo "其他"
    ;;
    esac

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    9.7.3、for循環

    #語法一
    for 變量 in 值1 值2 ... 值n
    do
     程序
    done
    

    #實例:打印命令行輸入的參數 $* \(@</span> <span class="token comment">#!/bin/bash</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token string">"<span class="token variable">\)*"
    do
    echo "the num is $i"
    done

    echo "-------------------------"

    for j in "\(@</span>"</span> <span class="token keyword">do</span> <span class="token keyword">echo</span> <span class="token string">"the num is <span class="token variable">\)j"
    done

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    #語法二
    for((初始值;循環控制條件;變量變化))
    do
    	程序
    done
    

    #實例:從1加到100並輸出結果
    #!/bin/bash
    SUM=0
    for((i=1;i<=100;i++))
    do
    SUM=\(<span class="token punctuation">[</span><span class="token variable">\)SUM+\(i</span><span class="token punctuation">]</span> <span class="token keyword">done</span> <span class="token keyword">echo</span> <span class="token string">"最終結果是:<span class="token variable">\)SUM"

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    9.7.4、while循環

    while [ 條件判斷式 ]
    do
    	程序
    done
    

    #案例:從命令行輸入一個n,統計從1+...+n的值是多少
    #!/bin/bash
    SUM=0
    i=0
    while [ $i -le \(1</span> <span class="token punctuation">]</span> <span class="token keyword">do</span> SUM<span class="token operator">=</span>\)[\(SUM</span>+<span class="token variable">\)i]
    i=\(<span class="token punctuation">[</span><span class="token variable">\)i
    +1]
    done
    echo "sum = $SUM"

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    9.8、read讀取控制台輸入

    read 選項 參數
    #-p 指定讀取值時的提示符(阻塞)
    #-t 指定讀取值時等待的時間(秒),如果沒有在指定的時間內輸入,就不再等待了
    
         
         
        
        
                
    • 1
    • 2
    • 3
    #案例1:讀取控制台輸入一個num值
    #!/bin/bash
    read -p "請輸入一個數:" NUM1
    echo "你輸入的值是:$NUM1"
    

    #案例2:讀取控制台輸入一個num值,在10秒內輸入。
    #!/bin/bash
    read -t 10 -p "請輸入一個數:" NUM1
    echo "你輸入的值是:$NUM1"

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    9.9、函數

    9.9.1、系統函數

    basename [pathname] [suffix]  #返回完整路徑最后/的部分,常用於獲取文件名
    #basename命令會刪掉所有的前綴包括最后一個("/")字符,然后將字符串顯示出來
    

    #案例:請返回/home/shell/hello.sh的"hello.sh"部分
    basename /home/shell/hello.sh
    #shell腳本中: echo basename /home/shell/hello.sh

    #案例:請返回/home/shell/hello.sh的"hello"部分
    basename /home/shell/hello.sh .sh
    #shell腳本中: echo basename /home/shell/hello.sh .sh

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    dirname 文件絕對路徑 
    #返回完整路徑最后/的前面的部分,常用於返回路徑部分
    #從給定的包含絕對路徑的文件名中去除文件名(非目錄的部分),然后返回剩下的路徑(目錄的部分)
    

    #實例:請返回/home/shell/hello.sh的/home/shell
    dirname /home/shell/hello.sh
    #shell腳本中: echo dirname /home/shell/hello.sh

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    9.9.2、自定義函數

    function funname()
    {
        Action;
        [return int;]
    }
    

    #應用實例:編寫一個函數,計算兩個參數的和,getSum
    function getSum()
    {
    SUM=\(<span class="token punctuation">[</span><span class="token variable">\)n1+\(n2</span><span class="token punctuation">]</span> <span class="token keyword">echo</span> <span class="token string">"和是:<span class="token variable">\)SUM"
    }
    read -p "請輸入第一個數 n1:" n1
    read -p "請輸入第二個數 n2:" n2

    getSum \(n1</span> <span class="token variable">\)n2

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    9.10、Shell編程綜合案例

    9.10.1、需求:

    • 每天凌晨2:10備份數據庫 kugou 到 /home/mysql/data/db
    • 備份開始和備份結束能夠給出相應的提示信息
    • 備份后的文件要求以備份時間為文件名,並打包成.tar.gz的形式,比如:2019-6-15_222222.tar.gz
    • 在備份的同時,檢查是否有10天前備份的數據庫文件,如果有就將其刪除。

    9.10.2、實現

    9.10.2.1、寫腳本

    /home/shell/testmysql.sh

    #!/bin/bash
    #完成數據庫的定時備份
    

    echo "=開始備份=="

    #備份的路徑
    BACKUP=/home/mysql/data/db
    echo "備份的路徑:${BACKUP}"

    #獲取到當前的時間
    DATETIME=\((</span><span class="token function">date</span> +%Y-%m-%d_%H%M%S<span class="token variable">)</span></span> <span class="token keyword">echo</span> <span class="token string">"當前時間:<span class="token variable">\){DATETIME}"

    #主機
    HOST=localhost
    echo "主機:${HOST}"

    #用戶名
    DB_USER=yxh_mysql
    echo "用戶名:${DB_USER}"

    #密碼
    DB_PWD=a
    echo "密碼:${DB_PWD}"

    #備份數據庫名
    DATABASE=shelltest
    echo "備份數的據庫名:${DATABASE}"

    #創建備份路徑
    #如果備份路徑存在,就使用,否則就創建
    [ ! -d "\(BACKUP</span>/<span class="token variable">\)DATETIME" ] && mkdir -p "\(BACKUP</span>/<span class="token variable">\)DATETIME"

    #執行mysql的備份數據庫命令
    mysqldump -u\({DB_USER}</span> -p<span class="token variable">\)DB_PWD --host=\(HOST</span> <span class="token variable">\)DATABASE | gzip > \(BACKUP</span>/<span class="token variable">\)DATETIME/$DATETIME.sql.gz

    #打包備份文件
    cd \({BACKUP}</span> <span class="token function">tar</span> -zcvf <span class="token variable">\)DATETIME.tar.gz $DATETIME

    #刪除臨時目錄
    rm -rf \(BACKUP</span>/<span class="token variable">\)DATETIME

    #刪除10天前的備份文件
    find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} <span class="token punctuation">;

    echo "=備份完成"

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    9.10.2.2、定時

    crontab -e
    

    10 2 * * * /home/shell/testmysql.sh

    • 1
    • 2
    • 3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM