《Linux就該這麼學》學習筆記(四)——Vim編輯器與Shell命令腳本

本次內容

  1. Vim文本編輯器
  2. 編寫Shell腳本
  3. 流程控制語句
  4. 計劃任務與服務程序

1.Vim文本編輯器

Vim 編輯器中設置了三種模式——命令模式末行模式編輯模式linux

  • 命令模式:控制光標移動,可對文本進行復制、粘貼、刪除和查找等工做
  • 輸入模式:正常的文本錄入
  • 末行模式:保存或退出文檔,以及設置編輯環境

咱們能夠經過命令vim 文件名來使用vim編輯器打開或建立一個文件。當文件存在時,則表示使用vim編輯器打開,不存在則建立。在每次運行 Vim 編輯器時,會默認進入命令模式。三種模式各有不一樣的做用和快捷方式,如下是三種模式之間的切換方式:正則表達式

命令模式中經常使用命令:vim

命令 做用
dd 刪除(剪切)光標所在整行
5dd 刪除(剪切)從光標處開始的5行
yy 複製光標所在整行
5yy 複製從光標處開始的5行
n 顯示搜索命令定位到的下一個字符串
N 顯示搜索命令定位到的上一個字符串
u 撤銷上一步的操做
p 將以前刪除(dd)或複製(yy)過的數據粘貼到光標後面

末行模式主要是用於保存或退出文件,以及設置 Vim 編輯器的工做環境,還可讓用戶執行外部的 Linux 命令或跳轉到所編寫文檔的特定行數。
末行模式中經常使用命令:bash

命令 做用
:w 保存
:q 退出
:q! 強制退出(放棄對文檔的修改內容)
:wq! 強制保存退出
:set nu 顯示行號
:set nonu 不顯示行號
:命令 執行該命令
:整數 跳轉到該行
:s/one/two 將當前光標所在行的第一個 one 替換成 two
:s/one/two/g 將當前光標所在行的全部 one 替換成 two
:%s/one/two/g 將全文中的全部 one 替換成 two
?字符串 在文本中從下至上搜索該字符串
/字符串 在文本中從上至下搜索該字符串

2.編寫Shell腳本

Shell 腳本命令的工做方式有兩種:交互式和批處理。編輯器

  • 交互式:用戶每輸入一條命令就當即執行
  • 批處理:由用戶事先編寫好一個完整的 Shell 腳本,Shell 會一次性執行腳本中諸多的命令

2.1編寫簡單腳本

建立或編輯腳本文件的命令較爲簡單,咱們直接經過第一節中介紹的命令vim 文件名將文件打開或建立便可。可是爲了不 Shell 腳本被誤覺得是普通文件,建議將.sh做爲後綴加上。例如: vim example.sh ,建立的腳本以下:學習

#!/bin/bash
#For Example BY linuxprobe.com
pwd
ls -al
複製代碼

以上就是一個簡單的腳本,在第一行,咱們經過 腳本聲明(#!) 來告訴系統使用哪一種 Shell 解釋器來執行該腳本;第二行經過 註釋信息(#) 來對腳本的某些功能和命令進行介紹;以後咱們就能夠寫入 Linux 命令了;這是一種良好的編寫腳本習慣。保存並退出後,咱們能夠直接經過 bash 解釋器命令來運行 Shell 腳本,格式爲 bash 文件名。或者是經過輸入完整路徑來運行如 ./example.sh,不過這種方式默認會由於權限不足而報錯,咱們能夠修改腳本的權限。測試

2.2接收用戶的參數

咱們也可使用 Shell 腳本內設的變量來接收用戶輸入的參數。內設變量以下:網站

  • $0:當前 Shell 腳本程序的名稱
  • $#:總共有幾個參數
  • $*:全部位置的參數值
  • $?:上一次命令的執行返回值。也可用於判斷上一條命令是否成功執行,若是成功則變量爲0,不然爲非零數
  • $一、$二、$3:第 N 個位置的參數值

使用範例以下:
腳本內容:ui

#!/bin/bash
echo "當前腳本名稱爲$0"
echo "總共有$#個參數,分別是$*。"
echo "第 1 個參數爲$1,第 5 個爲$5。"
複製代碼

執行腳本命令:bash example.sh one two three four five six
執行結果:spa

當前腳本名稱爲 example.sh
總共有 6 個參數,分別是 one two three four five six。
第 1 個參數爲 one,第 5 個爲 five。
複製代碼

2.3 條件測試語句

Shell 腳本中的條件測試語句能夠用來判斷某一個條件是否成立,格式爲[ 條件表達式 ],須要注意的是條件表達式和兩邊的中括號都要有一個空格。若是測試語句成立則返回0,不然返回其餘隨機數值。 按照測試對象的類型來劃分,條件測試語句主要分爲如下四種:

  • 文件測試語句
  • 邏輯測試語句
  • 整數值比較語句
  • 字符串比較語句

2.3.1 文件測試

文件測試即便用指定條件來判斷文件是否存在或權限是否知足等狀況的運算符,具體的參數以下:

運算符 做用
-d 測試文件是否爲目錄類型
-e 測試文件是否存在
-f 判斷是否爲通常文件
-r 測試當前用戶是否有權限讀取
-w 測試當前用戶是否有權限寫入
-x 測試當前用戶是否有權限執行

使用範例:

  1. 判斷/etc/fstab是否爲一個目錄類型的文件:[ -d /etc/fstab ]
  2. 判斷/etc/fstab是否爲通常文件:[ -f /etc/fstab ]

2.3.2 邏輯測試

邏輯語句用於對測試結果進行邏輯分析,根據測試結果可實現不一樣的效果。

邏輯運算 符號 特色
&& 當前面的命令執行成功後纔會執行它後面的命令
|| 當前面的命令執行失敗後纔會執行它後面的命令
! 把條件測試中的判斷結果取相反值

使用範例:

  1. 來判斷/dev/cdrom 文件是否存在,若存在則輸出 Exist 字樣:[ -e /dev/cdrom ] && echo "Exist"
  2. 結合系統環境變量 USER 來判斷當前登陸的用戶是否爲非管理員身份:[ $USER = root ] || echo "user"
  3. [ ! $USER = root ] && echo "user" || echo "root",這條命令相比上面兩條稍複雜一點。它表示先判斷當前登陸用戶的 USER 變量名稱是否等於 root,而後用邏輯運算符「非」進行取反操做,效果就變成了判斷當前登陸的用戶是否爲非管理員用戶了。最後若條件成立則會根據邏輯「與」運算符輸出 user 字樣;或條件不知足則會經過邏輯「或」運算符輸出 root 字樣,而若是前面的&&不成立纔會執行後面的||符號。

2.3.3 整數值比較

整數比較運算符以下:

運算符 做用
-eq 是否等於
-ne 是否不等於
-gt 是否大於
-lt 是否小於
-le 是否等於或小於
-ge 是否大於或等於

使用範例:

  1. 10 是否大於 10:[ 10 -gt 10 ]
  2. 10 是否等於 10:[ 10 -eq 10 ]

2.3.4 字符串比較

字符串比較語句用於判斷測試字符串是否爲空值,或兩個字符串是否相同。它常常用來判斷某個變量是否未被定義(即內容爲空值)

運算符 做用
= 比較字符串內容是否相同
!= 比較字符串內容是否不一樣
-z 判斷字符串內容是否爲空

使用範例:

  1. 判斷 String 變量是否爲空值:[ -z $String]
  2. 若是環境變量 LANG 不是英語則打印相關信息:[ $LANG != "en.US" ] && echo "Not en.US"

3.流程控制語句

學習太高級語言的人應該對於流程控制語句都不會感到陌生。Shell 腳本中的流程控制語句使用方法和高級語言中的相似,只是語法細節上略有不一樣。

3.1 if條件測試語句

if 條件測試語句可讓腳本根據實際狀況自動執行相應的命令。從技術角度來說,if 語句分爲單分支結構、雙分支結構、多分支結構;其複雜度隨着靈活度一塊兒逐級上升。

  1. 單分支結構:單分支結構由 if、then、fi 關鍵詞組成,至關於口語的「若是……那麼……」。語法格式以下圖:

    使用範例:使用單分支的 if 條件語句來判斷/media/cdrom 文件是否存在,若存在就結束條件判斷和整個 Shell 腳本,反之則去建立這個目錄

    #!/bin/bash
    DIR="/media/cdrom"
    if [ ! -e $DIR ]
    then
    mkdir -p $DIR
    fi
    複製代碼
  2. 雙分支結構:雙分支結構由 if、then、else、fi 關鍵詞組成,至關於口語的「若是……那麼……或者……那麼……」。語法格式以下圖:

    使用範例:使用雙分支的 if 條件語句來驗證某臺主機是否在線,而後根據返回值的結果,要麼顯示主機在線信息,要麼顯示主機不在線信息。注意, Linux 系統中的 ping 命令不像 Windows 同樣嘗試4次就結束,所以爲了不用戶等待時間過長,須要經過-c 參數來規定嘗試的次數,並使用-i 參數定義每一個數據包的發送間隔,以及使用-W 參數定義等待超時時間。

    #!/bin/bash
    ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
    if [ $? -eq 0 ]
    then
    echo "Host $1 is On-line."
    else
    echo "Host $1 is Off-line."
    fi
    複製代碼
  3. 多分支結構:多分支結構由 if、then、else、elif、fi 關鍵詞組成,至關於口語的「若是……那麼……若是……那麼……」。語法格式以下圖:

    使用範例:使用多分支的 if 條件語句來判斷用戶輸入的分數在哪一個成績區間內,而後輸出如 Excellent、Pass、Fail 等提示信息。注意,在這個範例中使用了read命令。在 Linux 系統中,read 是用來讀取用戶輸入信息的命令,可以把接收到的用戶輸入信息賦值給後面的指定變量,-p 參數用於向用戶顯示必定的提示信息。

    #!/bin/bash
    read -p "Enter your score(0-100):" GRADE
    if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
    echo "$GRADE is Excellent"
    elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
    echo "$GRADE is Pass"
    else
    echo "$GRADE is Fail"
    fi
    複製代碼

3.2 for條件循環語句

for 循環語句容許腳本一次性讀取多個信息,而後逐一對信息進行操做處理。語法格式以下圖:

使用範例:在這個範例中,咱們的腳本將從列表文件中讀取用戶名併爲其建立用戶並設置密碼。咱們首先經過命令id 用戶名查看用戶的信息,若是此命令執行成功則表示用戶已存在,那麼將不會再次建立。注意,/dev/null 是一個被稱做 Linux 黑洞的文件,把輸出信息重定向到這個文件等同於刪除數據(相似於沒有回收功能的垃圾箱)
列表文件:

andy
barry
carl
duke
eric
george
複製代碼

Shell:

#!/bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done
複製代碼

3.3 while條件循環語句

while 條件循環語句和for 條件循環語句最大的區別在於前者一般並不肯定要循環的次數,它經過判斷條件測試的真假來決定是否繼續執行命令,若條件爲真就繼續執行,爲假就結束循環。語法格式以下圖:

使用範例:在這個範例中咱們實現了一個猜商品價格的小功能。有以下幾點須要注意:

  1. RANDOM 是一個隨機數變量,咱們能夠經過它獲取一個隨機數值
  2. expr 命令用於獲取表達式的值,格式爲expr 表達式
  3. $ 轉義字符相似於以前介紹過的 `` ,都是執行其中的命令後返回結果
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
INT=1001
TIMES=0
echo "商品實際價格爲 0-999 之間,猜猜看是多少?"
while [ $INT -ne $PRICE ]
do
read -p "請輸入您猜想的價格數目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答對了,實際價格是 $PRICE"
echo "您總共猜了 $TIMES 次"
elif [ $INT -gt $PRICE ] ; then
echo "過高了!"
else
echo "過低了!"
fi
done
複製代碼

3.4 case條件測試語句

case 語句是在多個範圍內匹配數據,若匹配成功則執行相關命令並結束整個條件測試;而若是數據不在所列出的範圍內,則會去執行星號(*)中所定義的默認命令。語法結構如圖:

使用範例:在這個範例中咱們要求用戶輸入一個字符,咱們會判斷這個字符屬於哪一種類型。 注意,| 在正則表達式中表示「或」

#!/bin/bash
read -p "請輸入一個字符,並按 Enter 鍵確認:" KEY
case "$KEY" in
[a-z]|[A-Z])    # | 在正則表達式中表示 或者
echo "您輸入的是 字母。"
;;
[0-9])
echo "您輸入的是 數字。"
;;
*)
echo "您輸入的是 空格、功能鍵或其餘控制字符。"
esac
複製代碼

4.計劃任務與服務程序

咱們能夠在Linux系統中設置計劃任務,計劃任務又分爲一次性計劃任務長期性計劃任務

  • 一次性計劃任務:今晚 11 點 30 分開啓網站服務
  • 長期性計劃任務:每週一的凌晨 3 點 25 分把/home/wwwroot 目錄打包備份爲backup.tar.gz

能夠看到,一次性計劃任務相似於定時任務,而長期性計劃任務則相似於週期任務。

4.1 設置一次性計劃任務

設置一次性計劃任務的方式較爲簡單,咱們能夠經過命令 at 來實現。格式爲at 時間;若是想要查看已設置好但還未執行的一次性計劃任務,可使用at -l命令;要想將其刪除,能夠用atrm 任務序號。此外,at 命令容許使用一套至關複雜的指定時間的方法以下:

  1. 可以接受在當天的hh:mm(小時:分鐘)式的時間指定。假如該時間已過去,那麼就放在次日執行。
  2. 也可以使用midnight(深夜),noon(中午),teatime(飲茶時間,通常是下午4點)等比較模糊的 詞語來指定時間。
  3. 用戶還可以採用12小時計時制,即在時間後面加上AM(上午)或PM(下午)來講明是上午仍是下午。
  4. 也可以指定命令執行的具體日期,指定格式爲month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必須跟在指定時間的後面。
  5. 上面介紹的都是絕對計時法,其實還可以使用相對計時法,這對於安排不久就要執行的命令是頗有好處的。指定格式爲:now + count time-units,now就是當前時間,time-units是時間單位,這裏可以是minutes、hours、days、weeks。count是時間的數量,到底是幾天,仍是幾小時,等等。
  6. 更有一種計時方法就是直接使用today(今天)、tomorrow(明天)來指定完成命令的時間。

使用範例:

at 23:30
at > systemctl restart httpd
at > 此處請同時按下 Ctrl + D 組合鍵來結束編寫計劃任務
複製代碼

4.2 設置長期性計劃任務

咱們可使用Linux 系統中默認啓用的 crond 服務來運行長期性計劃任務。如下是使用方法:

  • 建立、編輯計劃任務的命令:crontab -e
  • 查看當前計劃任務的命令:crontab -l
  • 刪除某條計劃任務的命令:crontab -r
  • 若是當前帳號身份爲管理員,那麼可使用參數 u 來編輯他人的任務如:crontab -u linuxprobe -e

Linux 系統中一切都是文件,所以咱們配置服務其實也是在修改服務的配置文件。當咱們去使用 crond 服務時,其實也是在修改配置文件,文件默認是使用 Vim 編輯器打開。任務的配置有一套固定的格式;「分、時、日、月、星期 命令」,若是有些字段沒有設置,則須要使用星號(*)佔位,如圖:

使用 crond 設置任務的參數字段說明:

字段 說明
取值爲 0~59 的整數
取值爲 0~23 的任意整數
取值爲 1~31 的任意整數
取值爲 1~12 的任意整數
星期 取值爲 0~7 的任意整數,其中 0 與 7 均爲星期日
命令 要執行的命令或程序腳本

在文件中進行配置時,有如下幾點須要注意:

  • 命令必須使用全路徑名,例如命令 rm 的全路徑名爲 /usr/bin/rm ,不知道的全路徑名能夠經過命令whereis 命令名進行查詢
  • 逗號(,)能夠用來表示多個時間段,如字段 月 的取值爲 「5,9,12」 表示5月、9月、12月
  • 減號(-)能夠用來表示一段連續的時間週期,如字段 日 的取值爲 「12-15」 表示12~15日
  • 除號(/)能夠用來表示時間間隔,如字段 分鐘 的取值爲 「*/2」 表示每2分鐘
  • 計劃任務中的「分」字段必須有數值,絕對不能爲空或是*號,而「日」和「星期」字段不能同時使用,不然就會發生衝突
  • 若是有多個任務須要配置,那麼在配置文件中,每一個任務應該單獨佔一行

使用範例:
每週1、3、五的凌晨 3 點 25 分,都須要使用 tar 命令把某個網站的數據目錄進行打包處理,使其做爲一個備份文件
命令:crontab -e
文件中的配置:25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

相關文章
相關標籤/搜索