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 |
?字符串 | 在文本中從下至上搜索該字符串 |
/字符串 | 在文本中從上至下搜索該字符串 |
Shell 腳本命令的工做方式有兩種:交互式和批處理。編輯器
建立或編輯腳本文件的命令較爲簡單,咱們直接經過第一節中介紹的命令vim 文件名
將文件打開或建立便可。可是爲了不 Shell 腳本被誤覺得是普通文件,建議將.sh做爲後綴加上。例如: vim example.sh ,建立的腳本以下:學習
#!/bin/bash
#For Example BY linuxprobe.com
pwd
ls -al
複製代碼
以上就是一個簡單的腳本,在第一行,咱們經過 腳本聲明(#!) 來告訴系統使用哪一種 Shell 解釋器來執行該腳本;第二行經過 註釋信息(#) 來對腳本的某些功能和命令進行介紹;以後咱們就能夠寫入 Linux 命令了;這是一種良好的編寫腳本習慣。保存並退出後,咱們能夠直接經過 bash 解釋器命令來運行 Shell 腳本,格式爲 bash 文件名
。或者是經過輸入完整路徑來運行如 ./example.sh
,不過這種方式默認會由於權限不足而報錯,咱們能夠修改腳本的權限。測試
咱們也可使用 Shell 腳本內設的變量來接收用戶輸入的參數。內設變量以下:網站
使用範例以下:
腳本內容: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。
複製代碼
Shell 腳本中的條件測試語句能夠用來判斷某一個條件是否成立,格式爲[ 條件表達式 ]
,須要注意的是條件表達式和兩邊的中括號都要有一個空格。若是測試語句成立則返回0,不然返回其餘隨機數值。 按照測試對象的類型來劃分,條件測試語句主要分爲如下四種:
文件測試即便用指定條件來判斷文件是否存在或權限是否知足等狀況的運算符,具體的參數以下:
運算符 | 做用 |
---|---|
-d | 測試文件是否爲目錄類型 |
-e | 測試文件是否存在 |
-f | 判斷是否爲通常文件 |
-r | 測試當前用戶是否有權限讀取 |
-w | 測試當前用戶是否有權限寫入 |
-x | 測試當前用戶是否有權限執行 |
使用範例:
[ -d /etc/fstab ]
[ -f /etc/fstab ]
邏輯語句用於對測試結果進行邏輯分析,根據測試結果可實現不一樣的效果。
邏輯運算 | 符號 | 特色 |
---|---|---|
與 | && | 當前面的命令執行成功後纔會執行它後面的命令 |
或 | || | 當前面的命令執行失敗後纔會執行它後面的命令 |
非 | ! | 把條件測試中的判斷結果取相反值 |
使用範例:
[ -e /dev/cdrom ] && echo "Exist"
[ $USER = root ] || echo "user"
[ ! $USER = root ] && echo "user" || echo "root"
,這條命令相比上面兩條稍複雜一點。它表示先判斷當前登陸用戶的 USER 變量名稱是否等於 root,而後用邏輯運算符「非」進行取反操做,效果就變成了判斷當前登陸的用戶是否爲非管理員用戶了。最後若條件成立則會根據邏輯「與」運算符輸出 user 字樣;或條件不知足則會經過邏輯「或」運算符輸出 root 字樣,而若是前面的&&不成立纔會執行後面的||符號。整數比較運算符以下:
運算符 | 做用 |
---|---|
-eq | 是否等於 |
-ne | 是否不等於 |
-gt | 是否大於 |
-lt | 是否小於 |
-le | 是否等於或小於 |
-ge | 是否大於或等於 |
使用範例:
[ 10 -gt 10 ]
[ 10 -eq 10 ]
字符串比較語句用於判斷測試字符串是否爲空值,或兩個字符串是否相同。它常常用來判斷某個變量是否未被定義(即內容爲空值)
運算符 | 做用 |
---|---|
= | 比較字符串內容是否相同 |
!= | 比較字符串內容是否不一樣 |
-z | 判斷字符串內容是否爲空 |
使用範例:
[ -z $String]
[ $LANG != "en.US" ] && echo "Not en.US"
學習太高級語言的人應該對於流程控制語句都不會感到陌生。Shell 腳本中的流程控制語句使用方法和高級語言中的相似,只是語法細節上略有不一樣。
if 條件測試語句可讓腳本根據實際狀況自動執行相應的命令。從技術角度來說,if 語句分爲單分支結構、雙分支結構、多分支結構;其複雜度隨着靈活度一塊兒逐級上升。
單分支結構:單分支結構由 if、then、fi 關鍵詞組成,至關於口語的「若是……那麼……」。語法格式以下圖:
使用範例:使用單分支的 if 條件語句來判斷/media/cdrom 文件是否存在,若存在就結束條件判斷和整個 Shell 腳本,反之則去建立這個目錄#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
複製代碼
雙分支結構:雙分支結構由 if、then、else、fi 關鍵詞組成,至關於口語的「若是……那麼……或者……那麼……」。語法格式以下圖:
#!/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
複製代碼
多分支結構:多分支結構由 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
複製代碼
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
複製代碼
while 條件循環語句和for 條件循環語句最大的區別在於前者一般並不肯定要循環的次數,它經過判斷條件測試的真假來決定是否繼續執行命令,若條件爲真就繼續執行,爲假就結束循環。語法格式以下圖:
expr 表達式
#!/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
複製代碼
case 語句是在多個範圍內匹配數據,若匹配成功則執行相關命令並結束整個條件測試;而若是數據不在所列出的範圍內,則會去執行星號(*)中所定義的默認命令。語法結構如圖:
使用範例:在這個範例中咱們要求用戶輸入一個字符,咱們會判斷這個字符屬於哪一種類型。 注意,| 在正則表達式中表示「或」#!/bin/bash
read -p "請輸入一個字符,並按 Enter 鍵確認:" KEY
case "$KEY" in
[a-z]|[A-Z]) # | 在正則表達式中表示 或者
echo "您輸入的是 字母。"
;;
[0-9])
echo "您輸入的是 數字。"
;;
*)
echo "您輸入的是 空格、功能鍵或其餘控制字符。"
esac
複製代碼
咱們能夠在Linux系統中設置計劃任務,計劃任務又分爲一次性計劃任務和長期性計劃任務。
能夠看到,一次性計劃任務相似於定時任務,而長期性計劃任務則相似於週期任務。
設置一次性計劃任務的方式較爲簡單,咱們能夠經過命令 at 來實現。格式爲at 時間
;若是想要查看已設置好但還未執行的一次性計劃任務,可使用at -l
命令;要想將其刪除,能夠用atrm 任務序號
。此外,at 命令容許使用一套至關複雜的指定時間的方法以下:
使用範例:
at 23:30
at > systemctl restart httpd
at > 此處請同時按下 Ctrl + D 組合鍵來結束編寫計劃任務
複製代碼
咱們可使用Linux 系統中默認啓用的 crond 服務來運行長期性計劃任務。如下是使用方法:
crontab -e
crontab -l
crontab -r
crontab -u linuxprobe -e
Linux 系統中一切都是文件,所以咱們配置服務其實也是在修改服務的配置文件。當咱們去使用 crond 服務時,其實也是在修改配置文件,文件默認是使用 Vim 編輯器打開。任務的配置有一套固定的格式;「分、時、日、月、星期 命令」,若是有些字段沒有設置,則須要使用星號(*)佔位,如圖:
使用 crond 設置任務的參數字段說明:
字段 | 說明 |
---|---|
分 | 取值爲 0~59 的整數 |
時 | 取值爲 0~23 的任意整數 |
日 | 取值爲 1~31 的任意整數 |
月 | 取值爲 1~12 的任意整數 |
星期 | 取值爲 0~7 的任意整數,其中 0 與 7 均爲星期日 |
命令 | 要執行的命令或程序腳本 |
在文件中進行配置時,有如下幾點須要注意:
whereis 命令名
進行查詢使用範例:
每週1、3、五的凌晨 3 點 25 分,都須要使用 tar 命令把某個網站的數據目錄進行打包處理,使其做爲一個備份文件
命令:crontab -e
文件中的配置:25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot