1. 程式人生 > >Vim編輯器與Shell命令腳本

Vim編輯器與Shell命令腳本

程序 info inf 例子 httpd 執行權限 執行權 修改主機名 輸入

1.Vim文本編輯器

默認安裝在當前所有Linux系統中的文本編輯器,有三種模式:

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

默認為命令模式,需先切換至輸入模式再進行文檔編寫,編寫完畢需先返回命令模式,再進入末行模式,執行文檔保存或退出。無法直接從輸入模式切換至末行模式。

Vim中的常用命令:

  • dd:刪除(剪切)光標所在行
  • 5dd:刪除(剪切)從光標處開始的5行
  • yy:復制光標所在行
  • 5yy:復制從光標處開始的5行
  • n:顯示搜索命令定位到的下一個字符
  • N:顯示搜索命令定位到的上一個字符
  • u:撤銷上一步操作
  • p:粘貼之前刪除(dd)或復制(yy)的數據到光標後

末行模式中可用的命令

  • :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.1 編寫簡單文檔

技術分享圖片

首先打開文檔practice.txt,如果文檔不存在,則創建一個臨時的輸入文件。

這裏默認是命令模式,不能隨意輸入文本,需要按下a、i 或 o 鍵方能切換至輸入模式,其中,a 和 i 分別表示在光標後一位和光標當前位置切換到輸入模式,o 則是在光標的下面再創建一個空行,此時敲擊 a 鍵進入輸入模式。

技術分享圖片

然後便可以輸入文本。

技術分享圖片

如果想要保存,必須先按下Esc鍵退出輸入模式 返回命令模式,然後再輸入 :wq! 切換到末行模式才能完成保存退出操作。

技術分享圖片

然後就可以查看文檔的內容了

技術分享圖片

如果要在原有文檔後面追加內容,則從命令模式切換至輸入模式時,使用 o 鍵更加方便。

1.2 配置主機名稱

為了便於在局域網中查找某臺特定的主機,或者對主機進行區分,除了要有IP地址外,還要為主機配置一個主機名,主機之間可以通過這個類似於域名的名稱來相互訪問。在Linux
系統中,主機名大多保存在/etc/hostname文件中,接下來將/etc/hostname文件的內容修改為“linuxprobe.com”,步驟如下。

第1步:使用Vim編輯器修改“/etc/hostname”主機名稱文件。

第2步:把原始主機名稱刪除後追加“linuxprobe.com”。註意,使用Vim編輯器修改主機名稱文件後,要在末行模式下執行:wq!命令才能保存並退出文檔。

第3步:保存並退出文檔,然後使用hostname命令檢查是否修改成功。

hostname命令用於查看當前的主機名稱,但有時主機名稱的改變不會立即同步到系統中,所以如果發現修改完成後還顯示原來的主機名稱,可重啟虛擬機後再行查看

技術分享圖片

1.3 配置網卡信息

網卡IP地址配置的是否正確是兩臺服務器是否可以相互通信的前提。在Linux系統中,一切都是文件,因此配置網絡服務的工作其實就是在編輯網卡配置文件

在RHEL 7中,網卡配置文件的前綴以ifcfg開始,加上網卡名稱共同組成了網卡配置文件的名字,例如ifcfg-eno16777736,ifconfig-ens32 等

配置網卡設備為開機啟動,並且IP地址、子網、網關等信息由人工指定,步驟如下:

  1. 首先切換到 /etc/sysconfig/network-scripts 目錄中(存放著網卡的配置文件)

  2. 使用Vim編輯器修改網卡文件ifcfg-ens32,逐項寫入下面的配置參數並保存退出。由於每臺設備的硬件及架構是不一樣的,可使用ifconfig命令確認網卡的默認名稱

TYPE=Ethernet
BOOTPROTO=static
NAME=ens32
ONBOOT=yes
IPADDR=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=192.168.10.1

技術分享圖片

  1. 重啟網絡服務並測試網絡是否連通

技術分享圖片

執行重啟網卡設備的命令(在正常情況下不會有提示信息),然後通過ping命令測試網絡能否聯通。由於在Linux系統中ping命令不會自動終止,因此需要手動按下Ctrl-c鍵來強行結束進程。

1.4 配置Yum軟件倉庫

Yum軟件倉庫的作用是為了進一步簡化RPM管理軟件的難度以及自動分析所需軟件包及其依賴關系的技術。可以把Yum想象成是一個碩大的軟件倉庫,裏面保存有幾乎所有常用的
工具,而且只需要說出所需的軟件包名稱,系統就會自動為您搞定一切。

搭建並配置Yum軟件倉庫的大致步驟如下所示。

第1步:進入到/etc/yum.repos.d/目錄中(因為該目錄存放著Yum軟件倉庫的配置文件)。

第2步:使用Vim編輯器創建一個名為rhel7.repo的新配置文件(文件名稱可隨意,但後綴必須為.repo),逐項寫入下面的配置參數並保存退出(不要寫後面的中文註釋)。

[rhel-media] :Yum軟件倉庫唯一標識符,避免與其他倉庫沖突。

name=linuxprobe:Yum軟件倉庫的名稱描述,易於識別倉庫用處。

baseurl=file:///media/cdrom:提供的方式包括FTP(ftp://..)、HTTP(http://..)、本地(file:///..)。

 enabled=1:設置此源是否可用;1為可用,0為禁用。

 gpgcheck=1:設置此源是否校驗文件;1為校驗,0為不校驗。

 gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release:若上面參數開啟校驗,那麽請指定公鑰文件地址。

 第3步:按配置參數的路徑掛載光盤,並把光盤掛載信息寫入到/etc/fstab文件中。

 第4步:使用“yum install httpd -y”命令檢查Yum軟件倉庫是否已經可用。

2.編寫Shell腳本

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

交互式(Interactive):用戶每輸入一條命令就立即執行。

批處理(Batch):由用戶事先編好一個完整的Shell腳本,Shell會一次性的執行腳本中的諸多命令。

查看SHELL變量發現系統已默認使用Bash作為命令行的終端解釋器了。

技術分享圖片

2.1 編寫簡單的腳本

創建example.sh並寫入如下內容

技術分享圖片

Shell腳本的文件可以任意命名,但是為了避免被誤認為普通文件,一般以 .sh 後綴命名。

上面的文件中出現了三總不同的元素:

第一行的腳本聲明(#!)告訴系統使用哪種Shell解釋器執行腳本;

第二行的註釋信息(#)是對腳本功能和某些命令的介紹;

第三、四行是可執行語句,即Linux命令。

執行結果如下:

技術分享圖片

除了通過bash命令直接運行Shell腳本之外,還可以通過輸入完整路徑的方式來執行。這種方式默認會因為權限不足報錯,此時只需為腳本文件增加執行權限即可。

技術分享圖片

2.2 接收用戶的參數

上文腳本命令過於死板,為了能夠接收用戶的參數,可以使用Linux內設的用於接受參數的變量。

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

examle.sh:
技術分享圖片

執行
技術分享圖片

2.3 判斷用戶的參數

Shell腳本中的條件測試語法可以判斷表達式是否成立,若成立返回數字0,否則返回其他隨機數。條件測試語句格式:[ 條件表達式 ],條件表達式兩邊均應有一個空格。

按測試對象劃分,條件測試語句可分為四種:文件測試語句、邏輯測試語句、整數值比較語句、字符串比較語句。

文件測試即使用指定條件來判斷文件是否存在 或 權限是否滿足等情況的運算符。文件測試的運算符及其作用:

-d:測試文件是否為目錄類型
-e:測試文件是否存在
-f:判斷是否為一般文件
-r:測試當前用戶是否有權限讀取
-w:測試當前用戶是否有權限寫入
-x:測試當前用戶是否有權限執行

技術分享圖片

判斷 /etc/fstab 是否為一個目錄類型的文件,返回值不是0,所以不是一個目錄類型的文件。

技術分享圖片

返回值為0,所以 /etc/fstab 是個一般文件。

技術分享圖片

&& 在Shell中是邏輯“與”的運算符,表示前面的命令執行成功才會執行它後面的命令。

|| 表示邏輯“或”,前面命令執行失敗才會執行後面的。

技術分享圖片

還有一種邏輯語句是“非”,符號為感嘆號(!),表示把條件測試中的判斷結果取相反值。

技術分享圖片

整數比較運算僅是對數字的操作,不能將數字與字符串、文件等內容一起操作,而且不能想當然的使用日常生活中的大於小於和等號。因為等號與賦值命令沖突,大於小於號與輸出和輸入重定向符號沖突。規範的整數比較運算符如下:

-eq:是否等於
-ne:是否不等於
-gt:是否大於
-lt:是否小於
-le:是否小於或等於
-ge:是否大於或等於

技術分享圖片

字符串比較語句用於判斷測試字符串是否為空,或兩個字符串是否相同。運算符如下:

=:比較字符串是否相同
!=:比較字符串是否不同
-z:判斷字符串內容是否為空

技術分享圖片

String變量為空,即未定義該變量。

3.流程控制語句

3.1 if條件測試語句

① if條件語句的單分支結構由if、then、fi 關鍵字組成,語法格式:

if 條件測試操作
then 命令序列
fi

技術分享圖片

此例即為通過單分支的if語句完成的文件創建。

② if的雙分支結構由if、then、else、fi 關鍵字組成,語法格式:

if 條件測試操作
then 命令序列1
else 命令序列2
fi

技術分享圖片

ping命令測試與對方主機網絡聯通性,-c 規定嘗試次數, -i 定義每個數據包的發送間隔, -W 定義等待超時時間。

③ if多分支結構由if、then、else、elif、fi 關鍵字組成,語法格式:

if 條件測試操作
then 命令序列1
elif 條件測試操作2
then 命令序列2
else 命令序列3
fi

技術分享圖片

read命令用於讀取用戶輸入信息,能把接收到的用戶輸入信息賦值給後面的指定變量, -p 表示向用戶顯示一定的提示信息。

3.2 for條件循環

for循環允許腳本一次讀取多個信息,然後逐一對信息進行操作處理,語法格式:

for 變量名 in 取值列表
do 命令序列
done

3.3 while條件循環語句

語法格式:

while 條件測試操作
do 命令序列
done

以下便是一個通過while循環來猜測數值大小的腳本 Guess.sh

技術分享圖片

$RANDOM變量表示調取一個隨機數(範圍0~32767),這裏把它對1000進行取余操作。此腳本可以讓用戶與程序互動,最終得出正確的隨機數,執行結果如下:

技術分享圖片

3.4 case條件測試語句

語法結構:

case 變量值 in
模式 1)
命令序列 1
;;
模式 1)
命令序列 2
;;
......
*)
默認命令序列
esac

在while循環的例子中有個缺陷,就是輸入只能為數字,如果輸入非數字腳本就會崩潰。這個時候就可以通過case結合通配符來解決這個問題。

技術分享圖片

4.計劃任務服務程序

計劃任務分為一次性計劃任務與長期性計劃任務,可以按照如下方式理解:

一次性計劃任務:今晚11點30分開啟網站服務。

長期性計劃任務:每周一的淩晨3點25分把/home/wwwroot目錄打包備份為backup.tar.gz

顧名思義,一次性計劃任務只執行一次,一般用於滿足臨時的工作需求。我們可以用at命令實現這種功能,只需要寫成“at 時間”的形式就可以。如果想要查看已設置好但還未執行的一次性計劃任務,可以使用“at -l”命令;要想將其刪除,可以用“atrm 任務序號”。在使用at命令來設置一次性計劃任務時,默認采用的是交互式方法。例如,使用下述命令將系統設置為在今晚23:30分自動重啟網站服務。

技術分享圖片

如果希望Linux系統能夠周期性地、有規律地執行某些具體的任務,那麽Linux系統中默認啟用的crond服務簡直再適合不過了。創建、編輯計劃任務的命令為“crontab -e”,查看當前計劃任務的命令為“crontab -l”,刪除某條計劃任務的命令為“crontab -r”。另外,如果您是以管理員的身份登錄的系統,還可以在crontab命令中加上-u參數來編輯他人的計劃任務。

使用crond服務設置任務的參數格式:“分、時、日、月、星期 命令”。

技術分享圖片

假設在每周一、三、五的淩晨3點25分,都需要使用tar命令把某個網站的數據目錄進行打包處理,使其作為一個備份文件。我們可以使用crontab -e命令來創建計劃任務。為自己創建計劃任務無需使用-u參數,具體的實現效果的參數如crontab -l命令結果所示:

技術分享圖片

需要說明的是,除了用逗號(,)來分別表示多個時間段,例如“8,9,12”表示8月、9月和12月。還可以用減號(-)來表示一段連續的時間周期(例如字段“日”的取值為“12-15”,則表示每月的12~15日)。以及用除號(/)表示執行任務的間隔時間(例如“*/2”表示每隔2分鐘執行一次任務)。

如果在crond服務中需要同時包含多條計劃任務的命令語句,應每行僅寫一條。例如我們再添加一條計劃任務,它的功能是每周一至周五的淩晨1點鐘自動清空/tmp目錄內的所有文件。尤其需要註意的是,在crond服務的計劃任務參數中,所有命令一定要用絕對路徑的方式來寫,如果不知道絕對路徑,請用whereis命令進行查詢,rm命令路徑為下面輸出信息中加粗部分。

技術分享圖片

計劃任務中的“分”字段必須有數值,絕對不能為空或是*號,而“日”和“星期”字段不能同時使用,否則就會發生沖突。

Vim編輯器與Shell命令腳本