Vim編輯器與Shell命令腳本


章節簡述:

本章節將教給您如何使用Vim編輯器來編寫文檔、配置主機名稱、網卡參數以及yum倉庫 ,熟練使用各個模式和命令快捷鍵。

我們可以通過Vim編輯器將Linux命令放入合適的邏輯測試語句(ifforwhilecase)后最終寫出簡單實用的Shell腳本。

還可以通過使用at命令或配置Crontab計划任務服務讓系統自動按時工作,讓日常工作更加的高效自動化,一勞永逸哦~

 

4.1 了解Vim文本編輯器

在Linux系統中配置應用服務,實際上就是在修改它的配置文件(配置文件可能有多個,其中包含不同的參數),而且日常工作中也一定免不了編寫文檔的事情吧,這些都是要通過文本編輯器來完成的。

在熱門Linux操作系統中都會默認安裝一款超好用的文本編輯器——名字叫“vim”,vimvi編輯器的升級版。

Vim能夠得到這么多廠商與用戶的認可,原因就是在Vim編輯器中有三種模式——命令模式末行模式編輯模式,分別又有多種不同的命令快捷鍵組合,很大的提高了工作效率,用習慣后會覺得非常的順手。要想在文本操作時更加高效率,我們必需先搞清Vim編輯器的三種模式的操作不同與切換方法。

命令模式:控制光標移動,可對文本進行刪除、復制、粘貼等工作。

輸入模式:正常的文本錄入。

末行模式:保存、退出與設置編輯環境。

記住每次運行vim編輯器后都默認是“命令模式”,需要先進入到“輸入模式”后再進行編寫文檔的工作,而每次編輯完成需先返回到“命令模式”后再進入“末行模式”對文本的保存或退出操作。
第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。

這里為大家總結出了最常用的快捷鍵命令,讀者盡量記一下,忘記了來查也可以,至於“輸入模式”則沒有特殊技巧。

vim編輯器的命令模式中常用的快捷鍵

 

命令 作用
dd 刪除(剪切)光標所在整行。
5dd 刪除(剪切)從光標處開始的5行。
yy 復制光標所在整行。
5yy 復制從光標處開始的5行。
p 將之前刪除(dd)或復制(yy)過的數據粘貼到光標后。
/字符串 在文本中從上至下搜索該字符串。
?字符串 在文本中從下至上搜索該字符串。
n 顯示搜索命令定位到的下一個字符串。
N 顯示搜索命令定位到的上一個字符串。
u 撤銷上一步的操作

 

vim編輯器的末行模式中的常用命令

 

命令 作用
:w 保存
:q 退出
:q! 強制退出(放棄對文本的修改內容)
:wq! 強制保存退出
:set nu 顯示行號
:set nonu 不顯示行號
:命令 執行該命令
:整數 跳轉到該行

 

需要讀者注意的兩點:

1.在命令模式與末行模式中,所有的快捷鍵參數均區分大小寫。

2.在末行模式中所有快捷鍵參數前都有一個冒號":"。

4.1.1 編寫簡單文檔

現在動手編寫一個文檔吧、我會把每個步驟和按鍵盡量都標注出來,如果命令忘記了就回到上面小節再看看吧~超簡單!

請您按照下面的幻燈片逐步操作,可點擊圖片兩側箭頭或下方小圓點“○”切換步驟。

 

  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第1步:創建文檔。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第2步:敲擊字母“a”,進入輸入模式。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第3步:輸入一行字符。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第4步:敲擊[ESC]返回到命令模式。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第5步:敲擊“:wq”,保存並退出。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第6步:查看文檔的內容。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第7步:編輯文件。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第8步:敲擊字母“o”,進入到輸入模式。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第9步:輸入一行字符。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第10步:返回命令模式后嘗試“:q”退出不保存。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第11步:提示內容已被修改,不能退出。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第12步:敲擊“:q!”后強制退出不保存。
  • 第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
    第13步:查看文檔,發現第二句確實沒保存。
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13

 

 

 

4.1.2 配置主機名稱

紅帽RHEL7系統的主機名稱保存在/etc/hostname文件中,我們要想將其修改為"linuxprobe.com",思路大致如下:

第1步:使用vim命令修改"/etc/hostname"主機名稱文件。

第2步:將原始主機名稱刪除后追加"linuxprobe.com"。

第3步:保存退出並用hostname命令檢查是否修改成功。

使用vim命令編輯主機名稱文件后末行模式執行:wq!后即可保存退出:

[root@linuxprobe ~]# vim /etc/hostname
linuxprobe.com

使用hostname命令查看當前的主機名稱:

[root@linuxprobe ~]# hostname
linuxprobe.com
4.1.3 配置網卡信息

既然已經會用vim編輯器了,快來試試配置你的Linux系統網卡吧,不把網卡先配置妥當就不能與其他機器通信的。

在紅帽RHEL6系統中網卡配置文件的前綴為"eth",第1塊即為"eth0",第2塊即為"eth1"並依此類推……

而在紅帽RHEL7系統中網卡配置文件的前綴則為"ifcfg-eno",例如"ifcfg-eno16777736"。

網卡的配置文件存放在"/etc/sysconfig/network-scripts"目錄中。

在修改配置文件前,先來學些關鍵詞術語吧:

網卡類型:TYPE=Ethernet
地址分配模式:BOOTPROTO=static
網卡名稱:NAME=eno16777736
是否啟動:ONBOOT=yes
IP地址:IPADDR=192.168.10.10
子網掩碼:NETMASK=255.255.255.0
網關地址:GATEWAY=192.168.10.1
DNS地址:DNS1=192.168.10.1

上面的網卡配置文件代表着“這是一個以太網卡設備,名稱為"eno16777736"且開機自動啟動,IP地址等信息需由人工指定”。

配置網卡信息前先來理清思路:

第1步:首先我們要切換到"/etc/sysconfig/network-scripts"目錄中(該目錄存放着網卡的配置文件)。

第2步:使用vim命令修改文件"ifcfg-eno16777736"。

第3步:逐項寫入配置參數,並保存退出。

第4步:重新啟動網卡命令:"systemctl restart network"。

第5步:通過ping命令測試網卡信息是否生效。

切換到網卡配置文件所在的目錄:

[root@linuxprobe ~]# cd /etc/sysconfig/network-scripts/

編輯網卡配置文件並填入下面的信息:

[root@linuxprobe network-scripts]# vim ifcfg-eno16777736
TYPE=Ethernet
BOOTPROTO=static
NAME=eno16777736
ONBOOT=yes
IPADDR=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=192.168.10.1

重新啟動網卡,正常情況不會提示信息:

[root@linuxprobe network-scripts]# systemctl restart network

不錯哦,成功的ping通證明網卡配置正確並生效了:

[root@linuxprobe network-scripts]# ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.083 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.059 ms
64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.097 ms
^C
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.059/0.080/0.097/0.013 ms
4.1.4 配置Yum倉庫

既然對vim編輯器的理論已經學扎實,現在就來動手配置下Yum倉庫吧~先來理清思路:

第1步:首先我們要切換到"/etc/yum.repos.d/"目錄中(因為該目錄存放着yum倉庫的配置文件)

第2步:使用vim編輯器創建並打開一個名為rhel7.repo的新文件,名稱可以自定義,但后綴必需為repo

第3步:逐項寫入配置參數,並保存退出。

第4步:按配置參數的路徑將光盤掛載。

第5步:將光盤掛載信息寫入到/etc/fstab文件中。

第6步:使用"yum install httpd -y"命令檢查是否配置正確。

切換到/etc/yum.repos.d目錄中:

[root@linuxprobe ~]# cd /etc/yum.repos.d/

打開Vim界面后敲擊"a"進入到插入模式:
編輯完成后敲擊[ESC]並在末行模式中:wq!保存並退出。

[root@linuxprobe yum.repos.d]# vim rhel7.repo
[rhel7]
name=rhel7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0

創建掛載光盤的目錄:

[root@linuxprobe yum.repos.d]# mkdir -p /media/cdrom

倉庫提供方式為本地,所以需要將光盤掛載到/media/cdrom中:

[root@linuxprobe yum.repos.d]# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 is write-protected, mounting read-only

設置成開機自動掛載:

[root@linuxprobe yum.repos.d]# vim /etc/fstab
/dev/cdrom /media/cdrom iso9660 defaults 0 0

測試安裝"httpd"服務,出現“Complete”則代表Yum倉庫配置正確:

[root@linuxprobe yum.repos.d]# yum install httpd
Loaded plugins: langpacks, product-id, subscription-manager
rhel7 | 4.1 kB 00:00
(1/2): rhel7/group_gz | 134 kB 00:00
(2/2): rhel7/primary_db | 3.4 MB 00:00
Resolving Dependencies
……………………………………………………
Complete!

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

您可以將報錯的屏幕截圖與自己的操作過程帖到“會員互助問答區”,一般問題都會在24小時內被解決。

第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。

4.2 了解Shell腳本

我曾經將Shell形容是人與計算機硬件的“翻譯官”,Shell作為用戶與Linux系統通訊的媒介,自身也定義了各種變量與參數,並提供了諸如循環、分支等高級語言才有的控制結構特性。如何正確的使用這些功能,准確下達命令就顯得尤為重要。

Shell的工作形式分為兩種

交互式(Interactive):用戶輸入一條命令,Shell解釋並執行一條。

批處理(Batch):用戶事先編寫一個Shell腳本(Script),其中包含諸多命令,Shell會一次執行完所有命令。

那么大家在前面學習Linux命令時,大致就是屬於交換式了,Shell腳本是將各種命令通過邏輯語句組合而成的程序。Shell腳本需要用到很多的Linux命令以及結合之前學習過的正則表達法、管道命令以及數據流重定向等語法規則來完成指定任務。

查看系統中所有可用的Shell解釋器:
[root@linuxprobe ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

查看當前的Shell解釋器:

[root@linuxprobe ~]# echo $SHELL
/bin/bash

 

 

4.2.1 編譯簡單的腳本

Shell腳本的編寫要使用到Vim文本編輯器,按照命令的執行順序依次編寫,每行寫一條Linux命令。並且一個完整的Shell腳本則應該包括“腳本聲明”、“注釋信息”和“可執行語句”。

腳本聲明(#!):告知系統用何種shell來解釋。

注釋信息(#):對可執行語句或程序功能做介紹,可以不寫。

可執行語句:執行的具體命令。

先來編寫一個簡單的Shell腳本吧,功能是顯示當前的工作路徑並列出當前目錄下的所有文件與屬性。

[root@linuxprobe ~]# vim Example.sh
#!/bin/bash
#For Example BY linuxprobe.com
pwd
ls -al

原來編寫Shell腳本如此的簡單~執行腳本有三種方法:

腳本文件路徑:./Example.sh

sh腳本文件路徑:sh Example.sh

source腳本文件路徑:source Example.sh

只要腳本文件路徑沒有寫錯,shsource命令都可以直接執行該腳本,但直接訪問腳本路徑的方式有點特殊。

使用直接訪問腳本路徑的方式提示出現錯誤,權限不足:

[root@linuxprobe ~]# ./Example.sh
bash: ./Example.sh: Permission denied

需要為腳本設置可執行權限后才能順利運行:

[root@linuxprobe ~]# chmod u+x Example.sh

再來運行就沒有問題了:

[root@linuxprobe ~]# ./Example.sh
/root/Desktop
total 8
drwxr-xr-x. 2 root root 23 Jul 23 17:31 .
dr-xr-x---. 14 root root 4096 Jul 23 17:31 ..
-rwxr--r--. 1 root root 55 Jul 23 17:31 Example.sh
4.2.2 接收用戶的參數

Shell腳本為了能夠讓用戶更靈活的完成工作需求,應該有辦法接收用戶輸入的參數,像上面的腳本的寫法真的很不靈活。

您在執行命令時的參數是不是像這樣使用:“命令名 參數1 參數2 參數3”,所以其實在可執行文件中已經內設了接收用戶參數的位置變量。
第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
不光如此,還有這些已經被定義好的Shell預定義變量:

$0 當前執行Shell腳本的程序名。
$1-9,${10},${11}…… 參數的位置變量。
$# 一共有多少個參數。
$* 所有位置變量的值。
$? 判斷上一條命令是否執行成功,0為成功,非0為失敗。


好的~來動手完成一個可以接收用戶參數的Shell腳本吧:

[root@linuxprobe ~]# vim Example.sh
#!/bin/bash
echo "當前腳本名稱為$0"
echo "總共有$#個參數,分別是$*。"
echo "第1個參數為$1,第5個為$5。"

使用sh命令來執行腳本,並附帶6個參數:

[root@linuxprobe ~]# sh Example.sh one two three four five six
當前腳本名稱為Example.sh
總共有6個參數,分別是one two three four five six。
第1個參數為one,第5個為five。
4.2.3 判斷用戶的參數

Shell腳本有時還要判斷用戶輸入的參數,例如像mkdir命令一樣,當目錄不存在則創建,若已經存在則報錯,條件測試語句能夠測試特定的表達式是否成立,當條件成立時返回值為0,否則返回其他數值。
第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。

細分測試語句有:文件測試邏輯測試整數值比較字符串比較

文件測試:[ 操作符 文件或目錄名]

操作符 作用
-d 測試是否為目錄。
-e 測試文件或目錄是否存在。
-f 判斷是否為文件。
-r 測試當前用戶是否有權限讀取。
-w 測試當前用戶是否有權限寫入。
-x 測試當前用戶是否有權限執行。


測試/etc/fstab是否為目錄:

[root@linuxprobe ~]# [ -d /etc/fstab ]

顯示上一條命令的返回值,非0則為失敗,即不是目錄:

[root@linuxprobe ~]# echo $?
1

測試/etc/fstab是否為文件:

[root@linuxprobe ~]# [ -f /etc/fstab ]

顯示上一條命令的返回值為0,即fstab是文件:

[root@linuxprobe ~]# echo $?
0

符號&&代表邏輯上的"",當前面的命令執行成功才會執行后面的命令,判斷/dev/cdrom設備是否存在,若存在則輸出Exist:

[root@linuxprobe ~]# [ -e /dev/cdrom ] && echo "Exist"
Exist

邏輯測試:[ 表達式1 ] 操作符 [ 表達式2 ]

操作符 作用
&& 邏輯的與,"而且"的意思。
|| 邏輯的或,"或者"的意思。
! 邏輯的否。
   

 

USER變量是當前登陸的用戶名:

[root@linuxprobe ~]# echo $USER
root

若當前登陸的用戶不是root,則輸出user,執行后結果為空:

[root@linuxprobe ~]# [ $USER != root ] && echo "user"

登入用戶linuxprobe,再來測試便輸出了user字樣:

[root@linuxprobe ~]# su linuxprobe -
[linuxprobe@linuxprobe root]$ [ $USER != root ] && echo "user"
user

換回root用戶后用加強版的判斷語句,非root用戶則輸出user,若是root則直接輸出root:

[root@linuxprobe ~]# [ $USER != root ] && echo "user" || echo "root"
root

這里請讀者思考下&&與||的邏輯含義,因為前面的&&不成立,所有后面的||才會執行。

整數值比較:[ 整數1 操作符 整數2 ]

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


比較10是否大於10:

[root@linuxprobe ~]# [ 10 -gt 10 ]

顯示上一條命令執行失敗,10不大於10:

[root@linuxprobe ~]# echo $?
1

比較10是否等於10:

[root@linuxprobe ~]# [ 10 -eq 10 ]

顯示上一條命令執行成功,10等於10:

[root@linuxprobe ~]# echo $?
0

獲取當前可用的內存量,並將此值賦值給變量FreeMem,逐個解釋下吧~
首先用free -m查看以m為單位的內存使用情況,然后grep cache:過濾出剩余內存的行,最后用awk '{print $3}'過濾只保留第三列,而FreeMem=`語句`則表示執行里面的語句后賦值給變量。

[root@linuxprobe ~]# FreeMem=`free -m | grep cache: | awk '{print $3}'`

驗證變量是否已經獲得可用內存量:

[root@linuxprobe ~]# echo $FreeMem
609

判斷此值是否小與1024(單位是M),若小於則提示內存不足:

[root@linuxprobe ~]# [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
Insufficient Memory

字符串比較:[字符串1 操作符 字符串2]

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


判斷String變量是否為空值:

[root@linuxprobe ~]# [ -z $String ]

上一條命令執行成功,說明變量String確實為空值:

[root@linuxprobe ~]# echo $?
0

輸出當前的系統語言:

[root@linuxprobe ~]# echo $LANG
en_US.UTF-8

判斷當前的系統語言是否為英文,否則輸出“不是英語”:

[root@linuxprobe ~]# [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

您可以將報錯的屏幕截圖與自己的操作過程帖到“會員互助問答區”,一般問題都會在24小時內被解決。

第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。

4.3 條件測試語句

條件測試語句能夠讓Shell腳本根據實際工作靈活調整工作內容,例如判斷系統的狀態后執行指定的工作,或創建指定數量的用戶,批量修改用戶密碼,這些都可以讓Shell腳本通過條件測試語句完成。

if條件語句

if條件語句分為單分支結構、雙分支結構、多分支結構,復雜度逐級上升,但卻可以讓Shell腳本更加的靈活。

首先來說單分支結構,僅用ifthenfi關鍵詞組成,只在條件成立后執行。
第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。

單分支if語句:判斷目錄是否存在,若不存在則自動創建。

編寫Shell腳本並寫入下面的語句:

[root@linuxprobe ~]# vim Example.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi

執行后默認沒有回顯,讀者可動手添加echo語句顯示創建過程:

[root@linuxprobe ~]# sh Example.sh

查看該目錄是否被創建:

[root@linuxprobe ~]# ls -d /media/cdrom
/media/cdrom

雙分支結構是由ifthenelsefi關鍵詞組成,做條件成立或條件不成立的判斷。

第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。

雙分支if語句:判斷指定主機能否ping通,根據返回結果分別給予提示或警告。
為了減少用戶的等待時間,需要為ping命令追加-c參數代表發送數據包的個數,-i代表每0.2秒發一個數據包,-W則為3秒即超時。而$1為用戶輸入的第一個參數(IP地址),$?為上一條命令的執行結果,判斷是否等於0(即成功)。

[root@linuxprobe ~]# vim Example.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is up."
else
echo "Host $1 is down."
fi

給予腳本可執行權限,否則請用sh或source命令執行:

[root@linuxprobe ~]# chmod u+x Example.sh

參數為要檢測的主機IP地址,根據返回值判斷為up:

[root@linuxprobe ~]# ./Example.sh 192.168.10.10
Host 192.168.10.10 is up.

根據ping命令的執行結果判斷主機出現網絡故障。

[root@linuxprobe ~]# ./Example.sh 192.168.10.20
Host 192.168.10.20 is down.

多分支結構相對就比較復雜了,是由ifthenelseeliffi關鍵詞組成,根據多種條件成立的可能性執行不同的操作。
第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。

多分支if語句:判斷用戶輸入的分數在那個區間內,然后判定為優秀、合格或不合格。

read命令用於將用戶的輸入參數賦值給指定變量,格式為:"read -p [提示語句] 變量名"。
使用read命令讓用戶為GRADE變量賦值,判斷分數必需同時滿足大於85且小於100才輸出Excellent,判斷分數必需同時滿足大於70且小於84才輸出Pass,其余所有的情況均會輸出Fail。

[root@linuxprobe ~]# vim Example.sh
#!/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

給予腳本可執行權限,否則請用sh或source命令執行:

[root@linuxprobe ~]# chmod u+x Example.sh

輸入88分,滿足第一判斷語句,所以輸出Excellent:

[root@linuxprobe ~]# ./Example.sh
Enter your score(0-100):88
88 is Excellent

輸入80分,滿足第二判斷語句,所以輸出Pass:

[root@linuxprobe ~]# ./Example.sh Enter your score(0-100):80
80 is Pass

輸入30與200分都屬於其他情況,所以輸出Fail:

[root@linuxprobe ~]# ./Example.sh  Enter your score(0-100):30
30 is Fail
[root@linuxprobe ~]# ./Example.sh Enter your score(0-100):200
200 is Fail

請您動手在上面Shell腳本中添加判斷語句,將所有小於0分或大於100分的輸入都予以警告。

for條件語句

for條件語句會先讀取多個不同的變量值,然后逐一執行同一組命令。
第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
for條件語句:從列表文件中讀取用戶名,逐個創建用戶並將密碼設置。

創建用戶名稱列表文件:

[root@linuxprobe ~]# vim users.txt
andy
barry
carl
duke
eric
george

Shell腳本提示用戶輸入要設置的密碼並賦值給PASSWD變量,從users.txt文件中讀入用戶名並賦值給UNAME變量,而查看用戶的信息都重定向到/dev/null文件,不顯示到屏幕。

[root@linuxprobe ~]# vim Example.sh
#!/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 "Create success"
else
echo "Create failure"
fi
fi
done

執行批量創建用戶的Shell腳本程序,輸入為用戶設定的密碼口令,檢查腳本是否為我們完成創建用戶的動作:

[root@linuxprobe ~]# source Example.sh
Enter The Users Password : linuxprobe
Create success
Create success
Create success
Create success
Create success
Create success
[root@linuxprobe ~]# tail -6 /etc/passwd
andy:x:1001:1001::/home/andy:/bin/bash
barry:x:1002:1002::/home/barry:/bin/bash
carl:x:1003:1003::/home/carl:/bin/bash
duke:x:1004:1004::/home/duke:/bin/bash
eric:x:1005:1005::/home/eric:/bin/bash
george:x:1006:1006::/home/george:/bin/bash

這個Shell腳本還存在一個小小的遺憾,它只會輸出帳號創建成功或失敗,但沒有指明是那個帳號,這個功能請讀者動手添加下,記得是要用$UNAME變量哦。

for條件語句:從列表文件中讀取主機地址,逐個測試是否在線。

首先創建主機地址列表:

[root@localhost ~]# vim ipadds.txt
192.168.10.10
192.168.10.11
192.168.10.12

這個腳本可以參考前面雙分支if語句———從ipadds.txt中讀取主機地址后賦值給HLIST變量后逐個ping列表中的主機IP地址測試主機是否在線:

[root@localhost ~]# vim Example.sh
#!/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is up."
else
echo "Host $IP is down."
fi
done
[root@linuxprobe ~]# ./Example.sh
Host 192.168.10.10 is up.
Host 192.168.10.11 is down.
Host 192.168.10.12 is down.
while條件語句

while條件語句用於重復測試某個條件,當條件成立時則繼續重復執行。
第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。

while條件語句:隨機生成一個0-999的整數,判斷並提示用戶輸入的值過高或過低,只有當用戶猜中才結束程序。
腳本中的$RANDOM是一個隨機變量,用於在%1000后會得到一個介於0-999的整數后賦值給PRICE變量,while后面的true代表該循環會永久循環執行:

#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品實際價格為0-999之間,猜猜看是多少?"
while true
do
read -p "請輸入你猜測的價格數目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜你答對了,實際價格是 $PRICE"
echo "你總共猜測了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done

動手試試運行Shell腳本吧,每次RANDOM變量的值都是隨機的:

[root@linuxprobe ~]# chmod u+x Example.sh
[root@linuxprobe ~]# ./Example.sh
商品實際價格為0-999之間,猜猜看是多少?
請輸入你猜測的價格數目:500
太低了!
請輸入你猜測的價格數目:800
太高了!
請輸入你猜測的價格數目:650
太低了!
請輸入你猜測的價格數目:720
太高了!
請輸入你猜測的價格數目:690
太低了!
請輸入你猜測的價格數目:700
太高了!
請輸入你猜測的價格數目:695
太高了!
請輸入你猜測的價格數目:692
太高了!
請輸入你猜測的價格數目:691
恭喜你答對了,實際價格是 691
你總共猜測了 9 次
case條件語句

case條件語句可以依據變量的不同取值,分別執行不同的命令動作。
第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。
case條件語句:提示用戶輸入一個字符,判斷該字符是字母、數字或特殊字母。
提示用戶輸入一個字符並將其賦值給變量KEY,判斷變量KEY為何種字符后分別輸出是字母、數字還是其他字符:

[root@linuxprobe ~]# vim Example.sh
#!/bin/bash
read -p "請輸入一個字符,並按Enter鍵確認:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您輸入的是 字母。"
;;
[0-9])
echo "您輸入的是 數字。"
;;
*)
echo "您輸入的是 空格、功能鍵或其他控制字符。"
esac
[root@linuxprobe ~]# chmod u+x Example.sh
[root@linuxprobe ~]# ./Example.sh
請輸入一個字符,並按Enter鍵確認:6
您輸入的是 數字。
[root@linuxprobe ~]# ./Example.sh
請輸入一個字符,並按Enter鍵確認:p
您輸入的是 字母。
[root@linuxprobe ~]# ./Example.sh
請輸入一個字符,並按Enter鍵確認:^[[15~
您輸入的是 空格、功能鍵或其他控制字符。
4.4 計划任務服務

有經驗的系統運維工程師能夠讓系統自動化運行,無需人工的干預就可以讓各個服務、命令在指定的時間段運行、停止。

實際上這些操作都是由系統的計划任務功能完成的,而計划任務又分為“一次性”與“長期性”之分,可以理解為:

一次性計划任務:今晚11點30分開啟網站服務(例如新網站的公測)

長期性計划任務:每周1、3、5的凌晨3點25分將/home/wwwroot目錄打包備份為backup.tar.gz

先來講一次性任務吧,它是由atd服務/進程來實現的,計划的管理操作是"at"命令,具體的可用參數如下:

參數 作用
at <時間> 安排一次性任務
atq或at -l 查看任務列表
at -c 序號 預覽任務與設置環境
atrm 序號 刪除任務


一般用at命令創建計划任務有交互式與非交互式兩種方法,先來看看交換式的方法,(輸完成后敲擊Ctrl+d來保存退出):

[root@linuxprobe ~]# at 23:30
at > systemctl start httpd
at >
job 3 at Mon Apr 27 23:30:00 2015
[root@linuxprobe ~]# atq
3 Mon Apr 27 23:30:00 2015 a root

直接用echo語句將要執行的命令傳送給at命令:

[root@linuxprobe ~]# echo "systemctl start httpd" | at 23:30
job 4 at Mon Apr 27 23:30:00 2015
[root@linuxprobe ~]# atq
3 Mon Apr 27 23:30:00 2015 a root
4 Mon Apr 27 23:30:00 2015 a root

刪除的時候只需要用atrm命令與任務編號就可以啦~

[root@linuxprobe ~]# atrm 3
[root@linuxprobe ~]# atrm 4
[root@linuxprobe ~]# atq

對於創建長期可循環的計划任務,則要用到cron服務啦,具體使用方法如下:

創建、編輯計划任務:crontab -e [-u 用戶名]

查看計划任務:crontab -l [-u 用戶名]
刪除計划任務:crontab -r [-u 用戶名]

其中在創建、編輯計划任務時有個固定的格式,請讀者們一定要記住。
第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。

字段 說明
分鍾 取值為從0到59之間的整數
小時 取值為從0到23之間的任意整數
日期 取值為1到31之間的任意整數
月份 取值為1到12之間的任意整數
星期 取值為0到7之間的任意整數,其中0與7均為星期日
命令 要執行的命令或程序腳本

 

需要用cron計划任務實現的功能:"每周1、3、5的凌晨3點25分將/home/wwwroot目錄打包備份為backup.tar.gz"

編輯root用戶自己的計划任務:

[root@linuxprobe ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab

使用"crontab -l"命令查看計划任務的內容:

[root@linuxprobe ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

如果想對某個用戶設置多個計划任務,則可直接用"crontab -e"命令將命令逐條添加即可,讓計划任務自動在每周1-5的凌晨1點打包網站目錄后自動清除/tmp目錄下的所有文件::

[root@linuxprobe ~]# crontab -e
crontab: installing new crontab
[root@linuxprobe ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

您可以將報錯的屏幕截圖與自己的操作過程帖到“會員互助問答區”,一般問題都會在24小時內被解決。

第4章 Vim編輯器與Shell命令腳本。第4章 Vim編輯器與Shell命令腳本。

本章節的復習作業(答案就在問題的下一行哦,用鼠標選中即可看到的~)

1:Vim編輯器的三種模式分別是?

答案:命令模式、末行模式、編輯模式(也叫輸入模式)。

2:從輸入模式切換到末行模式的操作是?

答案:先敲擊[ECS]退回到命令模式后敲擊冒號":"。

3:一個完整的Shell腳本應該包括什么?

答案:一個完整的Shell腳本應該包括“腳本聲明”、“注釋信息”和“可執行語句”。

4:分別解釋Shell腳本中$0與$1變量的作用。

答案:$0代表Shell腳本的名稱,$1代表該程序接收的第一個參數。

5:如果需要依據用戶的輸入參數執行不同的操作,最方便的條件測試語句是?

答案:case條件語句最方便。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM