1. 程式人生 > >《Linux就該這麽學》培訓筆記_ch04_Vim編輯器與Shell命令腳本

《Linux就該這麽學》培訓筆記_ch04_Vim編輯器與Shell命令腳本

測試 配置服務 alt ref cell file tab cront mod

《Linux就該這麽學》培訓筆記_ch04_Vim編輯器與Shell命令腳本

文章最後會post上書本的筆記照片。

文章主要內容

  • Vim編輯器
  • Shell腳本
  • 流程控制語句
    • if語句
    • for循環
    • while循環
    • case語句
  • 計劃任務服務程序
  • 書本筆記

Vim編輯器

Linux中一切都是文件,配置服務其實就是在修改其配置文件的參數。

Vim編輯器用於編輯文本文件內容,是vi編輯器的升級版,與Vi相比,Vim編輯器有代碼著色

Vim編輯器有3中模式:

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

技術分享圖片

運行Vim編輯器默認進入命令模式。按下aio可進入輸入模式進行文檔編輯。按下Esc鍵退出當前模式並返回命令模式。按下:進入末行模式。輸入模式和末行模式不能直接切換。

命令模式常用命令:

  • dd:刪除(剪切)光標所在整行
  • ndd:刪除(剪切)從光標處開始的n行。例子:10dd,即刪除(剪切)從光標處開始的10行。1dd = dd(沒有意義)
  • yy:復制光標所在整行
  • nyy:復制從光標處開始的n行。例子:7dd,即復制從光標處開始的7行。1yy = yy(沒有意義)
  • n:顯示搜索命令定位到的下一個字符串
  • N:顯示搜索命令定位到的上一個字符串
  • u:撤銷上一步的操作
  • p:將之前刪除(dd)或復制(yy)過的數據粘貼到光標後面

a、i、o進入輸入模式區別:

  • a鍵:在光標後一位切換;
  • i鍵:光標當前位置;
  • o鍵:光標下面在創建一個空行;

末行模式可用命令:

命令 作用
: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
?字符串 在文本中從下至上搜索該字符串
/字符串 在文本中從上至下搜索該字符串

配置主機名稱

1 vim /etc/hostname    #在Linux系統中,主機名大多保存在/etc/hostname文件中
2 kamin.com            #把原始主機名刪除後追加想要更改的主機名,按Esc鍵返回命令模式,按:進入末行模式執行wq!強制保存並退出

配置Yum軟件倉庫

  • 1.添加光盤,檢查光盤是否被識別;
  • 2.創建一個目錄作為掛載點;
  • 3.用mount命令把光盤掛載到掛載點;
  • 4.進入/etc/yum.repos.d/目錄,創建Yum倉庫配置文件(xxx.repo,名字隨意,但是後綴必須是repo),編輯好相關配置參數;
  • 5.把光盤的掛載信息追加寫入到/etc/fstab文件中,使得該掛載信息永久生效。
 1 mkdir -p /media/cdrom                           #創建掛載點
 2 mount /dev/cdrom /media/cdrom                   #把光盤掛載到/media/cdrom
 3 cd /etc/yum.repos.d/                            #進入到/etc/yum.repos.d/目錄中
 4 vim rhel7.repo                                  #創建Yum倉庫配置文件(文件名稱隨意,但後綴必須是.repo),5-9行是文件內容
 5 [rhel7]                                         #Yum軟件倉庫唯一標識符,避免與其他倉庫沖突
 6 name=rhel7                                      #Yum軟件倉庫的名稱描述,易於識別倉庫用處
 7 baseurl=file:///media/cdrom                     #Yum軟件倉庫的路徑。支持格式有FTP(ftp://..)、HTTP(http://)、本地(file:///)
 8 enabled=1                                       #設置此源是否可用;1可用,0禁用
 9 gpgcheck=0                                      #設置此源是否檢驗文件,1校驗,0不校驗
10 vim /etc/fstab                                  #把掛載信息寫入/etc/fstab,實現永久掛載。11行為文件的追加內容。
11 /dev/cdrom /media/cdrom iso9660 defaults 0 0    #設備文件 掛載目錄 格式類型 權限選項 是否備份 是否自檢(1是0否)

Shell腳本

Shell腳本名稱隨意,但一般後綴為.sh,以表示是腳本文件。

Shell腳本格式:(腳本聲明和腳本正文必須有,腳本註釋可以沒有)

1 vim test.sh
2 #!/bin/bash                #腳本聲明,告訴系統用那種shell解釋器執行該腳本
3 #This is a test program    #腳本註釋
4 pwd                        #腳本正文,常見命令配合流程控制語句等組成有一定功能的腳本程序
5 ls -l

運行Shell腳本方法

  • 1)bash 腳本文件所在位置/腳本文件名。ex:bash Desktop/test.sh
  • 2)./腳本文件所在位置/腳本文件名。這種方式需要有文件的執行權限(默認沒有)。要用chmod命令為文件增加執行權限。
1 bash Desktop/test.sh         #方法1:bash 腳本的相對位置。
2 ./Desktop/test.sh            #方法2:./腳本的相對位置。現在執行會報錯,因為創建的腳本文件默認是沒有執行權限的
3 chmod u+x Desktop/test.sh    #為腳本文件增加屬主的執行權限
4 ./Desktop/test.sh            #現在執行就可以了。

Shell腳本內設的用於接收參數的變量

  • $0:當前Shell腳本程序的名稱
  • $#:總共有幾個參數
  • $*:所有位置的參數值
  • $?:顯示上一次命令的執行返回值
  • $1、$2、$3...:分別對應著第N個位置的參數值

實例:

1 vim example.sh
2 #!/bin/bash
3 echo "當前腳本名稱為$0"             #當前腳本名稱為example.sh
4 echo "總共有$#個參數,分別是$*。"    #總共有3個參數,分別是one two three
5 echo "第1個參數為$1,第3個為$3。"    #第1個參數為one,第3個為three。
6 bash example.sh one two three

條件測試語句[ 條件表達式 ]。兩邊均有空格,條件測試語句不能配合管道符。

文件測試語句參數:

操作符 作用
-d 測試文件是否為目錄類型
-e 測試文件是否存在
-f 判斷是否為一般文件
-r 測試當前用戶是否有權限讀取
-w 測試當前用戶是否有權限寫入
-x 測試當前用戶是否有權限執行
1 [ -d /etc/fstab ]    #/etc/fstab是存放設備掛載信息的配置文件,不是目錄,因此返回值為1
2 echo $?              #返回上一條命令執行後的返回值
3 [ -e /etc/fstab ]    #/etc/fstab文件是實打實存在的文件,返回值0
4 [ -f /etc/fstab ]    #/etc/fstab是一般文件,返回0
5 [ -r /etc/fstab ]    #/etc/fstab文件當前用戶root是可讀的,返回0
6 [ -w /etc/fstab ]    #/etc/fstab文件當前用戶root是可寫的,返回0
7 [ -x /etc/fstab ]    #/etc/fstab文件當前用戶root是不可執行的,返回1

邏輯測試語句參數(返回0則成功,返回1則失敗):

  • 邏輯與(&&):當前面的命令執行成功後才會執行後面的命令;
  • 邏輯或(||):當前面的命令執行失敗後才會執行後面的命令;
  • 邏輯非(!):條件測試中的判斷結果取反;
1 [ ! $USER = root ] && echo "user" || echo "root"    #先判斷當前登錄用戶的USER變量值是否為root,然後取反。即如果當前登錄用戶的USER變量值不為root,則輸出user,反之輸出root。

整數比較語句參數:

操作符 作用
-eq 是否等於
-ne 是否不等於
-gt 是否大於
-lt 是否小於
-le 是否等於或小於
-ge 是否大於或等於

以下例子創建變量FreeMem,記錄系統當前剩余內存量。先通過free -m命令查看內存使用量情況(以MB來顯示),然後通過grep Mem:命令過濾出剩余內存量的那行,最後通過awk ‘{print $4}‘命令只保留第4列(這裏列按空格區分開)

1 FreeMem=`free -m | grep Mem: | awk {print $4}`    
2 [ $FreeMem -lt 1024 ] && echo "內存不足"             #如果FreeMem的值小於1024,則輸出內存不足

字符串比較語句參數:

操作符 作用
= 比較字符串內容是否相同
!= 比較字符串內容是否不同
-z 判斷字符串內容是否為空
1 SB="zhouhw"
2 [ $SB != "liwh" ] && echo "zhou hong wei is SB"    #如果SB不等於liwh,則輸出zhou hong wei is SB

流程控制語句

if語句

單分支:if...then...fi

雙分支:if...then...else...fi

技術分享圖片

ping命令:用於測試與對方主機的網絡連通性。格式:ping [參數] 對方主機ip地址。

常用參數:

  • -c:規定嘗試次數;
  • -i:定義數據包發送間隔;
  • -W:定義等待超時時間。

/dev/null:被稱作Linux黑洞的文件,把輸出重定向到這個文件等同於刪除數據,讓用戶的屏幕窗口保持簡潔。

1 vim chkhost.sh
2 #!/bin/bash                              #腳本聲明
3 ping -c 3 -i 0.2 -W 3 $1 &> /dev/null    #測試看能否ping通對方主機ip,並將輸出結果重定向/dev/null中保持界面整潔
4 if [ $? -eq 0 ]                          #如果$?為0則成功,說明能ping通對方主機,反之ping不通。
5 then
6 echo "Host $1 is On-line."
7 else
8 echo "Host $1 is Off-line."
9 fi

多分支:if...then...elif...then...else...fi

技術分享圖片

 1 vim chkscore.sh
 2 #!/bin/bash                                           #腳本聲明
 3 read -p "Enter your score(0-100):" GRADE            #read命令讀取用戶輸入信息並賦值給後面指定變量GRADE,-p用於向用戶顯示一定的提示信息 4 if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then     #如果85 ≤ GRADE ≤ 100,則Excellent
 5 echo "$GRADE is Excellent"
 6 elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then    #如果70 ≤ GRADE ≤ 84,則Pass
 7 echo "$GRADE is Pass"
 8 else                                                  #兜底,即上面條件都不匹配,則執行這條之下的腳本
 9 echo "$GRADE is Fail" 
10 fi

for循環

技術分享圖片

for循環語句允許腳本一次性讀取多個信息,然後逐一對信息進行處理。

紅帽考試:編寫一個可以批量創建用戶的Shell腳本

 1 vim users.txt                                          #創建用戶名稱的列表文件
 2 zhangsan
 3 lisi
 4 wangwu
 5 vim Example.sh                                         #編寫批量創建用戶腳本
 6 #!/bin/bash                                            #腳本聲明
 7 read -p "Enter The Users Password : " PASSWD           #讀取用戶輸入的信息,賦值給PASSWD變量
 8 for UNAME in `cat users.txt`                           #cat命令讀取文件users.txt,for循環開始先把第一行賦值給UNAME變量,依此類推。
 9 do                                                     #for循環邏輯開始
10 id $UNAME &> /dev/null                                 #id命令檢查系統中是否存在此用戶
11 if [ $? -eq 0 ] ; then                                 #根據上一次執行命令的結果是否為0,即如果該用戶已存在,輸出“已存在”,反之則創建該用戶
12 echo "Already exists"
13 else
14 useradd $UNAME &> /dev/null                            #創建用戶,並將輸出結果重定向到黑洞文件保持界面整潔
15 echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null    #通過管道符傳遞的方法設置密碼,免去passwd命令原本需要交互式設置的麻煩
16 if [ $? -eq 0 ] ; then                                 #雖然上兩條命令基本上不會出錯,但為了程序更嚴謹,還是要判斷下命令是否執行成功,0成功非0失敗,並分別輸出相應提示信息。
17 echo "$UNAME , Create success"                         
18 else
19 echo "$UNAME , Create failure"
20 fi                                                     #裏層if語句結束
21 fi                                                     #外層if語句結束
22 done                                                   #for循環結束

同理,批量ping對方主機的腳本思路類似。

while循環

技術分享圖片

若條件為真就繼續執行,反之跳出循環。

實例:用多分支if語句配合while條件循環語句編寫猜數字的小遊戲腳本。

 1 vim Guess.sh
 2 #!/bin/bash
 3 PRICE=$(expr $RANDOM % 1000)                #使用$RANDOM變量來調取出一個隨機的數值(範圍為0~32767),將這個隨機數對1000進行取余操作,並使用expr命令取得其結果
 4 TIMES=0                                     #創建TIMES變量,用於累計用戶猜數字的次數
 5 echo "商品實際價格為0-999之間,猜猜看是多少?"    
 6 while true                                  #條件永遠為真,循環會無限執行下去,下面會有exit 0語句終止腳本執行
 7 do                                          #循環開始
 8 read -p "請輸入您猜測的價格數目:" INT          #read讀取輸入的數值
 9 let TIMES++                                 #TIMES變量自增1,即猜數字次數累計1次
10 if [ $INT -eq $PRICE ] ; then               #如果輸入的數字跟隨機生成的數字一致,說明猜對了。(第三行生成的數字不在循環內,因此知道程序結束,生成的數字都是不會變的)
11 echo "恭喜您答對了,實際價格是 $PRICE"
12 echo "您總共猜測了 $TIMES 次"
13 exit 0                                      #終止腳本執行
14 elif [ $INT -gt $PRICE ] ; then             #輸入數字比生成數字高,提示太高
15 echo "太高了!"
16 else                                        #兜底,既猜不對數字,又不是比生成數字高,那就是太低了
17 echo "太低了!"      
18 fi                                          #if語句結束
19 done                                        #while循環結束

該腳本只能接收數字,如果輸入數字以外的字符,腳本就會奔潰並報錯,並判斷條件一定跳到兜底輸出“太低了”。

case語句

技術分享圖片

實例:用case語句和通配符判斷用戶輸入的字符是數字、字母還是其他字符。

 1 vim Checkkeys.sh
 2 #!/bin/bash
 3 read -p "請輸入一個字符,並按Enter鍵確認:" KEY    #read讀取用戶輸入信息
 4 case "$KEY" in                                #case語句開始
 5 [a-z]|[A-Z])                                  #如果輸入的字符(只能是1位,aD則會跳到兜底)是大寫字母或者小寫字母,則輸出是字母
 6 echo "您輸入的是 字母。"
 7 ;;                                            #是否為字母的判斷邏輯結束
 8 [0-9])                                        #如果是數字(只能1位,10、99等則會跳到兜底),則輸出是數字
 9 echo "您輸入的是 數字。"
10 ;;                                            #是否為數字的判斷邏輯結束
11 *)                                            #兜底,輸出其他字符
12 echo "您輸入的是 空格、功能鍵或其他控制字符。"
13 esac                                          #case語句結束

計劃任務服務程序

計劃任務可以在指定的時間段自動啟動或停止某些服務或命令,實現運維的自動化。

計劃任務:

  • 一次性計劃任務:只執行一次,一般用於臨時的工作需求。
  • 長期性計劃任務:按照設定的時間周期,重復執行用戶指定的命令操作。

at命令:用於設置一次性計劃任務。格式:at [時間]/[參數]。

at命令常見用法:

1 at 23:30                                       #at 24小時制時間 命令在當天23:30設置一個一次性計劃任務,下面進入到at命令的交互式設置
2 at > systemctl restart network                 #淺藍色為at命令交互式設置的默認開頭,後面可以編輯相應命令,這裏是設置了重啟網卡服務的命令 
3 at > 按下Ctrl + D結束編寫計劃任務                 #如果計劃任務編寫完了,不要按Ctrl + C,這樣會在沒有保存計劃任務的情況下強行退出at交互式設置。要按Ctrl + D來保存相關設置並退出at計劃任務設置。
4 echo "systemctl restart network" | at 23:30    #通過管道符的方式設置計劃任務,跟前面通過交互來設置的效果一樣
5 at -l                                          #at -l查看已設置好但還沒執行的一次性計劃任務,已執行的一次性計劃任務會自動刪除,所以已執行的一次性計劃任務在這裏是查不到的。其中列出信息的第一列表示任務序號6 atrm 1                                         #atrm 任務序號 刪除對應任務序號的一次性計劃任務。任務序號是按一次性計劃任務的設置順序來遞增賦予的。
7 at -l                                          #再查看一次已設置好但還沒執行的一次性計劃任務,會發現任務序號為1的計劃任務已經不見了。

Linux中默認啟用的crond服務是用來周期性的執行某種任務或等待處理某些事件的一個守護進程。crond服務通過crontab命令來實現。

crontab命令:用於配置周期性計劃任務。格式:crontab [選項]。

常用參數:

  • -e:創建、編輯計劃任務;
  • -l:查看當前計劃任務;
  • -r:刪除某條計劃任務;
  • -u:編輯對應用戶的計劃任務(管理員身份才能用);

使用crond設置任務的參數格式:分 時 日 月 星期 命令,如果有些字段沒有設置,則使用星號(*)占位。

註意:

  • “分”字段必須有數值,不能為空或者是*號;
  • “日”和“星期”字段不能同時使用,否則會發生沖突;
字段 說明
分鐘 取值為0~59的整數
小時 取值為0~23的任意整數
日期 取值為1~31的任意整數
月份 取值為1~12的任意整數
星期 取值為0~7的任意整數,其中0與7均為星期日
命令 要執行的命令或程序腳本

實例:

  • 1.先創建一個周期性計劃任務,實現在每周一、三、五的淩晨3點25分把root用戶桌面打包作為一個備份文件;
  • 2.查看當前計劃任務內容,再編輯計劃任務,追加一條計劃任務,實現在每周一到周五的淩晨1點鐘把/tmp/目錄下所有文件刪掉;
1 crontab -e                                                      #進入周期性計劃任務編輯界面,其實就是調用了Vim編輯器
2 25 3 * * 1,3,5 /usr/bin/tar -czvf backup,tar,gz /root/Desktop   #寫入周期性計劃任務設置信息,在crond服務的計劃任務參數中,所有命令必須使用絕對路徑的方式來寫,whereis命令可以查詢命令的絕對路徑。
3 crontab -l                                                      #查看當前計劃任務
4 crontab -e                                                      #再次進入計劃任務編輯,追加計劃內容
5 0 1 * * 1-5 /usr/bin/rm -rf /tmp/*

書本筆記

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

《Linux就該這麽學》培訓筆記_ch04_Vim編輯器與Shell命令腳本