shell腳步基本文法
1. 接受使用者的參數
1 $0 //第幾個參數
2 $# //參數總長度
3 $* //分别有什麼
4
5
6 [root@localhost ~]# cat example.sh
7 #!/bin/bash
8 echo "目前腳步名稱為$0"
9 echo "總共有$#個參數,分别是$*"
10 echo "第一個參數為$1,第5個為$5"
11
12 [root@localhost ~]# bash example.sh one two three four five six
13 目前腳步名稱為example.sh
14 總共有6個參數,分别是one two three four five six
15 第一個參數為one,第5個為five
使用者參數
2. 判斷使用者的參數
按照測試對象來劃分,條件測試語句可以分為4種:
2.1 檔案測試語句;
檔案測試即使用指定條件來判斷檔案是否存在或權限是否滿足等情況的運算符
檔案測試所用的參數
操作符 | 作用 |
-d | 測試檔案是否為目錄類型 |
-e | 測試檔案是否存在 |
-f | 判斷是否為一般檔案 |
-r | 測試目前使用者是否有權限讀取 |
-w | 測試目前使用者是否有權限寫入 |
-x | 測試目前使用者是否有權限執行 |
1 Shell解釋器的内設$?變量顯示上一條指令執行後的傳回值
2 如果傳回值為0,則目錄存在;如果傳回值為非零的值,
3 則意味着它不是目錄,或這個目錄不存在:
4 [root@localhost ~]# [ -d /etc/fstab ]
5 [root@localhost ~]# echo $?
6 1
是否為一個目錄類型的檔案
1 判斷/etc/fstab是否為一般檔案,
2 如果傳回值為0,則代表檔案存在,且為一般檔案
3 [root@localhost ~]# [ -f /etc/fstab ]
4 [root@localhost ~]# echo $?
5 0
否為一般檔案
1 邏輯語句用于對測試結果進行邏輯分析,根據測試結果可實作不同的效果。
2 例如在Shell終端中邏輯“與”的運算符号是&&,
3 它表示目前面的指令執行成功後才會執行它後面的指令,
4 是以可以用來判斷/dev/cdrom檔案是否存在,若存在則輸出Exist字樣
5
6 [root@localhost ~]# [ -e /dev/cdrom ] && echo "Exist"
7 Exist
檔案是否存在
1 在Linux系統中的運算符号為||,
2 表示目前面的指令執行失敗後才會執行它後面的指令,
3 是以可以用來結合系統環境變量USER來
4 判斷目前登入的使用者是否為非管理者身份
5
6 [root@localhost ~]# echo $USER
7 root
8 [root@localhost ~]# [ $USER = root ] || echo "user"
9 [root@localhost ~]# su linuxprobe
10 [linuxprobe@localhost root]$ [ $USER = root ] || echo "user"
11 user
邏輯“或”
1 在Linux系統中的運算符号是一個歎号(!),
2 它表示把條件測試中的判斷結果取相反值。也就是說,
3 如果原本測試的結果是正确的,則将其變成錯誤的;
4 原本測試錯誤的結果,則将其變成正确的。
5
6 [root@localhost ~]# [ ! $USER = root ] || echo "administrator"
7 administrator
邏輯”非“
2.2 邏輯測試語句;
&&是邏輯“與”,隻有目前面的語句執行成功的時候才會執行後面的語句。
||是邏輯“或”,隻有目前面的語句執行失敗的時候才會執行後面的語句。
!是邏輯“非”,代表對邏輯測試結果取反值;之前若為正确則變成錯誤,若為錯誤則變成正确。
2.3 整數值比較語句;
可用的整數比較運算符
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
2.4 字元串比較語句。
常見的字元串比較運算符
= | 比較字元串内容是否相同 |
!= | 比較字元串内容是否不同 |
-z | 判斷字元串内容是否為空 |
3. 流程控制語句
3.1 if 條件測試語句
3.1.1 單分支語句
1 使用單分支的if條件語句來判斷/media/cdrom目錄是否存在,
2 若不存在就建立這個目錄,
3 反之則結束條件判斷和整個Shell腳本的執行
4
5 [root@linuxprobe ~]# vim mkcdrom.sh
6 #!/bin/bash
7 DIR="/media/cdrom"
8 if [ ! -d $DIR ]
9 then
10 mkdir -p $DIR
11 fi
if條件語句來判斷目錄是否存在
3.1.2 雙分支語句
1 下面使用雙分支的if條件語句來驗證某台主機是否線上,
2 然後根據傳回值的結果,要麼顯示主機線上資訊,要麼顯示主機不線上資訊。
3 這裡的腳本主要使用ping指令來測試與對方主機的網絡連通性,
4 而Linux系統中的ping指令不像Windows一樣嘗試4次就結束,
5 是以為了避免使用者等待時間過長,需要通過-c參數來規定嘗試的次數,
6 并使用-i參數定義每個資料包的發送間隔,
7 以及使用-W參數定義等待逾時時間。
8
9 [root@linuxprobe ~]# vim chkhost.sh
10 #!/bin/bash
11 ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
12 if [ $? -eq 0 ]
13 then
14 echo "Host $1 is On-line."
15 else
16 echo "Host $1 is Off-line."
17 fi
if條件語句來驗證某台主機是否線上,
3.1.3 多分支語句
1 在下面的腳本示例中,隻有當使用者輸入的分數大于等于85分且小于等于100分時,才輸出Excellent字樣;若分數不滿足該條件(即比對不成功),
2 則繼續判斷分數是否大于等于70分且小于等于84分,
3 如果是,則輸出Pass字樣;若兩次都落空(即兩次的比對操作都失敗了),
4 則輸出Fail字樣:
5
6 [root@linuxprobe ~]# vim chkscore.sh
7 #!/bin/bash
8 read -p "Enter your score(0-100):" GRADE
9 if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
10 echo "$GRADE is Excellent"
11 elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
12 echo "$GRADE is Pass"
13 else
14 echo "$GRADE is Fail"
15 fi
if條件語句來判斷分數
3.2 for條件循環語句
1 [root@linuxprobe ~]# vim users.txt
2 andy
3 barry
4 carl
5 duke
6 eric
7 george
8
9 [root@linuxprobe ~]# vim addusers.sh
10 #!/bin/bash
11 read -p "Enter The Users Password : " PASSWD
12 for UNAME in `cat users.txt`
13 do
14 id $UNAME &> /dev/null
15 if [ $? -eq 0 ]
16 then
17 echo "$UNAME , Already exists"
18 else
19 useradd $UNAME
20 echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
21 echo "$UNAME , Create success"
22 fi
23 done
從清單檔案中讀取多個使用者名,然後為其逐一建立使用者賬戶并設定密碼
/dev/null是一個被稱作Linux黑洞的檔案,把輸出資訊重定向到這個檔案等同于删除資料(類似于沒有回收功能的垃圾箱),可以讓使用者的螢幕視窗保持簡潔。
1 [root@linuxprobe ~]# vim CheckHosts.sh
2 #!/bin/bash
3 HLIST=$(cat ~/ipaddrs.txt)
4 for IP in $HLIST
5 do
6 ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
7 if [ $? -eq 0 ]
8 then
9 echo "Host $IP is On-line."
10 else
11 echo "Host $IP is Off-line."
12 fi
13 done
從文本中自動讀取主機清單,然後自動逐個測試這些主機是否線上
3.3 while條件循環語句
1 [root@linuxprobe ~]# vim Guess.sh
2 #!/bin/bash
3 PRICE=$(expr $RANDOM % 1000)
4 TIMES=0
5 echo "商品實際價格為0-999之間,猜猜看是多少?"
6 while true
7 do
8 read -p "請輸入您猜測的價格數目:" INT
9 let TIMES++
10 if [ $INT -eq $PRICE ] ; then
11 echo "恭喜您答對了,實際價格是 $PRICE"
12 echo "您總共猜測了 $TIMES 次"
13 exit
14 elif [ $INT -gt $PRICE ] ; then
15 echo "太高了!"
16 else
17 echo "太低了!"
18 fi
19 done
猜猜小遊戲
3.4 case條件測試語句
1 [root@linuxprobe ~]# vim Checkkeys.sh
2 #!/bin/bash
3 read -p "請輸入一個字元,并按Enter鍵确認:" KEY
4 case "$KEY" in
5 [a-z]|[A-Z])
6 echo "您輸入的是 字母。"
7 ;;
8 [0-9])
9 echo "您輸入的是 數字。"
10 ;;
11 *)
12 echo "您輸入的是 空格、功能鍵或其他控制字元。"
13 esac
14 [root@linuxprobe ~]# bash Checkkeys.sh
15 請輸入一個字元,并按Enter鍵确認:6
16 您輸入的是 數字。
17 [root@linuxprobe ~]# bash Checkkeys.sh
18 請輸入一個字元,并按Enter鍵确認:p
19 您輸入的是 字母。
20 [root@linuxprobe ~]# bash Checkkeys.sh
21 請輸入一個字元,并按Enter鍵确認:^[[15~
22 您輸入的是 空格、功能鍵或其他控制字元。
判斷輸入的值
4. 計劃任務服務程式
4.1 一次性計劃任務
at指令的參數及其作用
參數 | |
指定包含指令的任務檔案 | |
-q | 指定新任務名稱 |
-l | 顯示待執行任務清單 |
删除指定待執行任務 | |
-m | 任務執行後給使用者發郵件 |
1 在使用at指令來設定一次性計劃任務時,預設采用的是互動式方法。
2 例如,使用下述指令将系統設定為在今晚23:30自動重新開機網站服務
3
4 [root@linuxprobe ~]# at 23:30
5 warning: commands will be executed using /bin/sh
6 at> systemctl restart httpd
7 at> 此處請同時按下<Ctrl>+<d>鍵來結束編寫計劃任務
8 job 1 at Wed Oct 14 23:30:00 2020
9 [root@linuxprobe ~]# at -l
10 1 Wed Oct 14 23:30:00 2020 a root
今晚23:30重新開機網站服務
4.2 長期性計劃任務
crontab指令的參數及其作用
編輯計劃任務 | |
-u | 指定使用者名稱 |
列出任務清單 | |
删除計劃任務 |
這是使用crond服務設定任務的參數格式(其格式見表4-8)。需要注意的是,如果有些字段沒有被設定,則需要使用星号(*)占位
字段 | 說明 |
分鐘 | 取值為0~59的整數 |
小時 | 取值為0~23的任意整數 |
日期 | 取值為1~31的任意整數 |
月份 | 取值為1~12的任意整數 |
星期 | 取值為0~7的任意整數,其中0與7均為星期日 |
指令 | 要執行的指令或程式腳本 |
1 使用crontab -e指令來建立計劃任務,為自己建立計劃任務時無須使用-u參數。
2 crontab –e指令的具體實作效果和crontab -l指令的結果如下所示:
3
4 [root@linuxprobe ~]# crontab -e
5 no crontab for root - using an empty one
6 crontab: installing new crontab
7 [root@linuxprobe ~]# crontab -l
8 25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
每周一、三、五的淩晨3:25,把某個網站的資料目錄進行打包處理