shell腳本
Shell腳本是將各種命令通過邏輯語句組合而成的程序
-
腳本每行寫一條Linux命令。并且一個完整的Shell腳本則應該包括"腳本聲明"、"注釋信息"和"可執行語句"
腳本聲明(#!):告知系統用何種shell來解釋。 注釋信息(#):對可執行語句或程序功能做介紹,可以不寫。 可執行語句:執行的具體命令。
-
執行腳本有三種方法
腳本文件路徑:./Example.sh sh腳本文件路徑:sh Example.sh source腳本文件路徑:source Example.sh
-
采用直接執行的方式有時可能權限不夠,需要給腳本可執行權限,或者用sh,source執行腳本
./Example.sh 發現權現不夠 chmod u+x Example.sh ./Example.sh
-
shell可以接受用戶輸入
./Example.sh one two three four five six $0 當前執行Shell腳本的程序名。 $1-9,${10},${11}…… 參數的位置變量。 $# 一共有多少個參數。 $* 所有位置變量的值。 $? 判斷上一條命令是否執行成功,0為成功,非0為失敗。
測試語句
測試語句能夠測試特定的表達式是否成立,當條件成立時返回值為0,否則返回其他數值
測試語句格式:[ 測試語句 ],其中 中括號兩邊均有一個空格
測試語句可以分為:文件測試,邏輯測試,整數值比較,字符串比較
文件測試
-
操作符
-d 測試是否為目錄。 -f 判斷是否為文件。 -e 測試文件或目錄是否存在。 -r 測試當前用戶是否有權限讀取。 -w 測試當前用戶是否有權限寫入。 -x 測試當前用戶是否有權限執行。
-
示例
[ -d /etc ] $?
邏輯測試
[ 表達式1 ] 操作符 [ 表達式2 ]
-
操作符
&& 邏輯的與,"而且"的意思。 || 邏輯的或,"或者"的意思。 ! 邏輯的否。
-
示例
[ $USER != root ] && echo "user" || echo "root"
整數比較
整數值比較:[ 整數1 操作符 整數2 ]
-
運算符
-eq 判斷是否等于 -ne 判斷是否不等于 -gt 判斷是否大于 -lt 判斷是否小于 -le 判斷是否等于或小于 -ge 判斷是否大于或等于
-
示例
[ 10 -gt 10 ] 獲取當前可用的內存量,并將此值賦值給變量FreeMem: FreeMem=`free -m | grep cache: | awk '{print $3}'` 判斷此值是否小與1024(單位是M),若小于則提示內存不足: [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
字符串比較
[字符串1 操作符 字符串2]
-
運算符
= 比較字符串內容是否相同。 != 比較字符串內容是否不同。 -z 判斷字符串內容是否為空。
-
示例
[ $LANG != "en.US" ] && echo "Not en.US"
條件測試語句
if語句
-
if條件語句
if 條件測試語句 then 命令 fi
-
雙分支結構
if 條件測試語句 then 命令 else 命令 fi
-
多分支結構
if 條件測試語句 then 命令 elif 條件測試語句 then 命令 else 命令 fi
-
示例1
#!/bin/bash DIR="/media/cdrom" if [ !-e $DIR ]; then mkdir -p $DIR fi
-
示例2 為了減少用戶的等待時間,需要為ping命令追加-c參數代表發送數據包的個數,-i代表每0.2秒發一個數據包,-W則為3秒即超時。而$1為用戶輸入的第一個參數(IP地址),$?為上一條命令的執行結果,判斷是否等于0(即成功)
ping -c 3 -i 0.2 -W 3 $1 &>/dev/null if[ $? -eq 0 ]; then ehco "Host $1 is up" else echo "Host $1 is down" fi
-
示例3 根據分數評等級
#!/bin/bash read -p "Enter your socre(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
for語句
-
基本命令
for 變量名 in 取值列表 do 命令 done
-
示例:Shell腳本提示用戶輸入要設置的密碼并賦值給PASSWD變量,從users.txt文件中讀入用戶名并賦值給UNAME變量, 而查看用戶的信息都重定向到/dev/null文件,不顯示到屏幕
#!/bin/bash read -p "Enter the user 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 failture" fi fi done
-
示例:從列表文件中讀取主機地址,逐個測試是否在線
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
while語句
-
基本語法
while 條件測試語句 do 命令 done
-
示例:隨機生成一個0-999的整數,判斷并提示用戶輸入的值過高或過低
#!/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
case語句
-
基本語法
case 變量值 in 模式1 ) 命令 ;; 模式2) 命令 ;; esac
-
示例
#!/bin/bash read -p "請輸入一個字符,并按Enter鍵確認:" KEY case $KEY in [a-z]|[A-Z] ) echo "您輸入的是 字母。" ;; [0-9]) ) echo "您輸入的是 字母。" ;; esac
計劃任務服務
一次性任務
-
一次性任務吧,它是由atd服務/進程來實現的,計劃的管理操作是"at"命令
at <時間> 安排一次性任務 atq或at -l 查看任務列表 at -c 序號 預覽任務與設置環境 atrm 序號 刪除任務
-
示例
交互式: at 23:30 at > systemctl start httpd at > job 3 at Mon Apr 27 23:30:00 2015 非交互式: echo "systemctl start httpd" | at 23:30 查看任務: atq
長期任務
-
基本命令
創建、編輯計劃任務:crontab -e [-u 用戶名] 查看計劃任務:crontab -l [-u 用戶名] 刪除計劃任務:crontab -r [-u 用戶名]
-
創建參數 crontab參數
-
示例,每周1、3、5的凌晨3點25分將/home/wwwroot目錄打包備份為backup.tar.gz"
crontab -e 25 3 * * 1,3,5 /usr/bin/tar -czvf backukp.tar.gz /home/wwwroot