1、vi 和 vim編輯器
1.1、簡介
所有的Linux系統都會內建vi文本編輯器。
vim具有程序編輯的能力,可以看做是vi的增強版本,可以主動的以字體顏色辨別語法的正確性,方便程序設計。代碼補完、編譯及錯誤跳轉等方便編程的功能特別豐富,在程序員中被廣泛使用。
1.2、vi和vim常用的三種模式
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、掛載的經典案例
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"
doneecho "-------------------------"
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腳本中: echobasename /home/shell/hello.sh
#案例:請返回/home/shell/hello.sh的"hello"部分
basename /home/shell/hello.sh .sh
#shell腳本中: echobasename /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腳本中: echodirname /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:" n2getSum \(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