章節簡述:
本章節將教給您如何使用Vim編輯器來編寫文檔、配置主機名稱、網卡參數以及yum倉庫 ,熟練使用各個模式和命令快捷鍵。
我們可以通過Vim編輯器將Linux命令放入合適的邏輯測試語句(if、for、while、case)后最終寫出簡單實用的Shell腳本。
還可以通過使用at命令或配置Crontab計划任務服務讓系統自動按時工作,讓日常工作更加的高效自動化,一勞永逸哦~
本章目錄結構 [收起]
4.1 了解Vim文本編輯器
在Linux系統中配置應用服務,實際上就是在修改它的配置文件(配置文件可能有多個,其中包含不同的參數),而且日常工作中也一定免不了編寫文檔的事情吧,這些都是要通過文本編輯器來完成的。
在熱門Linux操作系統中都會默認安裝一款超好用的文本編輯器——名字叫“vim”,vim是vi編輯器的升級版。
Vim能夠得到這么多廠商與用戶的認可,原因就是在Vim編輯器中有三種模式——命令模式、末行模式和編輯模式,分別又有多種不同的命令快捷鍵組合,很大的提高了工作效率,用習慣后會覺得非常的順手。要想在文本操作時更加高效率,我們必需先搞清Vim編輯器的三種模式的操作不同與切換方法。
命令模式:控制光標移動,可對文本進行刪除、復制、粘貼等工作。
輸入模式:正常的文本錄入。
末行模式:保存、退出與設置編輯環境。
記住每次運行vim編輯器后都默認是“命令模式”,需要先進入到“輸入模式”后再進行編寫文檔的工作,而每次編輯完成需先返回到“命令模式”后再進入“末行模式”對文本的保存或退出操作。
這里為大家總結出了最常用的快捷鍵命令,讀者盡量記一下,忘記了來查也可以,至於“輸入模式”則沒有特殊技巧。
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.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.2 了解Shell腳本
我曾經將Shell形容是人與計算機硬件的“翻譯官”,Shell作為用戶與Linux系統通訊的媒介,自身也定義了各種變量與參數,並提供了諸如循環、分支等高級語言才有的控制結構特性。如何正確的使用這些功能,准確下達命令就顯得尤為重要。
Shell的工作形式分為兩種
交互式(Interactive):用戶輸入一條命令,Shell解釋並執行一條。
批處理(Batch):用戶事先編寫一個Shell腳本(Script),其中包含諸多命令,Shell會一次執行完所有命令。
那么大家在前面學習Linux命令時,大致就是屬於交換式了,Shell腳本是將各種命令通過邏輯語句組合而成的程序。Shell腳本需要用到很多的Linux命令以及結合之前學習過的正則表達法、管道命令以及數據流重定向等語法規則來完成指定任務。
[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
只要腳本文件路徑沒有寫錯,sh或source命令都可以直接執行該腳本,但直接訪問腳本路徑的方式有點特殊。
使用直接訪問腳本路徑的方式提示出現錯誤,權限不足:
[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”,所以其實在可執行文件中已經內設了接收用戶參數的位置變量。
不光如此,還有這些已經被定義好的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,否則返回其他數值。
細分測試語句有:文件測試、邏輯測試、整數值比較、字符串比較。
文件測試:[ 操作符 文件或目錄名]
操作符 | 作用 |
-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.3 條件測試語句
條件測試語句能夠讓Shell腳本根據實際工作靈活調整工作內容,例如判斷系統的狀態后執行指定的工作,或創建指定數量的用戶,批量修改用戶密碼,這些都可以讓Shell腳本通過條件測試語句完成。
if條件語句
if條件語句分為單分支結構、雙分支結構、多分支結構,復雜度逐級上升,但卻可以讓Shell腳本更加的靈活。
首先來說單分支結構,僅用if、then、fi關鍵詞組成,只在條件成立后執行。
單分支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
雙分支結構是由if、then、else、fi關鍵詞組成,做條件成立或條件不成立的判斷。
雙分支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.
多分支結構相對就比較復雜了,是由if、then、else、elif、fi關鍵詞組成,根據多種條件成立的可能性執行不同的操作。
多分支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條件語句會先讀取多個不同的變量值,然后逐一執行同一組命令。
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條件語句用於重復測試某個條件,當條件成立時則繼續重復執行。
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條件語句可以依據變量的不同取值,分別執行不同的命令動作。
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 用戶名]
其中在創建、編輯計划任務時有個固定的格式,請讀者們一定要記住。
字段 | 說明 |
分鍾 | 取值為從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小時內被解決。
本章節的復習作業(答案就在問題的下一行哦,用鼠標選中即可看到的~)
1:Vim編輯器的三種模式分別是?
答案:命令模式、末行模式、編輯模式(也叫輸入模式)。
2:從輸入模式切換到末行模式的操作是?
答案:先敲擊[ECS]退回到命令模式后敲擊冒號":"。
3:一個完整的Shell腳本應該包括什么?
答案:一個完整的Shell腳本應該包括“腳本聲明”、“注釋信息”和“可執行語句”。
4:分別解釋Shell腳本中$0與$1變量的作用。
答案:$0代表Shell腳本的名稱,$1代表該程序接收的第一個參數。
5:如果需要依據用戶的輸入參數執行不同的操作,最方便的條件測試語句是?
答案:case條件語句最方便。