shell腳本
Shell腳本是將各種命令通過邏輯語句組合而成的程序
-
腳本每行寫一條Linux命令。并且一個完整的Shell腳本則應(yīng)該包括"腳本聲明"、"注釋信息"和"可執(zhí)行語句"
腳本聲明(#!):告知系統(tǒng)用何種shell來解釋氨淌。 注釋信息(#):對可執(zhí)行語句或程序功能做介紹,可以不寫亲桦。 可執(zhí)行語句:執(zhí)行的具體命令殉摔。
-
執(zhí)行腳本有三種方法
腳本文件路徑:./Example.sh sh腳本文件路徑:sh Example.sh source腳本文件路徑:source Example.sh
-
采用直接執(zhí)行的方式有時可能權(quán)限不夠,需要給腳本可執(zhí)行權(quán)限舵变,或者用sh,source執(zhí)行腳本
./Example.sh 發(fā)現(xiàn)權(quán)現(xiàn)不夠 chmod u+x Example.sh ./Example.sh
-
shell可以接受用戶輸入
./Example.sh one two three four five six $0 當(dāng)前執(zhí)行Shell腳本的程序名酣溃。 $1-9,${10},${11}…… 參數(shù)的位置變量。 $# 一共有多少個參數(shù)纪隙。 $* 所有位置變量的值赊豌。 $? 判斷上一條命令是否執(zhí)行成功,0為成功绵咱,非0為失敗碘饼。
測試語句
測試語句能夠測試特定的表達式是否成立,當(dāng)條件成立時返回值為0悲伶,否則返回其他數(shù)值
測試語句格式:[ 測試語句 ]艾恼,其中 中括號兩邊均有一個空格
測試語句可以分為:文件測試,邏輯測試麸锉,整數(shù)值比較钠绍,字符串比較
文件測試
-
操作符
-d 測試是否為目錄。 -f 判斷是否為文件花沉。 -e 測試文件或目錄是否存在柳爽。 -r 測試當(dāng)前用戶是否有權(quán)限讀取媳握。 -w 測試當(dāng)前用戶是否有權(quán)限寫入。 -x 測試當(dāng)前用戶是否有權(quán)限執(zhí)行磷脯。
-
示例
[ -d /etc ] $?
邏輯測試
[ 表達式1 ] 操作符 [ 表達式2 ]
-
操作符
&& 邏輯的與蛾找,"而且"的意思。 || 邏輯的或争拐,"或者"的意思腋粥。 ! 邏輯的否。
-
示例
[ $USER != root ] && echo "user" || echo "root"
整數(shù)比較
整數(shù)值比較:[ 整數(shù)1 操作符 整數(shù)2 ]
-
運算符
-eq 判斷是否等于 -ne 判斷是否不等于 -gt 判斷是否大于 -lt 判斷是否小于 -le 判斷是否等于或小于 -ge 判斷是否大于或等于
-
示例
[ 10 -gt 10 ] 獲取當(dāng)前可用的內(nèi)存量架曹,并將此值賦值給變量FreeMem: FreeMem=`free -m | grep cache: | awk '{print $3}'` 判斷此值是否小與1024(單位是M)隘冲,若小于則提示內(nèi)存不足: [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
字符串比較
[字符串1 操作符 字符串2]
-
運算符
= 比較字符串內(nèi)容是否相同。 != 比較字符串內(nèi)容是否不同绑雄。 -z 判斷字符串內(nèi)容是否為空展辞。
-
示例
[ $LANG != "en.US" ] && echo "Not en.US"
條件測試語句
if語句
-
if條件語句
if 條件測試語句 then 命令 fi
-
雙分支結(jié)構(gòu)
if 條件測試語句 then 命令 else 命令 fi
-
多分支結(jié)構(gòu)
if 條件測試語句 then 命令 elif 條件測試語句 then 命令 else 命令 fi
-
示例1
#!/bin/bash DIR="/media/cdrom" if [ !-e $DIR ]; then mkdir -p $DIR fi
-
示例2 為了減少用戶的等待時間,需要為ping命令追加-c參數(shù)代表發(fā)送數(shù)據(jù)包的個數(shù)万牺,-i代表每0.2秒發(fā)一個數(shù)據(jù)包罗珍,-W則為3秒即超時。而$1為用戶輸入的第一個參數(shù)(IP地址)脚粟,$?為上一條命令的執(zhí)行結(jié)果覆旱,判斷是否等于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 根據(jù)分數(shù)評等級
#!/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腳本提示用戶輸入要設(shè)置的密碼并賦值給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的整數(shù)团南,判斷并提示用戶輸入的值過高或過低
#!/bin/bash PRICE = $(expr $RANDOM % 1000) TIMES = 0 echo "商品實際價格為0-999之間噪沙,猜猜看是多少?" while true; do read -p "請輸入你猜測的價格數(shù)目:" 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
計劃任務(wù)服務(wù)
一次性任務(wù)
-
一次性任務(wù)吧冗疮,它是由atd服務(wù)/進程來實現(xiàn)的萄唇,計劃的管理操作是"at"命令
at <時間> 安排一次性任務(wù) atq或at -l 查看任務(wù)列表 at -c 序號 預(yù)覽任務(wù)與設(shè)置環(huán)境 atrm 序號 刪除任務(wù)
-
示例
交互式: 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 查看任務(wù): atq
長期任務(wù)
-
基本命令
創(chuàng)建、編輯計劃任務(wù):crontab -e [-u 用戶名] 查看計劃任務(wù):crontab -l [-u 用戶名] 刪除計劃任務(wù):crontab -r [-u 用戶名]
-
創(chuàng)建參數(shù) crontab參數(shù)
-
示例赌厅,每周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