目錄 linux
Vim文本編輯器nginx
Shell腳本正則表達式
Shell編程變量shell
流程控制語句編程
計劃任務服務程序vim
參考資料windows
XUQ 2019.3.27 初稿數組
Vim文本編輯器 bash
1.爲何要使用文本編輯器?網絡
「在Linux系統中一切都是文件,而配置一個服務就是在修改其配置文件的參數」。並且在平常工做中你們也確定免不了要編寫文檔,這些工做都是經過文本編輯器來完成的。
Linux中有不少配置文件,相似於windows中的註冊表;默認由vi編輯器(文本編輯工具)進行管理和維護;vim爲加強版(着色)。
2.三種工做模式:
命令模式:控制光標移動,可對文本進行復制、粘貼、刪除和查找等工做。
輸入模式:正常的文本錄入。
末行模式:保存或退出文檔,以及設置編輯環境。
不一樣模式之間的切換
圖5-1 Vim編輯器模式切換方法
在每次運行Vim編輯器時,默認進入命令模式,此時須要先切換到輸入模式後再進行文檔編寫工做,而每次在編寫完文檔後須要先返回命令模式,而後再進入末行模式,執行文檔的保存或退出操做。在Vim中,沒法直接從輸入模式切換到末行模式。
3.基本命令操做
命令 |
做用 |
dd |
刪除(剪切)光標所在整行 |
5dd |
刪除(剪切)從光標處開始的5行 |
yy |
複製光標所在整行 |
5yy |
複製從光標處開始的5行 |
n |
顯示搜索命令定位到的下一個字符串 |
N |
顯示搜索命令定位到的上一個字符串 |
u |
撤銷上一步的操做 |
p |
將以前刪除(dd)或複製(yy)過的數據粘貼到光標後面 |
表5-1 命令行經常使用命令
命令 |
做用 |
: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 |
?字符串 |
在文本中從下至上搜索該字符串 |
/字符串 |
在文本中從上至下搜索該字符串 |
表5-2 末行經常使用命令
4.vim編輯器命令操做(略,這裏建議上網查看相關視頻)
Shell腳本
1.什麼是shell腳本?
Linux系統中的shell腳本是一個特殊的應用程序,它介於操做系統內核與用戶之間,充當了一個「命令解釋器的角色」,負責接收用戶輸入的操做指令(命令)並進行解釋,將須要執行的操做傳遞給內核執行,並輸出執行結果。
最經常使用的shell是bash,也就是bourne again shell ;bash因爲免費和易用,是大多數linux操做系統的默認shell環境。
圖5-2 shell與系統關係
2.Shell腳本命令的工做方式
交互式(Interactive):用戶每輸入一條命令就當即執行。
批處理(Batch):由用戶事先編寫好一個完整的Shell腳本,Shell會一次性執行腳本中諸多的命令。
在Shell腳本中除了須要用到不少Linux命令以及正則表達式、管道符、數據流重定向等語法規則,還須要把內部功能模塊化後經過邏輯語句進行處理,最終造成平常所見的Shell腳本。
3.編寫簡單的腳本
要熟練掌握shell編程語言,須要大量練習。Shell腳本編程須要注意如下幾點:
1.shell腳本名稱命名通常爲英文的大寫,小寫;不能用特殊符號,空格來命名;通常以腳本功能命名。
2.shell腳本後綴以.sh結尾
3.shell腳本內容首行需以#!/bin/bash開頭
4.shell腳本中變量名稱儘可能使用大寫字母,字母間不能使用「-「,可使用」_「; 不能以數字,特殊符號開頭
結構:聲明-註釋-代碼
功能:接收參數;處理參數
示例:使用vim編寫一個shell腳本
[root@redhat7 桌面]# echo $SHELL <==查看SHELL變量,發現當前系統默認使用Bash做爲命令解釋器
/bin/bash
[root@redhat7 桌面]# vim fist_shell.sh <==使用vim編寫腳本
[root@redhat7 桌面]# cat fist_shell.sh
#!/bin/bash <==腳本聲明,定義該腳本所使用的shell類型
#This is my Fisrt shell <==#表示註釋,沒實際意義,shell不會去解析它
#By author Nick.net 2019 <==腳本建立人
echo "Hello World!!!" <==shell腳本主命令執行該腳本呈現的內容
[root@redhat7 桌面]# bash fist_shell.sh <==bash直接執行腳本
Hello World!!!
[root@redhat7 桌面]# ./fist_shell.sh <==輸入路徑執行腳本
bash: ./fist_shell.sh: 權限不夠
[root@redhat7 桌面]# chmod o+x fist_shell.sh <==賦予腳本可執行權限
[root@redhat7 桌面]# ./fist_shell.sh
Hello World!!!
[root@redhat7 桌面]# /bin/sh fist_shell.sh <==經過/bin/sh直接執行,不須要執行權限
Hello World!!!
4.shell,shell編程,shell腳本,shell命令間的區別?
Shell 是一個總體概念,shell編程與shell腳本統稱爲shell編程,shell命令是shell編程底層具體的語句和實現方法。
Shell編程變量
1.概述
Shell屬於非類型的解釋語言,不須要事先聲明變量;Shell給一個變量賦值,就是定義了變量。在linux中,可使用「=「爲變量賦值;shell爲弱類型語言,定義變量不須要聲明類型,若是須要聲明,可以使用declare指定類型。
2.shell變量分類
系統變量:對參數判斷和命令返回值判斷時使用
環境變量:程序運行時須要設置
用戶變量(局部變量):shell腳本內部或者臨時局部
Shell變量在定義時,首個字符必須爲字母(a~z,A~Z),不能以數字開頭,中間不能有空格,可使用」_「,不能使用「-「,也不能使用數字和符號。
示例:
[root@redhat7 桌面]# vim var.sh
[root@redhat7 桌面]# cat var.sh
#!/bin/bash
#By author Nick.net 2019
A=123 <==定義一個變量(A變量名,123變量值)
echo "Printf variables is $A." <==引用變量($+變量名)
[root@redhat7 桌面]# /bin/sh var.sh
Printf variables is 123.
2.1.常見系統變量
$0 當前的腳本名稱
$n 當前腳本的第n個參數,n=1,2,…9
$* 當前腳本的全部參數(不包括程序自己)
$# 當前腳本的參數個數(不包括程序自己)
$? 命令或程序執行完後的狀態,返回0表示執行成功,反之則顯示一個非零的數字
$$ 程序自己的PID號
2.2.用戶變量
A=123 自定義變量A
IP1=192.168.3.15 自定義變量IP1
N_SOFT=nginx-1.12.0.tar.gz 自定義變量N_SOFT
…
2.3.常見環境變量(略,請查看必備命令-環境變量)
3.接收用戶參數
爲了讓Shell腳本程序更好地知足用戶的一些實時需求,靈活完成工做,必需要讓腳本程序可以像以前執行命令時那樣,接收用戶輸入的參數。Linux系統中接收參數的變量,變量之間可使用空格間隔。
圖5-3 Shell腳本程序中的參數位置變量
示例:
[root@linuxprobe ~]# vim example.sh
#!/bin/bash
echo "當前腳本名稱爲$0"
echo "總共有$#個參數,分別是$*。"
echo "第1個參數爲$1,第5個爲$5。"
[root@linuxprobe ~]#bash example.sh one two three four five six
當前腳本名稱爲example.sh
總共有6個參數,分別是one two three four five six。
第1個參數爲one,第5個爲five。
3.判斷用戶的參數
Shell腳本中的條件測試語法能夠判斷表達式是否成立,若條件成立則返回數字0,不然便返回其餘隨機數值。
圖5-4 條件測試語句的執行格式
按照測試對象來劃分,條件測試語句能夠分爲4種:文件測試語句;邏輯測試語句;整數值比較語句;字符串比較語句。
3.1.文件測試即便用指定條件來判斷文件是否存在或權限是否知足等狀況的運算符
運算符 |
做用 |
-d |
測試文件是否爲目錄類型 |
-e |
測試文件是否存在 |
-f |
判斷是否爲通常文件 |
-r |
測試當前用戶是否有權限讀取 |
-w |
測試當前用戶是否有權限寫入 |
-x |
測試當前用戶是否有權限執行 |
圖5-2 文件測試所用的參數
示例:
[root@redhat7 桌面]# [ -d /etc/fstab ] <==判斷/etc/fstab是否爲一個目錄類型的文件
[root@redhat7 桌面]# echo $? <==經過Shell解釋器的內設$?變量顯示上一條命令執行後的返回值(結果)。
1 <==若是返回值爲0,則目錄存在;若是返回值爲非零的值,則意味着目錄不存在。
[root@redhat7 桌面]# [ -f /etc/fstab ] <==判斷/etc/fstab是否爲一個通常文件
[root@redhat7 桌面]# echo $?
0 <==若是返回值爲0,則文件存在,且爲通常文件
3.2.邏輯語句用於對測試結果進行邏輯分析,根據測試結果可實現不一樣的效果
&&(邏輯「與」):若前面的命令執行成功,則執行它後面的語句
||(邏輯「或」):若前面的命令執行失敗,則執行它後面的語句
!(邏輯「非」):取反
示例:
[root@redhat7 桌面]# [ -f /etc/fstab ] && echo "OK" <==若是有這個文件就輸出OK
OK
[root@redhat7 桌面]# [ -f /etc/fstab ] && echo "OK" || echo "ERROR"
OK
[root@redhat7 桌面]# [ -f /etc/f23 ] && echo "OK" || echo "ERROR" <==測試一個不存在的文件,輸出ERROR
ERROR
[root@redhat7 桌面]# [ $USER = root ] <==設置$USER變量,判斷當前用戶是否爲管理員
[root@redhat7 桌面]# echo $?
0
[root@redhat7 桌面]# [ $USER = root ] && echo "admin" || echo "user" <== …如果管理員,輸出admin,不是輸出user
admin
[root@redhat7 桌面]# su admin
[admin@redhat7 桌面]$ [ $USER = root ] && echo "admin" || echo "user"
user
[admin@redhat7 桌面]$ su root
密碼:
[root@redhat7 桌面]# [ $USER = root ] && echo "admin" || echo "user"
user <==…爲何是user呢?命令有錯誤嗎?
[admin@redhat7 ~]$ su – root
密碼:
上一次登陸:三 3月 27 13:21:04 CST 2019pts/0 上
[root@redhat7 ~]# [ $USER = root ] && echo "admin" || echo "user"
admin <==前面犯了個錯誤,沒有使用 su – 命令切換變量環境,如今切換爲root變量環境,測試正常
[root@redhat7 桌面]# [ !$USER = root ]
[root@redhat7 桌面]# echo $?
1
3.3.整數比較運算符僅是對數字的操做,不能將數字與字符串、文件等內容一塊兒操做,並且不能想固然地使用平常生活中的等號、大於號、小於號等來判斷。
由於等號與賦值命令符衝突,大於號和小於號分別與輸出重定向命令符和輸入重定向命令符衝突。所以必定要使用規範的整數比較運算符來進行操做。
運算符 |
做用 |
-eq |
是否等於 |
-ne |
是否不等於 |
-gt |
是否大於 |
-lt |
是否小於 |
-le |
是否等於或小於 |
-ge |
是否大於或等於 |
表5-3 可用的整數比較運算符
示例:
[root@redhat7 桌面]# [ 10 -gt 10 ] <==判斷10是否大於10
[root@redhat7 桌面]# echo $?
1
[root@redhat7 桌面]# [ 10 -eq 10 ] <==判斷10是否等於10
[root@redhat7 桌面]# echo $?
0
[root@redhat7 桌面]# free -m <==查看內存
total used free shared buffers cached
Mem: 1826 987 839 9 0 337
-/+ buffers/cache: 648 1178
Swap: 2047 0 2047
[root@redhat7 桌面]# free -m | grep Mem: <==過濾出剩餘內存的量行
Mem: 1826 989 837 9 0 337
[root@redhat7 桌面]# free -m | grep Mem: | awk '{print $4}' <==只保留第四列
836
[root@redhat7 桌面]# FreeMem=`free -m | grep Mem: | awk '{print $4}'` <==賦值給變量
[root@redhat7 桌面]# echo $FreeMem
836
[root@redhat7 桌面]# [ $FreeMem -lt 1024 ] && echo "Insufficient Memory" <==判斷內存可用量是否小於1024,若小於則提示
Insufficient Memory <==內存不足
3.4.字符串比較語句用於判斷測試字符串是否爲空值,或兩個字符串是否相同。它常常用來判斷某個變量是否未被定義(即內容爲空值),理解起來也比較簡單。
注意:寫腳本前先判斷變量是否被使用,避免產生衝突。
運算符 |
做用 |
= |
比較字符串內容是否相同 |
!= |
比較字符串內容是否不一樣 |
-z |
判斷字符串內容是否爲空 |
表5-4 常見的字符串比較運算符
示例:
[root@redhat7 桌面]# [ -z $String ] <==判斷String變量是否爲空(是否被使用)
[root@redhat7 桌面]# echo $?
0
[root@redhat7 桌面]# echo $LANG
zh_CN.UTF-8
[root@redhat7 桌面]# [ $LANG != "zh.CN" ] && echo "Not en.CN" <==保存當前語系的環境變量值LANG不是中文(zh_CN)時,則會知足邏輯測試條件並輸出「Not zh.CN」
Not en.CN
流程控制語句
Linux shell 編程中,if, for, while, case 等條件流程控制語句用得很是多,熟練掌握以上流程控制語句及語法,對編寫shell腳本有很大的幫助。
1.if條件測試語句
if條件測試語句可讓腳本根據實際狀況自動執行相應的命令。從技術角度來說,if語句分爲單分支結構、雙分支結構、多分支結構;其複雜度隨着靈活度一塊兒逐級上升。
if條件語句的單分支結構由if、then、fi關鍵詞組成,並且只在條件成立後才執行預設的命令,至關於口語的「若是……那麼……」。(if開始,fi結束)
1.1.單分支的if語句
圖5-5 單分支的if語句
示例:
單分支的if條件語句來判斷/media/cdrom文件是否存在,若存在就結束條件判斷和整個Shell腳本,反之則去建立這個目錄。
[root@redhat7 桌面]# vim mkcdrom.sh
[root@redhat7 桌面]# cat mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ] <==判斷這個文件是否不存在
then
mkdir -p $DIR <==若不存在就建立這個目錄
fi
[root@redhat7 桌面]# ls -d /media/cdrom <==沒有目錄
ls: 沒法訪問/media/cdrom: 沒有那個文件或目錄
[root@redhat7 桌面]# bash mkcdrom.sh <==執行腳本
[root@redhat7 桌面]# ls -d /media/cdrom <==腳本執行建立目錄
/media/cdrom
1.2. 雙分支結構if條件語句
if條件語句的雙分支結構由if、then、else、fi關鍵詞組成,它進行一次條件匹配判斷,若是與條件匹配,則去執行相應的預設命令;反之則去執行不匹配時的預設命令,至關於口語的「若是……那麼……或者……那麼……」。
圖5-6 雙分支的if語句
示例:
驗證某臺主機是否在線,而後根據返回值的結果,要麼顯示主機在線信息,要麼顯示主機不在線信息。
使用ping命令來測試與對方主機的網絡聯通性,爲了不用戶等待時間過長,須要經過-c參數來規定嘗試的次數,並使用-i參數定義每一個數據包的發送間隔,以及使用-W參數定義等待超時時間。
[root@redhat7 桌面]# vim chkhost.sh
[root@redhat7 桌面]# cat chkhost.sh
#!/bin/bash
ping -c 3 -i 0.2 -w 3 $1 &> /dev/null <==$1:對象,調取到第一個接收到的參數;> /dev/null 重定向到黑洞文件(回收站)
if [ $? -eq 0 ] <=$? 判斷上一條語句,若返回值爲0,則證實主機存在
then
echo "Host $1 is on-line."
else
echo "Host $1 is off-line."
Fi
[root@redhat7 桌面]# bash chkhost.sh 192.168.0.6
Host 192.168.0.6 is off-line.
1.3.多分支結構if條件語句(最經常使用)
if條件語句的多分支結構由if、then、else、elif、fi關鍵詞組成,它進行屢次條件匹配判斷,這屢次判斷中的任何一項在匹配成功後都會執行相應的預設命令,至關於口語的「若是……那麼……若是……那麼……」。
圖5-7 多分支的if語句
示例:
使用多分支的if條件語句來判斷用戶輸入的分數在哪一個成績區間內,而後輸出如Excellent、Pass、Fail等提示信息。在Linux系統中,read是用來讀取用戶輸入信息的命令,可以把接收到的用戶輸入信息賦值給後面的指定變量,-p參數用於向用戶顯示必定的提示信息。
[root@redhat7 桌面]# vim chkscore.sh
[root@redhat7 桌面]# cat chkscore.sh
#!/bin/bash
read -p "Enter your score (0-100):" GRADE <==read -p 讀取用戶指定的值,賦值給變量;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
[root@redhat7 桌面]# bash chkscore.sh
Enter your score (0-100):89
89 is Excellent
[root@redhat7 桌面]# bash chkscore.sh
Enter your score (0-100):81
81 is pass
[root@redhat7 桌面]# bash chkscore.sh
Enter your score (0-100):39
39 is Fail
[root@redhat7 桌面]# bash chkscore.sh
Enter your score (0-100):136
136 is Fail
爲何輸入的分數爲136時,依然顯示Fail呢?
沒有成功匹配腳本中的兩個條件判斷語句,所以自動執行了最終的兜底策略。(腳本還不是很完美,添加大於100,小於0時,能給error提示的語句,但測試了下,沒有成功)
1.4 if判斷括括號區別
() 用於多個命令組,命令替換,初始化數組
(())整數擴展,運算符,重定義變量值,算術運算比較
[ ] bash內部命令,」[」與test是等同的,正則字符範圍,引用數組元素編號,不支持」+」, 「-」, 「*」, 「/」數學運算符,邏輯測試使用-a, -o
[[ ]] bash程序語言的關鍵字,不是一個命令,[[ ]]比[ ]更通用,不支持」+」, 「-」, 「*」, 「/」數學運算符,邏輯測試使用&&,||
{} 用於命令集合或者範圍
2.for條件循環語句
for循環語句容許腳本一次性讀取多個信息,而後逐一對信息進行操做處理,當要處理的數據有範圍時,使用for循環語句再適合不過了。
圖5-8 for循環語句的語法格式
示例:
使用for循環語句從列表文件中讀取多個用戶名,而後爲其逐一建立用戶帳戶並設置密碼。
[root@redhat7 桌面]# vim users.txt <==建立用戶名稱的列表文件users.txt
[root@redhat7 桌面]# cat users.txt
andy
barry
carl
[root@redhat7 桌面]# vim Example.sh
[root@redhat7 桌面]# cat Example.sh
#!/bin/bash
#Author is Nick.net 2019.3
read -p "Enter The Users Password :" PASSWD <==read命令讀取用戶輸入的密碼值,而後賦值給PASSWD變量
for UNAME in `cat users.txt` <==定義一個UNAME變量,從 users.txt爲變量賦值
do <==開啓循環
id $UNAME &> /dev/null <== id測試用戶是否存在;/dev/null是一個被稱做Linux黑洞的文件,把輸出信息重定向到這個文件等同於刪除數據(相似於沒有回收功能的垃圾箱),可讓用戶的屏幕窗口保持簡潔
if [ $? -eq 0 ] <==使用$?判斷用戶值是否爲0,若爲0,用戶確定存在
then
echo "$UNAME is exists" <==用戶存在
else
useradd $UNAME &> /dev/null <==用戶不存在,建立出來,並將建立信息放入垃圾箱
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null <==重置用戶密碼
fi
done-
[root@redhat7 桌面]# bash Example.sh
Enter The Users Password :12345 <==回車
andy , Create failure <==用戶帳戶建立成功
barry , Create failure
carl , Create failure
[root@redhat7 桌面]# tail -3 /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
問題:用戶沒法使用設置的密碼登錄
緣由:已經建立好了用戶,只能一次使用;沒有啓動else下的兩行命令,第二行的passwd --stdin根本就沒運行,密碼沒有建立;我在root-桌面和root-~建立了腳本和文本
解決:刪除用戶,從新執行腳本
[root@redhat7 桌面]# cat bash.sh <==建立一個刪除用戶的腳本
#! /bin/bash
#Author is Nick.net 2019.3
for USER in `cat users.txt`
do
userdel -r $USER
done
[root@redhat7 桌面]# bash bash.sh
[root@redhat7 桌面]# tail -6 /etc/passwd
gdm:x:42:42::/var/lib/gdm:/sbin/nologin <==用戶已被刪除
…
[root@redhat7 ~]# cat Example.sh <==修改腳本
#!/bin/bash
#Author is Nick.net 2019.3
read -s -p "Enter The Users Password :" PASSWD <==使用 -s選項不顯示密碼
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME is exists"
else
useradd $UNAME &> /dev/null
fi
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null <==12,13行互換,優化腳本,即便用戶存在,也能夠建立密碼。
done
[root@redhat7 ~]# bash Example.sh <==執行腳本
Enter The Users Password :andy is exists <==密碼沒有明文顯示
barry is exists
carl is exists
[root@redhat7 ~]# su - barry
上一次登陸:三 3月 27 16:55:51 CST 2019pts/0 上
[barry@redhat7 ~]$ su – carl
密碼:
上一次登陸:三 3月 27 16:55:41 CST 2019pts/0 上 <==測試成功
(這裏感謝羣裏小夥伴的幫助,一塊兒解決問題,優化腳本)
注意:`命令`=$(命令),執行裏面的命令
測試主機是否在線
[root@redhat7 桌面]# cat ipadds.txt <==IP文本
192.168.0.6
192.168.0.7
192.168.0.8
[root@redhat7 桌面]# vim CheckHosts.sh
[root@redhat7 桌面]# cat CheckHosts.sh
#!/bin/bash
for IP in `cat ipadds.txt`
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is On-line."
else
echo "Host $IP is off-line."
fi
done
流程(思路):讀取文檔—賦值變量IP—進入for循環語句使用ping命令測試是否在線—若是在線返回值爲0,則告訴在線—若是在線返回值不爲0.則進入else測試環節,告訴不在線,若是不寫會測序崩潰,必要的格式(規則)。
[root@redhat7 桌面]# bash CheckHosts.sh
Host 192.168.0.6 is off-line.
Host 192.168.0.7 is off-line.
Host 192.168.0.8 is off-line.
3.while條件循環語句
while條件循環語句是一種讓腳本根據某些條件來重複執行命令的語句,它的循環結構每每在執行前並不肯定最終執行的次數,徹底不一樣於for循環語句中有目標、有範圍的使用場景。
while循環語句經過判斷條件測試的真假來決定是否繼續執行命令,若條件爲真就繼續執行,爲假就結束循環。
圖5-9 while循環語句的語法格式
示例:
使用多分支的if條件測試語句與while條件循環語句,編寫一個用來猜想數值大小的腳本Guess.sh
while條件循環語句中的條件測試始終爲true,所以判斷語句會無限執行下去,直到用戶輸入的數值等於expr命令取得的數值後,這二者相等以後才運行exit 0命令,終止腳本的執行。
[root@redhat7 桌面]# vim Guess.sh
[root@redhat7 桌面]# cat Guess.sh
#!bin/bash
PRICE=$(expr $RANDOM % 1000) <==使用$RANDOM變量來調取出一個隨機的數值(範圍爲0~32767),將這個隨機數對1000進行取餘操做,並使用expr命令取得其結果
TIMES=0 <==統計循環了多少次
echo "商品實際價格爲0-999之間,猜猜看是多少?"
while true
do
read -p "請輸入您猜猜想的價格數目:" INT <==經過read命令輸入的數值進行比較判斷
let TIMES++ <==每當循環到let TIMES++命令時都會讓TIMES變量內的數值加1,(0+1,2+1…)用來統計循環總計執行了多少次。這可讓用戶得知總共猜想了多少次以後,才猜對價格
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答對了。實際價格是 $PRICE"
echo "您總共猜想了 $TIMES 次"
exit 0 <==強制退出
elif [ $INT -gt $PRICE ] ; then
echo "過高了!"
else
echo
echo "過低了!"
fi
done
[root@redhat7 桌面]# bash Guess.sh
商品實際價格爲0-999之間,猜猜看是多少?
請輸入您猜猜想的價格數目:500
過高了!
請輸入您猜猜想的價格數目:100
過低了!
請輸入您猜猜想的價格數目:250
過低了!
請輸入您猜猜想的價格數目:375
過高了!
請輸入您猜猜想的價格數目:320
過低了!
請輸入您猜猜想的價格數目:350
過低了!
請輸入您猜猜想的價格數目:360
過低了!
請輸入您猜猜想的價格數目:370
過高了!
請輸入您猜猜想的價格數目:365
恭喜您答對了。實際價格是 365
您總共猜想了 9 次
報錯
[root@redhat7 桌面]# bash Guess.sh
商品實際價格爲0-999之間,猜猜看是多少?
請輸入您猜猜想的價格數目: <==使用空格
Guess.sh: 第 9 行:[: -eq: 期待一元表達式
Guess.sh: 第 13 行:[: -gt: 期待一元表達式
過低了!
請輸入您猜猜想的價格數目:a <==使用字母
Guess.sh: 第 9 行:[: a: 期待整數表達式
Guess.sh: 第 13 行:[: a: 期待整數表達式
過低了!
緣由:字母和符號沒法與數字進行比較
4.case條件測試語句
case語句是在多個範圍內匹配數據,若匹配成功則執行相關命令並結束整個條件測試;而若是數據不在所列出的範圍內,則會去執行星號(*)中所定義的默認命令。
圖5-10 case條件測試語句的語法結構
示例:
前面寫的一個Guess.sh腳本中有一個致命的弱點—只能接受數字,當輸入字母可能會崩潰。咱們必須有必定的措施來判斷用戶的輸入內容,當用戶輸入的內容不是數字時,腳本能予以提示,從而免於崩潰。過在腳本中組合使用case條件測試語句和通配符編寫腳本Checkkeys.sh以下
[root@redhat7 桌面]# vim Checkkeys.sh
[root@redhat7 桌面]# cat Checkkeys.sh
#!/bin/bash
read -p "請輸入一個字符,並按enter鍵確認:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您輸入的是字母。"
;;
[0-9])
echo "您輸入的數字。"
;;
*) <==兜底,若是..則…
echo "您輸入的是空格,功能鍵或其餘控制字符。"
esac
[root@redhat7 桌面]# bash Checkkeys.sh
請輸入一個字符,並按enter鍵確認:2
您輸入的數字。
[root@redhat7 桌面]# bash Checkkeys.sh
請輸入一個字符,並按enter鍵確認:a
您輸入的是字母。
[root@redhat7 桌面]# bash Checkkeys.sh
請輸入一個字符,並按enter鍵確認:$ [[12
您輸入的是空格,功能鍵或其餘控制字符。
計劃任務服務程序
1.什麼是計劃任務
在指定的時間段自動啓用或中止某些服務或命令,從而實現運維的自動化。
計劃任務分爲一次性計劃任務與長期性計劃任務
2.一次性計劃任務
只執行一次,通常用於知足臨時的工做需求;一次性計劃任務,前提是對應的系統服務atd必須已經運行;計劃任務執行任務的時間必須安排在當前系統時間後。
命令: at
格式:at 時間
若是想要查看已設置好但還未執行的一次性計劃任務,可使用「at -l」命令;要想將其刪除,能夠用「atrm 任務序號」。在使用at命令來設置一次性計劃任務時,默認採用的是交互式方法。
示例:
[root@linuxprobe ~]# at 23:30
at > systemctl restart httpd
at > <==此處請同時按下Ctrl + D組合鍵來結束編寫計劃任務
job 3 at Mon Apr 27 23:30:00 2017 <==將系統設置爲在今晚23:30分自動重啓網站服務
[root@linuxprobe ~]# at -l <==查看
3 Mon Apr 27 23:30:00 2017 a root
或
[root@linuxprobe ~]# echo "systemctl restart httpd" | at 23:30 <==經過非交互式的方式建立計劃一次性任務
job 4 at Mon Apr 27 23:30:00 2017
[root@linuxprobe ~]# at -l
3 Mon Apr 27 23:30:00 2017 a root
4 Mon Apr 27 23:30:00 2017 a root
[root@linuxprobe ~]# atrm 3 <==刪除任務
[root@linuxprobe ~]# at -l
4 Mon Apr 27 23:30:00 2017 a root
3.週期性計劃任務
linux 系統則是由 cron (crond) 這個系統服務來控制的。Linux 系統上面本來就有很是多的計劃性工做,所以這個系統服務是默認啓動的。
crond是linux下用來週期性的執行某種任務或等待處理某些事件的一個守護進程,與windows下的計劃任務相似,當安裝完成操做系統後,默認會安裝此服務工具,而且會自動啓動crond進程,crond進程每分鐘會按期檢查是否有要執行的任務,若是有要執行的任務,則自動執行該任務。
Crontab工具:按照預先設置的時間週期(分鐘、小時、天……)重複執行用戶指定的命令操做;
3.1.管理cron計劃任務
crontab -e 編輯計劃任務
crontab -l 查看計劃任務
crontab -u username -e 在username用戶下編輯計劃任務
crontab -u username -l 查看username下的計劃任務
crontab -u username -r 刪除某個用戶的計劃任務
注意:root用戶能夠管理指定用戶的計劃任務;普通用戶只能管理本身的計劃任務
3.2.時間數值的特殊表示方法
* 表示該範圍內的任意時間
, 表示間隔的多個不連續時間點
- 表示一個連續的時間範圍
/ 指定間隔的時間頻率
示例:
0 17 * * 1-5 週一到週五天天17:00
30 8 * * 1,3,5 每週1、3、五的8點30分
0 8-18/2 * * * 8點到18點之間每2小時
0 * */3 * * 每3天
注意:在crond服務的計劃任務參數中,全部命令必定要用絕對路徑的方式來寫,若是不知道絕對路徑,請用whereis命令進行查詢
示例:
[root@linuxprobe ~]# whereis rm
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz
感悟:有人說學linux不會shell編程,就是不懂linux。前面也知道shell編程,但感受太難,就沒有去練。這兩天認真的學習了shell腳本基礎,總結了一些經驗,算是入了門,但願後面能學會shell編程。
參考資料
劉瑞 Linux就該怎麼學
吳光科 曝光-linux企業運維實戰