Linux命令全解

2022-10-05 18:00:38

strace

  • 獲取某個可執行檔案執行過程中用到的所有系統呼叫
:strace -f g++ main.cpp &| vim   檢視g++編譯過程呼叫了哪些系統呼叫,通過管道符用vim接收
:%! grep execve
:%s/ , /\r /g  將檔案中的 ,+空格 換成\r,  /g表示全域性替換

strace引數
-c 統計每一系統呼叫的所執行的時間,次數和出錯的次數等. 
-d 輸出strace關於標準錯誤的偵錯資訊. 
-f 跟蹤由fork呼叫所產生的子程序. 
-ff 如果提供-o filename,則所有程序的跟蹤結果輸出到相應的filename.pid中,pid是各程序的程序號. 
-F 嘗試跟蹤vfork呼叫.在-f時,vfork不被跟蹤. 
-h 輸出簡要的幫助資訊. 
-i 輸出系統呼叫的入口指標. 
-q 禁止輸出關於脫離的訊息. 
-r 列印出相對時間關於,,每一個系統呼叫. 
-t 在輸出中的每一行前加上時間資訊. 
-tt 在輸出中的每一行前加上時間資訊,微秒級. 
-ttt 微秒級輸出,以秒了表示時間. 
-T 顯示每一呼叫所耗的時間. 
-v 輸出所有的系統呼叫.一些呼叫關於環境變數,狀態,輸入輸出等呼叫由於使用頻繁,預設不輸出. 
-V 輸出strace的版本資訊. 
-x 以十六進位制形式輸出非標準字串 
-xx 所有字串以十六進位制形式輸出. 
-a column 

Linux目錄介紹

目錄
/bin 存放二進位制可執行檔案(ls,cat,mkdir等),常用命令一般都在這裡。
/etc 存放系統管理和組態檔
/home 存放所有使用者檔案的根目錄,是使用者主目錄的基點,比如使用者user的主目錄就是/home/user,可以用~user表示
/usr 用於存放系統應用程式,比較重要的目錄/usr/local 本地系統管理員軟體安裝目錄(安裝系統級的應用)。這是最龐大的目錄,要用到的應用程式和檔案几乎都在這個目錄。 /usr/x11r6 存放x window的目錄 /usr/bin 眾多的應用程式 /usr/sbin 超級使用者的一些管理程式 /usr/doc linux檔案 /usr/include linux下開發和編譯應用程式所需要的標頭檔案 /usr/lib 常用的動態連結庫和軟體包的組態檔 /usr/man 幫助檔案 /usr/src 原始碼,linux核心的原始碼就放在/usr/src/linux裡 /usr/local/bin 本地增加的命令 /usr/local/lib 本地增加的庫
/opt 額外安裝的可選應用程式包所放置的位置。一般情況下,我們可以把tomcat等都安裝到這裡。
/proc 不能動,虛擬檔案系統目錄,是系統記憶體的對映。可直接存取這個目錄來獲取系統資訊。
/sys 不能動,linux核心, 硬體裝置的驅動程式資訊
/root 超級使用者(系統管理員)的主目錄(特權階級o
/sbin 存放二進位制可執行檔案,只有root才能存取。這裡存放的是系統管理員使用的系統級別的管理命令和程式。如ifconfig等。
/dev 用於存放裝置檔案。
/mnt 系統管理員安裝臨時檔案系統的安裝點,系統提供這個目錄是讓使用者臨時掛載其他的檔案系統。
/boot 存放用於系統引導時使用的各種檔案,啟動時的核心檔案
/lib 存放跟檔案系統中的程式執行所需要的共用庫及核心模組。共用庫又叫動態連結共用庫,作用類似windows裡的.dll檔案,存放了根檔案系統程式執行所需的共用檔案。
/tmp 用於存放各種臨時檔案,是公用的臨時檔案儲存點。
/var 用於存放執行時需要改變資料的檔案,也是某些大檔案的溢位區,比方說各種服務的紀錄檔檔案(系統啟動紀錄檔等。)等。
/lost+found 這個目錄平時是空的,系統非正常關機而留下「無家可歸」的檔案(windows下叫什麼.chk)就在這裡
/srv 不能動,service縮寫,存放一些服務啟動之後需要提取的資料,

tmux使用

能:
    (1) 分屏。
    (2) 允許斷開Terminal連線後,繼續執行程序。
結構:
    一個tmux可以包含多個session,一個session可以包含多個window,一個window可以包含多個pane。
    範例:
        tmux:
            session 0:
                window 0:
                    pane 0
                    pane 1
                    pane 2
                    ...
                window 1
                window 2
                ...
            session 1
            session 2
            ...
操作:
    (1) tmux:新建一個session,其中包含一個window,window中包含一個pane,pane裡開啟了一個shell對話方塊。
    (2) 按下Ctrl + a後手指鬆開,然後按%:將當前pane左右平分成兩個pane。
    (3) 按下Ctrl + a後手指鬆開,然後按"(注意是雙引號"):將當前pane上下平分成兩個pane。
    (4) Ctrl + d:關閉當前pane;如果當前window的所有pane均已關閉,則自動關閉window;如果當前session的所有window均已關閉,則自動關閉session。
    (5) 滑鼠點選可以選pane。
    (6) 按下ctrl + a後手指鬆開,然後按方向鍵:選擇相鄰的pane。
    (7) 滑鼠拖動pane之間的分割線,可以調整分割線的位置。
    (8) 按住ctrl + a的同時按方向鍵,可以調整pane之間分割線的位置。
    (9) 按下ctrl + a後手指鬆開,然後按z:將當前pane全螢幕/取消全螢幕。
    (10) 按下ctrl + a後手指鬆開,然後按d:掛起當前session。
    (11) tmux a:開啟之前掛起的session。
    (12) 按下ctrl + a後手指鬆開,然後按s:選擇其它session。
        方向鍵 —— 上:選擇上一項 session/window/pane
        方向鍵 —— 下:選擇下一項 session/window/pane
        方向鍵 —— 右:展開當前項 session/window
        方向鍵 —— 左:閉合當前項 session/window
    (13) 按下Ctrl + a後手指鬆開,然後按c:在當前session中建立一個新的window。
    (14) 按下Ctrl + a後手指鬆開,然後按w:選擇其他window,操作方法與(12)完全相同。
    (15) 按下Ctrl + a後手指鬆開,然後按PageUp:翻閱當前pane內的內容。
    (16) 滑鼠滾輪:翻閱當前pane內的內容。
    (17) 在tmux中選中文字時,需要按住shift鍵。(僅支援Windows和Linux,不支援Mac,不過該操作並不是必須的,因此影響不大)
    (18) tmux中複製/貼上文字的通用方式:
        (1) 按下Ctrl + a後鬆開手指,然後按[
        (2) 用滑鼠選中文字,被選中的文字會被自動複製到tmux的剪貼簿
        (3) 按下Ctrl + a後鬆開手指,然後按],會將剪貼簿中的內容貼上到遊標處

vim使用

意區分 一般模式和編輯模式
vim 無法修改唯讀檔案,可以修改後 輸入 :w !sudo tee % --強制儲存  然後按 Ctrl + z 退出即可
進入一般模式後
yy   拷貝當前行  p貼上   5yy   拷貝當前行向下的5行
dd   刪除當前行  5dd        刪除當前行向下的五行
在vim底端命令列輸入  /要查詢的內容  即可找到第一個  輸入n尋找下一個  輸入N尋找上一個
命令列輸入  set nu             --顯示行號        set nonu --不顯示行號
復原之前的編輯命令            --在一般模式下輸入u
遊標定位              --一般模式下 行號 shift+g     注意這裡是看不到輸入的行號的


功能:
    (1) 命令列模式下的文字編輯器。
    (2) 根據副檔名自動判別程式語言。支援程式碼縮排、程式碼高亮等功能。
    (3) 使用方式:vim filename
        如果已有該檔案,則開啟它。
        如果沒有該檔案,則開啟個一個新的檔案,並命名為filename
模式:
    (1) 一般命令模式
        預設模式。命令輸入方式:類似於打遊戲放技能,按不同字元,即可進行不同操作。可以複製、貼上、刪除文字等。
    (2) 編輯模式
        在一般命令模式裡按下i,會進入編輯模式。
        按下ESC會退出編輯模式,返回到一般命令模式。
    (3) 命令列模式
        在一般命令模式裡按下:/?三個字母中的任意一個,會進入命令列模式。命令列在最下面。
        可以查詢、替換、儲存、退出、設定編輯器等。
操作:
    (1) i:進入編輯模式
    (2) ESC:進入一般命令模式
    (3) h 或 左箭頭鍵:遊標向左移動一個字元
    (4) j 或 向下箭頭:遊標向下移動一個字元
    (5) k 或 向上箭頭:遊標向上移動一個字元
    (6) l 或 向右箭頭:遊標向右移動一個字元
    (7) n<Space>:n表示數位,按下數位後再按空格,遊標會向右移動這一行的n個字元
    (8) 0 或 功能鍵[Home]:遊標移動到本行開頭
    (9) $ 或 功能鍵[End]:遊標移動到本行末尾
    (10) G:遊標移動到最後一行
    (11) :n 或 nG:n為數位,遊標移動到第n行
    (12) gg:遊標移動到第一行,相當於1G
    (13) n<Enter>:n為數位,遊標向下移動n行
    (14) /word:向遊標之下尋找第一個值為word的字串。
    (15) ?word:向遊標之上尋找第一個值為word的字串。
    (16) n:重複前一個查詢操作
    (17) N:反向重複前一個查詢操作
    (18) :n1,n2s/word1/word2/g:n1與n2為數位,在第n1行與n2行之間尋找word1這個字串,並將該字串替換為word2
    (19) :1,$s/word1/word2/g:將全文的word1替換為word2
    (20) :1,$s/word1/word2/gc:將全文的word1替換為word2,且在替換前要求使用者確認。
    (21) v:選中文字
    (22) d:刪除選中的文字
    (23) dd: 刪除當前行
    (24) y:複製選中的文字
    (25) yy: 複製當前行
    (26) p: 將複製的資料在遊標的下一行/下一個位置貼上
    (27) u:復原
    (28) Ctrl + r:取消復原
    (29) 大於號 >:將選中的文字整體向右縮排一次
    (30) 小於號 <:將選中的文字整體向左縮排一次
    (31) :w 儲存
    (32) :w! 強制儲存
    (33) :q 退出
    (34) :q! 強制退出
    (35) :wq 儲存並退出
    (36) :set paste 設定成貼上模式,取消程式碼自動縮排
    (37) :set nopaste 取消貼上模式,開啟程式碼自動縮排
    (38) :set nu 顯示行號
    (39) :set nonu 隱藏行號
    (40) gg=G:將全文程式碼格式化
    (41) :noh 關閉查詢關鍵詞高亮
    (42) Ctrl + q:當vim卡死時,可以取消當前正在執行的命令
例外處理:
    每次用vim編輯檔案時,會自動建立一個.filename.swp的臨時檔案。
    如果開啟某個檔案時,該檔案的swp檔案已存在,則會報錯。此時解決辦法有兩種:
        (1) 找到正在開啟該檔案的程式,並退出
        (2) 直接刪掉該swp檔案即可
        
 在開啟檔案儲存後,:%!g++ main.c && ./a.out 直接編譯執行   
 :!% + x, x可以為任意命令,!%可以對vim的整個buffer呼叫命令列,並替換當前的buffer(用grep 過濾)
 編輯二進位制唯讀檔案a.out,vim a.out;  然後修改指定位置字元后,:%!xxd 二進位制格式開啟, 修改後 :%!xxd -r 退出二進位制編輯
 :w !sudo tee % 強制寫入

變數

定義變數

定義變數,不需要加$符號,例如:

name1='svicen' # 單引號定義字串
name2="svicen" # 雙引號定義字串
name3=svicen   # 也可以不加引號,同樣表示字串

使用變數

使用變數,需要加上$符號,或者${}符號。花括號是可選的,主要為了幫助直譯器識別變數邊界。

name=svicen
echo $name         # 輸出svicen
echo ${name}       # 輸出svicen
echo ${name}a      # 輸出svicena

唯讀變數

使用readonly或者declare可以將變數變為唯讀。

name=svicen
readonly name
declare -r name  # 兩種寫法均可
name=abc         # 會報錯,因為此時name唯讀

刪除變數

unset可以刪除變數。

name=svicen
unset name
echo $name # 輸出空行

變數型別

自定義變數(區域性變數)
子程序不能存取的變數
環境變數(全域性變數)
子程序可以存取的變數

自定義變數改成環境變數:

acs@9e0ebfcd82d7:~$ name=svicen# 定義變數
acs@9e0ebfcd82d7:~$ export name # 第一種方法
acs@9e0ebfcd82d7:~$ declare -x name # 第二種方法

環境變數改為自定義變數:

acs@9e0ebfcd82d7:~$ export name=svicen# 定義環境變數
acs@9e0ebfcd82d7:~$ declare +x name # 改為自定義變數

關機重啟

shutdown -h now          --立刻關機
shutdown -h 1              --1分鐘後關機
shutdown -r now            --立刻重啟
halt                    --關機,作用同上
reboot                    --重啟,作用同上
sync                    --把記憶體的資料同步到磁碟

使用者管理

useradd -d /home 使用者名稱           --新增使用者,目錄在home下(不新增預設home),預設建一個與其同名的使用者組
passwd 使用者名稱  輸入密碼即可        --為新使用者設定密碼
id 使用者名稱                        --檢視使用者所屬組
userdel    使用者名稱                --刪除使用者,但是保留家目錄
userdel -r 使用者名稱                --刪除使用者,同時刪除家目錄
whoami                          --檢視當前使用者資訊
groupadd 使用者組名                --新增使用者組
groupdel 使用者組名                --刪除使用者組
useradd -g 組名 使用者名稱           --新增使用者的同時將其加入指定組

使用者組相關檔案

  • /etc/passwd檔案

    使用者的組態檔,記錄使用者各種 資訊

    每行的含義:使用者名稱:口令:使用者標識號:組標識號:註釋性描述:主目錄:登入shell

  • /etc/shadow檔案

    口令的組態檔

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

  • /etc/group檔案

    組的組態檔,記錄Linux包含的組的資訊

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

執行級別

執行級別0:系統停機狀態,系統預設執行級別不能設為0,否則不能正常啟動
執行級別1:單使用者工作狀態,root許可權,用於系統維護,禁止遠端登陸
執行級別2:多使用者狀態(沒有NFS),沒有網路連線。
執行級別3:完全的多使用者狀態(有NFS),登陸後進入控制檯命令列模式        最常用,Linux伺服器
執行級別4:系統未使用,保留
執行級別5:X11控制檯,登陸後進入圖形GUI模式                        
執行級別6:系統正常關閉並重啟,預設執行級別不能設為6,否則不能正常啟動
init 3                                        --切換執行級別
systemctl get-default                        --獲取當前執行級別
systemctl get-default mlti-user.target        --設定為執行級別3

找回root密碼

1、首先啟動系統,進入開機介面,在介面中按'e'進入編輯介面,注意要快 15s

2、進入編輯頁面,使用鍵盤上下鍵將遊標移動,找到以「Linux16」開頭的內容所在的行,在行的最後輸入:init=/bin/sh

3、輸入Ctrl+x啟動,進入單使用者模式

4、接著在遊標閃爍的位置輸入mount -o remount,rw / (各個單詞之間有空格),完成後按確認鍵

5、在新的一行輸入passwd ,按回車輸入密碼,然後再次確認密碼即可

6、接著,在滑鼠閃爍的位置(最後一行)插入:touch /.autorelabel(注意touch與/間有一個空格),完成後回車

7、繼續在遊標閃爍的位置,輸入:exec /sbin/init(exec與/之間有空格),完成後回車,等待即可,系統會自動重啟

幫助指令

man 命令                        --獲得幫助資訊
ls -a                         --檢視所有檔案,包括隱藏檔案,linux下以.開頭的檔案為隱藏檔案
ls -l                         --單列顯示ls        還可以ls -la/ls -al
help                          --獲得shell內建命令的幫助資訊

檔案目錄

pwd                                --顯示當前工作目錄的絕對路徑
cd ~                             --家目錄
cd /                            --根目錄
mkdir                            --建立目錄              md /home/animal
mkdir -p                        --建立多級目錄              md -p /home/animal/dog
rmdir 目錄                          --刪除空目錄              rm /home/animal
rmdir -rf 目錄                      --遞迴刪除整個目錄        rm -rf /home/animal
cp 1.txt /test                     --拷貝檔案到指定目錄
cp -r /home/svicen /home/test     --遞迴拷貝整個目錄到指定目錄,將svicen整個給test
\cp -r /home/svicen /home/test     --遞迴拷貝,強制覆蓋原來的檔案
rm                                 --刪除檔案或目錄     -r遞迴刪除整個資料夾     -f強制刪除不提示
mv test0 test01                     --移動檔案與目錄或從重新命名  如果兩檔案在同一目錄則為重新命名
mv test /root/test01             --移動檔案並重新命名
mv /opt/bbb /home                 --移動整個目錄及其下的檔案
cat [-n] 檔名                   --檢視檔案內容        -n 顯示行號
cat -n test | more                 --為了瀏覽方便,一般會加上 管道符|+more  more往往是用來展示的
more --  空格->向下翻一頁  回車->向下翻一行  q->離開more  Ctrl+F->向下捲動一屏 Ctrl+B->向上一屏 :f->輸出檔名和當前行號
less 要檢視的檔案                    --分配檢視檔案,與more類似,但並不是一次全部載入,根據顯示需要載入,效率更高 
echo $PATH                        --輸出內容到控制檯
head -n 5                         --顯示檔案前5行,預設顯示前10行
tail -n 5                        --顯示後五行
taile -f 檔名                  --監視制定檔案,如果其內內容發生變化,在此可以展示變化
重定向  >  --覆蓋內容        >>  --追加內容
ls -l /home > /home/info.txt    --將home目錄下檔案以單列顯示方式寫入到info.txt中
ln -s 原始檔或目錄 軟連結名          --軟連線 ln -s /root /home/myroot  ->  存取myroot就相當於存取root目錄
history                            --檢視歷史命令
!歷史命令編號                        --可以執行歷史命令

時間日期指令

date                             --顯示當前時間,年月日時分秒
date '+%Y-%m-%d'                --顯示年月日,以-分隔  注意大小寫
date -s "2022-04-04 14:23:10"    --設定系統日期
cal                                --檢視本月日曆      cal 2022 顯示2022整年的日曆

查詢指令

find /home -name hello.txt        --在指定目錄下找著指定名的檔案
find /opt -user root | more        --查詢指定目錄下使用者名稱稱為root的檔案
find / size +200M                --查詢整個linux系統下大於200M的檔案 -200M為小於 預設為等於    
ls -lh                            --按照人更直觀的方式顯示檔案大小
updatedb; locate 搜尋檔案         --可以快速定位檔案路徑 注意需要先寫 updatedb
cat 1.txt | grep -n "hello"        --grep過濾查詢,管道符| 表示將前一個命令的結果傳遞給後面的命令處理
grep -n "hello" /home/1.txt        --與上相同

壓縮和解壓

gzip /home/hello.txt                --壓縮檔案
gunzip /home/hello.txt.gz            --解壓檔案

zip                                    --壓縮檔案或資料夾,在專案打包釋出中很有用 
zip -r myhome.zip /home/            --將home及home目錄下的所有檔案及資料夾都壓縮   -r 遞迴壓縮
unzip                                --解壓縮檔案/資料夾
unzip -d /opt/tmp /home/myhome.zip    --解壓到opt/tmp資料夾下

tar                                    --打包命令,最後打包好的是.tar.gz檔案
-c 產生.tar打包檔案    -V 顯示詳細資訊  -f  指定壓縮後檔名  -z 打包同時壓縮  -x  解壓.tar檔案
tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt        多個檔案壓縮為pc.tar.gz
tar -zxvf pc.tar.gz -C opt/tmp         --解壓縮到指定目錄opt/tmp    

Linux組

對於linux的檔案,有三個概念所有者,所在組,其他組
所有者-誰建立的誰為所有者        檢視檔案所有者ls -ahl 或者 ll
組的建立 groupadd        當一個使用者建立一個檔案時,該檔案所屬的組就是該使用者所屬的組
chgrp 組名 檔名                     --修改檔案所在組
其他組 --除了所在組及所有者,系統的其他使用者所在組都是其他組
usermod -g 新組名 使用者名稱                --修改使用者所在組
usermod -d 目錄名 使用者名稱                --改變使用者初始目錄, 前提使用者需要有進入到該目錄的許可權

許可權管理

最左邊一列有10位
1.第0位確定檔案型別(d是目錄,l是連結,b是塊裝置,硬碟  -是普通檔案 c是字元裝置檔案,滑鼠鍵盤)
2.第1-3為確定所有者(該檔案的所有者)擁有該檔案的許可權 ---User
3.第4-6位確定所屬組擁有該檔案的許可權                 --group
4.第7-9位確定其他使用者擁有該檔案的許可權               --other
左數第二列的數位:檔案即為1,為目錄即其子目錄數與子檔案總和
左數第三四列:檔案所有者 和 檔案所在組
左數第五列:檔案大小按位元組數
左數第六列:最近修改日期

rwx作用詳解

  • rwx作用到檔案
1.[r]代表read,可以讀取,檢視
2.[w]代表write,可以修改,但是不一定可以刪除該檔案,刪除一個檔案的前提是對該檔案所在的目錄有寫許可權。
3.[x]代表execute,可以執行
r=4,w=2,x=1 因此 rwx=4+2+1=7    
  • rwx作用到目錄
1.[r]代表read,可以讀取,ls檢視目錄內容
2.[w]代表write,可以修改,對目錄內建立檔案、刪除檔案,重新命名目錄
3.[x]代表execute,可以進入該目錄,但不可以ls    
chmod修改檔案或目錄的許可權        u-所有者  g-所有組  o-其他  a-所有人
第一種方式:+ - = 變更許可權
chmod u=rwx,g=rx,o=x 檔案/目錄名                
chmod o+w 檔案/目錄名                --給檔案的其他使用者賦予修改許可權
chmod a-x 檔案/目錄名                --對所有人去掉可執行許可權
第二種方式:通過數位變更許可權    r=4,w=2,x=1
chmod u=rwx,g=rx,o=x abc 相當於 chmod 751 abc

修改檔案所有者-chown
chown newowner 檔案/目錄            --改變檔案所有者為王newowner
chown -R newowner /home/test       --遞迴改變檔案和其目錄下所有檔案的所有者為newowner

修改檔案/目錄所在組chgrp
chgrp newgroup 檔案/目錄            --改變所在組
chgrp -R newgroup /home/test       --遞迴修改test目錄下所有檔案的所在組為newgroup            

對於目錄

1.被賦予x執行許可權的使用者,該使用者可以進入目錄,但不能讀取目錄,不能使用ls,但是對於該目錄下的檔案該擁有的許可權還是有的
    可以修改或讀取有指定許可權的檔案            1.txt的內容因此被修改
2.賦予w寫許可權的使用者,可以對該目錄下的檔案進行建立、修改   --可以把目錄看成檔案  一切皆檔案
3.賦予r讀許可權的使用者,可以在進入該目錄後ls,但只賦予讀許可權是不能進入檔案目錄的

crond任務排程

  • 常用選項
-e                    編輯crontab定時任務
-l                    列出當前有哪些crontab任務
-r                    刪除當前使用者所有的crontab任務
  • 命令介紹
*/1****ls -l /etc/ > /tmp/to.txt
意思是每小時的每分鐘執行ls -l /etc/ > /tmp/to.txt目錄
  • 五個預留位置說明
專案 含義 範圍
第一個* 一小時當中的第幾分鐘 0-59
第二個* 一天當中的第幾小時 0-23
第三個* 一個月當中的第幾天 1-31
第四個* 一年當中的第幾月 1-12
第五個* 一週當中的星期幾 0-7(0和7都代表星期日)
crontab -e                        --編輯定時任務
  • 特殊符號的說明
特殊符號 含義
* 代表任何時間
, 代表不連續的時間,比如"0 8,12,16 * * *"命令代表在每天的8點0分,12點0分,16點0分都執行一次命令
- 代表連續的時間範圍,比如"0 5 * * 1-6"命令代表在週一到週六的凌晨5點0分執行命令
*/n 代表每隔多久執行一次,比如"* /10* * * *"命令代表每隔10分鐘執行一次命令

0 0 1,15 * 1 命令表示每月1號和15號且是週一的凌晨0點0分執行命令,注意星期幾和幾號最好不要同時寫

at任務排程

  • 基本介紹

    1.at命令是一次性定時任務,at的守護行程atd會以後臺模式執行,檢查作業佇列來執行

    2.預設情況下,atd守護行程每60秒檢查作業佇列,有作業時,會檢查作業執行時間,如果時間與當前時間匹配,則執行該作業

    3.at命令是一次性定時任務,執行完一個任務後便不再執行

    4.在使用at命令時,一定要保證atd程序的啟動,可以使用相關指令來檢視 ps -ef | grep atd

  • at命令格式

at [選項] [時間]            寫完後兩次Ctrl + D代表輸入結束
at now + 2 minutes
>at date > /home/mydate.log            兩分鐘後執行該命令,先要將at服務啟動sudo /etc/init.d/atd start

at 5pm tomorrow
>at /bin/sh ls /home                明天下午5點用sh執行ls命令

at 5pm + 2 days
>at /root/my.sh                        兩天後5點執行指令碼my.sh,前提指令碼存在且有執行許可權

atrm 2                                刪除任務佇列號為2的任務
atq                                    檢視當前任務佇列

磁碟分割區、掛載

  • 分割區的方式

    • mbr分割區
      • 最多支援四個主分割區
      • 系統只能安裝在主分割區
      • 擴充套件分割區要佔一個主分割區
      • MBR最大隻支援2TB,但擁有最好的相容性
    • gpt分割區
      • 支援無限多個主分割區(但作業系統可能限制,比如windows下最多128個分割區)
      • 最大支援18EB的大容量(1EB=1024PB,PB=1024TB)
      • windows7 64位元以後支援gpt
  • Linux分割區

    • Linux來說無論有幾個分割區,分給哪一個目錄使用,它歸根結底就只有一個根目錄,一個獨立且唯一的檔案結構,Linux中每個分割區都是用來組成整個檔案系統的一部分。
    • Linux採用了一種叫做「載入」的處理方法,它的整個檔案系統中包含了一整套的檔案和目錄,且將一個分割區和一個目錄聯絡起來。這時要載入的一個分割區將使它的儲存空間在一個目錄下獲得。
  • 硬碟說明

    • 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硬碟表示方法一樣
    • lsblk -f:檢視當前系統的分割區和掛載情況。(list block)
  • 掛載的經典案例

    • 需求是給我們的Linux系統增加一個新的硬碟,並且掛載到/home/newdisk
    1. 虛擬機器器新增硬碟 ---設定->硬碟->新增

    2. 分割區:fdsk /dev/sdb -- 設定分割區號 Ctrl + backspace 刪除 回車確認 命令哪裡輸入w 寫入並退出

    3. 格式化:mkfs -t ext4 /dev/sdb1 格式化後就有了UUID號

    4. 掛載:新建目錄:mkdir /home/newdisk;掛載:mount /dev/sdb1 /home/newdisk

      命令列下掛載,重啟命令列便無效了

    5. 設定可以自動掛載(永久掛載):重啟系統後,仍然可以掛載。vim etc/fstab 增加掛載資訊賦值修改 UUID或者在UUID的位置寫裝置名/dev/sdb1,之後輸入mount -a或reboot生效

    • 取消掛載:unmount /dev/sdb1
  • 磁碟情況查詢:df -h / df -l

  • 查詢指定目錄的磁碟佔用情況:du -h /目錄,預設為當前目錄

    • -s:指定目錄佔用大小彙總
    • -h:帶計量單位
    • -a:含檔案
    • --max-depth=1:子目錄深度為1
    • -c:列出明細的同時,增加彙總值

    範例:du -hac --max-depth=1 /opt

  • 磁碟情況-工作實用指令

    1. 統計/home資料夾下檔案的個數:ls -l /home | grep "^-" | wc -l 以 - 開頭的為檔案

    2. 統計/home資料夾下目錄的個數:ls -l /home | grep "^d" | wc -l 以 d 開頭的為資料夾

    3. 統計/home資料夾下檔案的個數,包括子資料夾裡的:ls -lR /home | grep "^-" | wc -l

    4. 統計資料夾下目錄的個數,包括子資料夾裡的:ls -lR /home | grep "^d" | wc -l

    5. 以樹狀顯示目錄結構:首先安裝tree指令:yum install tree,tree /home

      tree /home -d --僅列出目錄 tree -l 不給出指定目錄則為當前目錄

網路設定

  • 指定固定IP:直接修改組態檔來指定IP,並可以連線到外網,編輯:vim /etc/sysconfig/network-scripts/ifcfg-eth0

    修改:靜態分配IP:BOOTPROTO="static"

    IP地址:IPADDR=192.168.1.100

    閘道器:GATEWAY = 192.168.200.2

    DNS域名解析器DNS1=192.168.200.2

    接著開啟虛擬機器器,編輯->虛擬網路編輯器->Vmnet8 -> 下的子網IP改為 192.168.200.1 與網路卡和DNS解析器在同一網段

    同時在虛擬網路編輯器下 - > NAT設定 -> 修改閘道器IP為 192.168.200.2

  • 重啟網路服務:service network restart

  • 設定主機名和hosts對映

    在Windows下 C:\Windows\System32\drivers\etc\hosts

    在Linux下 在/etc/hosts檔案指定 寫上 IP地址 和 主機名對映 即可

    主機名解析機制

    1.瀏覽器先檢查瀏覽器快取中有沒有該域名解析IP地址,有就先呼叫這個IP完成解析,如果沒有則檢查DNS解析器快取,如果有直接返回IP完成解析。 這兩個快取可以理解為本地解析器快取。

    2.一般來說,當電腦第一次成功存取某一網站後,在一定時間內,瀏覽器或作業系統會快取他的IP地址(DNS解析記錄)

    ipconfig /displaydns                //DNS域名解析快取
    ipconfig /flushdns                    //手動清理DNS快取
    

    3.如果本地解析器快取沒有找到對應對映,檢查系統中hosts檔案中有沒有設定對應的域名IP對映,有則完成解析

    4.如果本地DNS解析器快取和hosts檔案中均沒有找到對應IP則到DNS伺服器進行解析

程序管理

  • 在Linux中,每個執行的程式(程式碼)都稱為一個程序。每個程序都分配一個ID號

  • 每一個程序,都會對應一個父程序,而這個父程序可以複製多個子程序。例如www伺服器。

  • 每個程序都可能以兩種方式存在:前臺和後臺。

    • 前臺程序:使用者目前的螢幕上可以進行操作的。比如說Vim
    • 後臺程序:實際在操作,但由於螢幕上無法看到的程序,通常使用後臺方式執行。比如說資料庫
  • 一般系統的服務都是以後臺程序的方式存在,而且都會常駐在系統中,直到關機才結束。

  • 顯示系統執行的程序

    • ps:檢視目前系統中,有哪些正在執行,以及它們執行的狀況。可以不加任何引數。PID:程序識別號;TTY:終端機號;TIME:此程序所消耗的CPU時間;CMD:正在執行的命令或程序名; RSS:佔實體記憶體的情況 VSZ: 佔虛擬記憶體的情況

      STAT:程序狀態,S-睡眠 R-正在執行 D-短期等待 Z-僵死程序,需要定時清除 T-被跟蹤或者被停止

    • ps -a:顯示當前終端的所有程序資訊。

    • ps -u:以使用者的格式顯示程序資訊。

    • ps -x:顯示後臺程序執行的引數。

    • ps -axu | grep xxx:過濾得到xxx的資訊。 ps -axu | grep sshd

    • ps -ef:以全格式顯示當前所有的程序,檢視程序的父程序PPID。

    • -e:顯示所有程序。

    • -f:全格式。

  • 終止程序

    • kill [選項] 程序號:通過程序號殺死程序

    • killall 程序名稱:通過程序名稱殺死程序,也支援萬用字元,這在系統因負載過大而變得很慢時很有用

    • -9:表示強迫程序立刻停止

    • 案例1:踢掉非法使用者:kill 程序號

    • 案例2:終止遠端登入服務sshd,在適當時候再次重啟sshd服務

      kill sshd對應的程序號; /bin/systemctl start sshd.service --重啟sshd服務

    • 案例3:終止多個gedit編輯器:killall 程序名稱

      killall gedit

    • 案例4:強制殺掉一個終端:kill -9 程序號 對於正在執行的終端直接kill 程序號 系統會認為是誤操作

  • 檢視程序樹:pstree [選項]

    • -p:顯示程序的PID
    • -u:顯示程序的所屬使用者
  • 服務(service)管理

    • service管理指令:service 服務名 [start | stop | restart | reload | status]

    • 在CentOS7.0之後,不再使用service,而是systemctl,被service管理的服務主要是/etc/init.d下的服務

      service network stop --停止網路服務 service network start --啟動網路服務

    • 檢視防火牆情況:

      • service iptables status
      • systemctl status firewalld(7.0之後的版本)
    • 測試某個埠是否在監聽:telnet

    • 檢視服務名:

      • 方式1:使用setup->系統服務就可以看到

        前面帶*的為自啟動的,遊標停在上面按空格可以取消自啟動 按tab退出

      • 方式2:/etc/init.d/服務名稱 ls -l /etc/init.d --檢視init.d下的服務名稱

    • 服務的執行級別(runlevel):

      • 檢視或修改預設級別:systemctl get-default --檢視當前服務級別 systemctl set-default multi-user. target

        vim /etc/inittab

      • 每個服務對應的每個執行級別都可以設定

    • 如果不小心將預設的執行級別設定成0或者6,怎麼處理?

      • 進入單使用者模式,修改成正常的即可。
    • chkconfig:可以給每個服務的各個執行級別設定自啟動/關閉 ---不適用於Ubuntu系統可用 sudo apt-get install sysv-rc-conf

      • 檢視xxx服務:chkconfig –list | grep xxx

      • 檢視服務的狀態:chkconfig 服務名 --list

      • 給服務的執行級別設定自啟動:chkconfig –level 5 服務名 on/off

      • 要所有執行級別關閉或開啟:chkconfig 服務名 on/off

    • 應用範例檢視防火牆狀況,關閉和重啟防火牆

      • systemctl status firewalld ubuntu下 ufw status

      wsl2裡面沒有 systemd 命令,我們需要用 sudo /etc/init.d/docker start 代替 sudo systemctl start docker

      • systemctl stop firewalld systemctl start firewalld 臨時生效

      • systemctl is-enabled firewalld --判斷是否是自啟動 systemcal disable firewalld --設定為開機不自啟動

        注:上面兩個命令對於Centos 7 以後的系統的3和5執行級別同時生效

    • firewall指令

      • firewall-cmd --permanent --add-port=111/tcp --在防火牆中開放埠111開啟後需 firewall-cmd --reload
      • firewall-cmd --permanent --remove-port=111/tcp --在防火牆中關閉埠111 reload
      • firewall-cmd --permanent --query-port=111/tcp ---查詢埠是否開放
  • 動態監控程序

    • top [選項]

    • top和ps命令很相似。它們都用來顯示正在執行的程序。top和ps最大的不同之處在於top在執行一段時間可以更新正在執行的程序。

    • -d 秒數:指定top命令每隔幾秒更新。預設是3秒。

    • -i:使top不顯示任何閒置或者僵死程序。

    • -p:通過指定監控程序ID來僅僅監控某個程序的狀態。

    • 案例1:監控特定使用者:top檢視程序;u輸入使用者名稱。

      top ; u ; 輸入使用者: Tom

    • 案例2:終止指定的程序:top檢視程序;k輸入要結束的程序。

    • 案例3:指定系統狀態更新的時間(每隔10秒自動更新,預設是3秒):top -d 10

    • 互動操作說明:

      • P:以CPU使用率排序,預設就是此項
      • M:以記憶體的使用率排序
      • N:以PID排序
      • q:退出top
  • 監控網路狀態

    • netstat [選項]
    • -an:按一定順序排列輸出
    • -p:顯示哪個程序在呼叫

RPM

  • RPM:RedHat Package Manager,紅帽軟體包管理工具。

  • RPM查詢已安裝的rpm列表:rpm -qa | grep xx

    範例:檢視當前系統是否安裝Firefox:rpm -qa | grep firefox

  • rpm包的其它查詢指令:

    • rpm -qa:查詢所安裝的所有rpm軟體包
    • rpm -qa | more
    • rpm -qa | grep xx
    • rpm -q xx:查詢xx軟體包是否安裝
    • rpm -qi xx:查詢軟體包資訊
    • rpm -ql xx:查詢軟體包中的檔案
    • rpm -qf 檔案全路徑名:查詢檔案所屬的軟體包
  • 解除安裝rpm包:rpm -e 軟體包名稱 強制刪除 rpm -e --nodeps foo

  • 刪除時可能會發生依賴錯誤,忽視依賴強制刪除的方法:rpm -e --nodeps 軟體包名稱

  • 安裝rpm包:rpm -ivh 軟體包全路徑名稱

    • i=install:安裝
    • v=verbose:提示
    • h=hash:進度條

YUM

  • YUM:是一個shell前端軟體包管理器。基於RPM包管理,能夠從指定的伺服器自動下載RPM包並安裝,可以自動處理依賴性關係,並且一次安裝所有依賴的軟體包。使用yum的前提是聯網。
  • yum list | grep xx:查詢yum伺服器是否有需要安裝的軟體
    • Ubuntu下 apt list | grep
  • yum install xx:安裝指定的yum包
  • yum -y remove xx:解除安裝指定的yum包

shell程式設計

  • vim hello.sh

    #!/bin/bash(zsh)
    echo "helloworld!"
    
  • 指令碼的常用執行方式

    • 方式一:輸入指令碼的絕對路徑或相對路徑,需要先賦予hello.sh指令碼的x許可權,sudo chmod u+x hello.sh
    • 方式二:(sh + 指令碼)說明:不用賦予指令碼+x許可權,直接執行 比如 sh hello.sh
  • Shell的變數

    變數分為:系統變數和使用者自定義變數

    • 系統變數:$HOME、$PWD、$SHELL、$USER等等,比如echo $HOME等等
    • 顯示當前shell中所有變數:set

    shell變數的定義

    • 定義變數:變數名=值
    • 復原變數:unset 變數
    • 宣告靜態變數:readonly變數,注意:不能unset

    案例

    • 定義變數A

      vim var.sh

      #!/bin/bash(zsh)
      A=100
      echo $A            # ./var.sh   --100
      echo A=$A        # ./var.sh   --A=100
      echo "A=$A"        # ./var.sh   --A=100
      
    • 復原變數

      unset A

    • 宣告靜態變數

      readonly B=2    # 還可以 declare -r B 宣告為唯讀變數
      echo "B=$B"
      #unset B  --不可以unset B
      #顯示行號  :nu
      

    shell變數命名規則

    • 變數名稱可以由字母、數位、下劃線組成,但是不能以數位開頭
    • 等號兩側不能有空格
    • 變數名稱一般習慣大寫

    將命令的返回值賦給變數

    A=`date`   #反引號,執行裡面的命令,並把結果返回給變數A
    A=$(date)  #等價於反引號    
    
  • 設定環境變數

    export 變數名=變數值      #功能描述:將shell變數輸出為環境變數/全域性變數
    source 組態檔             #功能描述:讓修改後的設定資訊立即生效
    echo $變數名              #功能描述:查詢環境變數的值
    
    • 快速入門

      #1.在/etc/profile檔案中定義TOMCAT_HOME環境變數
      tomcat位於/opt/   檔案目錄下 
      vim /etc/profile
      export TOMCAT_HOME=/opt/tomcat
      sourse /etc/profile
      #2.檢視環境變數的值
      echo $TOMCAT_HOME
      #3.在另外一個shell程式中使用TOMCAT_HOME
      vim var.sh
      echo "tomcat_home=$TOMCAT_HOME"
      :<<! 
          多行註釋 
      !
      
  • 位置引數變數

    當我們執行一個shell指令碼時,如果希望獲取到命令列的引數資訊,就可以使用到未知引數變數

    • 基本語法

      • $n (功能描述:n為數位,$0代表目錄本身,$1-$9代表第一到第九個引數,十以上的引數需要用大括號包含,如${10})
      • $* (功能描述:這個變數代表命令列中所有的引數,$*把所有的引數看成一個整體)
      • $@ (功能描述:這個變數也代表命令列中所有的引數,不過$@把每個引數區分對待)
      • $# (功能描述:這個變數代表命令列中所有引數的個數)(不限於9個,但統計數量時不包含作為第一個引數的Shell檔名)
    • 案例:

      編寫一個shell指令碼,position.sh,在指令碼中獲取到命令列的各個引數資訊

  • 預定義變數

    就是shell設計者事先已經定義好的變數,可以直接在shell指令碼中使用

    • 基本語法
      • $$ (功能描述:當前程序的程序號(PID))
      • $! (功能描述:後臺執行的最後一個程序的程序號(PID))
      • $?(功能描述:最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值非0,則證明上一個命令執行不正確了)
      • $-用於得到當前Shell(用set)設定的執行標識名組成的字串
  • 運運算元

    • 基本語法

      • "$((運算式))"或"$[運算式]"或者expr m + n //expression 表示式
      • 注意expr運運算元間要有空格,如果希望將expr的結果賦給某個變數,使用``
      • expr m - n
      • expr \*,/,% 乘,除,取模
    • 範例

      • 計算(2+3)*4的值

        vim operator.sh
        #!bin/bash
        #第一種方式:
        RES1=$(((2+3)*4))
        echo "res1=$RES1"
        #第二種方式
        RES2=$[(2+3)*4]
        echo "res2=$RES2"           #推薦使用
        #第三種方式
        TEMP=`expr 2 + 3`            #注意要用空格,否則輸出結果為 2+3
        RES3=`expr $TEMP \* 4`
        echo "temp=$TEMP"
        echo "res3=$RES3"
        
      • 求出命令列的兩個引數[整數]的和 20 50

        SUM=$[$1+$2]    
        echo "sum=$SUM"
        

        然後再命令列輸入 ./operator.sh 20 50 --輸出結果 sum=70

  • 條件判斷

    • 基本語法

      if [ condition ] (注意condition前後要有空格) 非空返回true,可使用$?驗證(0為true,>1為false)

    • 範例

      [ abc ] --返回true [] --返回false [ condition ] && echo ok || echo notok 條件滿足執行後邊的語句

    • 判斷語句

      • 常用判斷條件

        1)= 字串比較,判斷兩個字串是否相等
        2)兩個整數的比較
        -lt 小於
        -le 小於等於
        -eq 等於
        -gt 大於
        -ge 大於等於
        -ne 不等於
        3)按照檔案許可權劃分
        -r 有讀的許可權
        -w 有寫的許可權
        -x 有執行的許可權
        4)按照檔案型別劃分
        -f 檔案存在並且是一個常規檔案
        -e 檔案存在
        -d 檔案存在並是一個目錄
        
      • 應用範例

        vim ifdemo.sh
        #!bin/bash
        #案例1:判斷"ok"是否等於"ok"
        if [ "ok" = "ok" ]
        then 
            echo "equal"
        fi
        #案例2:23是否大於等於22
        if [ 23 -ge 22 ]
        then
            echo "大於"
        fi
        #案例3:/root/shcode/aaa.txt 判斷目錄中的檔案是否存在
        if [ -f /root/shcode/aaa.txt ]
        then 
            echo "存在"
        fi
        
  • 流程控制

    多分支語句

    案例:如果輸入的引數大於60,則輸出及格了,否則輸出不及格

    #!/bin/bash
    if [ $1 -ge 60 ]
    then 
        echo "及格了"
    elif [ $1 -lt 60 ]
    then
        echo "不及格"
    

    case語句

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

    for語句

    vim testFor1.sh
    #!/bin/bash
    #基本語法1
    << comment
        for 變數 in 值1 值2 值3...
        do
            程式主程式碼
        done
    comment
    #案例1:列印命令列輸入的引數
    for i in "$*"   #  $*把所有的引數看成一個整體
    do
        echo "num is $i"  #這裡只會輸出一句話
    done
    
    for j in "$@"        #$@把每個引數區分對待
    do 
        echo "num is $j" 
    done
    #基本語法2
    for ((初始值;迴圈控制條件;變數變化))
    do     
        主程式程式碼
    done
    #案例2:從1到100的值累加顯示
    SUM=0
    for ((i=1; i<=100; i++))
    do
        SUM=$[$SUM+$I]
    done
    echo "sum=$SUM"
    

    while語句

    while [ 條件判斷式 ]

    do

    ​ 程式

    done

    vim testWhile.sh
    #!/bin/bash
    #案例1:從命令列輸入一個引數n,統計1+2+..+n
    SUM=0
    i=0
    while [ $i -le $1 ]
    do
        SUM=$[$SUM+$i]
        # i自增
        i=$[$i+1]
    done
    echo "結果=$SUM"
    
  • read獲取控制檯輸入

    read(選項)(引數)
    選項:
    -p:指定讀取值時的提示符
    -t:指定讀取值時等待的時間(秒),如果沒有在指定時間內輸入,就不再等待了
    引數:變數:指定讀取值的變數名
    #範例:testRead.sh
    #案例1:讀取控制檯輸入一個num值
    #!/bin/bash
    read -P "請輸入一個數num=" NUM1
    echo "你輸入的num=$NUM1"
    #案例2:讀取控制檯輸入一個num值,在10秒內輸入
    read -t 10 -P "請輸入一個數num=" NUM2
    echo "你輸入的num=$NUM2"
    
  • 函數

    • 系統函數

      basename:功能為返回完整路徑的最後/的部分,常用於獲取檔名

      basename [pathname] [suffix] (選項suffix為字尾,如果suffix被指定了,basename會將pathname或string的suffix去掉)
      basename [string] [suffix] (功能:basename命令後會刪掉所有的字首包括最後一個/字元,然後將字串顯示出來)
      #案例1:返回/home/aaa/test.txt的"test.txt"部分
      basename /home/aaa/test.txt            --test.txt
      basename /home/aaa/test.txt    .tst    --test
      

      dirname:功能為返回完整路徑最後/的前面部分,常用於返回路徑部分

      dirname /home/aaa/test.txt            --/home/aaa
      
    • 自定義函數

      function funname ()
      {
          Action;
          [return int;]
      }
      #呼叫時直接寫函數名:funname [引數值]
      #案例1:計算輸入的兩個引數的和(動態獲取)
      vim testFunc.sh
      #!/bin/bash
      #定義函數
      function getSum(){
          SUM=$[$n1+$n2]
          echo "和=$SUM"
      }
      #控制檯輸入兩個值
      read -P "請輸入一個數n1=" n1
      read -P "請輸入一個數n2=" n2
      #呼叫
      getSum $n1 $n2
      

    expr表示式說明:

    用空格隔開每一項
    用反斜槓放在shell特定的字元前面(發現表示式執行錯誤時,可以試試跳脫)
    對包含空格和其他特殊字元的字串要用引號括起來
    expr會在stdout中輸出結果。如果為邏輯關係表示式,則結果為真,stdout為1,否則為0。
    expr的exit code:如果為邏輯關係表示式,則結果為真,exit code為0,否則為1。
    

    字串表示式

    length STRING
    返回STRING的長度
    index STRING CHARSET
    CHARSET中任意單個字元在STRING中最前面的字元位置,下標從1開始。如果在STRING中完全不存在CHARSET中的字元,則返回0。
    substr STRING POSITION LENGTH
    返回STRING字串中從POSITION開始,長度最大為LENGTH的子串。如果POSITION或LENGTH為負數,0或非數值,則返回空字串。
    

    範例:

    str="Hello World!"
    echo `expr length "$str"`  # ``不是單引號,表示執行該命令,輸出12
    echo `expr index "$str" aWd`  # 輸出7,下標從1開始
    echo `expr substr "\$str" 2 3`  # 輸出 ell
    

    整數表示式

    expr支援普通的算術操作,算術表示式優先順序低於字串表示式,高於邏輯關係表示式。

    + -
    加減運算。兩端引數會轉換為整數,如果轉換失敗則報錯。
    
    * / %
    乘,除,取模運算。兩端引數會轉換為整數,如果轉換失敗則報錯。
    
    () 可以改變優先順序,但需要用反斜槓跳脫
    

    邏輯關係表示式

    或運運算元 |
    如果第一個引數非空且非0,則返回第一個引數的值,否則返回第二個引數的值,但要求第二個引數的值也是非空或非0,否則返回0。如果第一個引數是非空或非0時,不會計算第二個引數。
    與運運算元 &
    如果兩個引數都非空且非0,則返回第一個引數,否則返回0。如果第一個參為0或為空,則不會計算第二個引數。
    比較運運算元 < <= = == != >= >
    比較兩端的引數,如果為true,則返回1,否則返回0。」==」是」=」的同義詞。」expr」首先嚐試將兩端引數轉換為整數,並做算術比較,如果轉換失敗,則按字元集排序規則做字元比較。
    () 可以改變優先順序,但需要用反斜槓跳脫
    
  • Shell程式設計綜合案例

    • 需求分析:

      1.每天凌晨``2:30備份資料庫hspedu/data/backup/db`

      2.備份開始和結束能夠給出相應的提示資訊

      3.備份後的檔案要求以備份時間為檔名,並打包成.tar.gz的形式,比如2021-04-10_104515.tar.gz

      4.在備份的同時,檢查是否有10天前備份的資料庫檔案,如果有就將其刪除

    #!/bin/bash
    #備份目錄
    BACKUP=/data/backup/db
    #獲取當前時間
    DATETIME=$(date +%Y-%m-%d_%H%M%S)
    #資料庫的地址
    HOST=localhost
    #資料庫使用者名稱
    DB_USER=root
    #資料庫密碼
    DB_PW=root
    #備份的資料庫
    DATABASE=hspedu
    #建立備份目錄,如果不存在就建立,如果存在就直接使用
    [ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"  #! -d 表示如果不是一個目錄  {}為可選的
    #備份資料庫                                        -q -R表示若有多個資料庫都備份
    mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --datebases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
    #將檔案處理成tar.gz形式
    cd ${BACKUP} 
    tar -zcvf $DATETIME.tar.gz ${DATETIME}  # 將${DATETIME}壓縮為$DATETIME.tar.gz
    #刪除備份的資料夾目錄及之下的檔案
    rm -rf ${BACKUP}/${DATETIME} 
    #檢查是否有十天前備份的檔案,將其刪除
    find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;    #-atime +10 查詢十天前建立的備份檔案
    echo "備份資料庫${DATABASE}成功"
    
    #設定定時任務
    crontab -e
    30 2 * * * /usr/sbin/mysql_db_backup.sh(以上所寫指令碼檔案所在目錄)            
    

紀錄檔