#編寫shell腳本
##1.編寫簡單腳本
#!/bin/bash
#for example by masf
pwd
ls -al
###内容簡介:
第一行 腳本聲明(#!)告訴系統使用哪種shell解釋器執行該腳本
第二行 注釋資訊(#) 對腳本功能和某些指令的介紹
第三行開始 寫執行的指令
###執行方式:
1.bash解釋器運作腳本
[[email protected] ~]# bash example1.sh
2.通過輸入完整路徑運作腳本,需要修改權限
[[email protected] ~]# chmod u+x example1.sh 增加可執行權限
[[email protected] ~]# ./example1.sh
##2.接收使用者的參數
1.Linux内設了用于接收參數的變量,變量之間使用空格間隔
2.$0 對應的是目前腳本程式的名稱
3.$1、$2..... 分别對應第N個位置上的參數值
4.$* 對應所有位置上的參數值
5.$? 對應上一次指令的傳回結果
6.$# 參數的個數
###腳本樣例
#!/bin/bash
echo "目前腳本名稱為$0"
echo "總共有$#個參數,分别是$*"
echo "第一個參數是$1,第五個參數是$5."
### 執行結果
[[email protected] ~]# bash example2.sh one two three four five six
目前腳本名稱為example2.sh
總共有6個參數,分别是one two three four five six
第一個參數是one,第五個參數是five.
##3. 判斷使用者的參數
###條件測試語句
分類:
檔案測試語句
邏輯測試語句
整數值比較語句
字元串比較語句
格式:
測試語句格式: [ 條件表達式 ]
說明:條件表達式左右都有一個空格
###條件測試參數
檔案測試的參數及作用
-d 測試檔案是否為目錄
-e 測試檔案是否存在
-f 測試檔案是否是一般檔案
-r 測試目前使用者是否有權限讀取
-w 測試目前使用者是否有權限寫入
-x 測試目前使用者是否有權限執行
邏輯測試語句
&&(邏輯與) && 符号前的命名為true,執行&&後指令
||(邏輯或) || 符号前的指令為false,執行||後指令
! (邏輯非)
整數比較運算符參數及作用
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
字元串比較運算符參數及作用
= 比較字元串内容是否相同
!= 比較字元串内容是否不同
-z 判斷字元串内容是否為空
###測試樣例
[roo[email protected] ~]# FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[[email protected] ~]# echo $FreeMem
941
[[email protected] ~]# [ $FreeMem -lt 1024 ] && echo "Insufficient memory"
Insufficient memory
[[email protected] ~]# echo $LANG
zh_CN.UTF-8
[roo[email protected] ~]# [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US
##4.流程控制語句
###if 條件測試語句
####測試樣例:
1.if條件語句判斷/media/cdrom目錄是否存在,存在就結束條件和整個腳本;不存在建立目錄
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
2.驗證某台主機是否線上
參數解釋:
-c 設定嘗試次數
-i 每個資料包的發送間隔
-W 設定逾時時間
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 $> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is on-line"
else
echo "Host $1 is off-line"
fi
3.多分支if語句來判斷使用者輸入的分數在哪個成績區間内
參數解釋
read 用來讀取使用者輸入資訊的指令,能夠把接收到的使用者輸入資訊指派給後面的指定變量
-p 用于向使用者顯示一定的提示資訊
#!/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
###for條件循環語句
####功能
允許腳本一次性讀取多個資訊,然後逐一對資訊進行操作處理,适合處理的資料有範圍
####文法結構
for 變量名 in 取值清單
do
指令序列
done
####測試樣例
參數解釋
id 使用者名 指令檢視使用者的資訊
$? 判斷指令是否執行成功,即使用者是否已經存在
/dev/null 是一個黑洞檔案,把輸出資訊重定向到這個檔案等同于删除資料
1.從清單檔案中讀取多個使用者名,然後逐一建立使用者賬戶并設定密碼
#!/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 "$UNAME , create success"
else
echo "$UNAME , create failure"
fi
fi
done
###while條件循環語句
####文法結構
while 條件測試操作
do
指令序列
done
####測試樣例
參數解釋
$RANDOM 随機産生 0-32767之間的整數
expr指令 取得結果
#!/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)
指令序列1
;;
模式2
指令序列2
;;
*)
預設序列
esac
#!/bin/bash
read -p "請輸入一個字元,并按Enter鍵确認:" KEY
case "$KEY" in
[a-z] |[A-Z])
echo "您輸入的是 字母"
;;
[0-9])
echo "您輸入的是數字"
;;
*)
echo "您輸入的是 空格、功能鍵或其他控制符"
esac
##5.計劃任務程式服務
###計劃任務分類
一次性計劃任務:今晚11點30分開啟網站服務
長期性計劃任務:每周一的淩晨3點25分把/home/xxxx 目錄打包備份為 backup.tar.gz
###一次性計劃任務
設定任務 at 時間
檢視任務 at -l
删除任務 atrm 任務序号
###周期性計劃任務
Linux系統使用crond服務
crontab -e 建立、編輯計劃任務
crontab -l 檢視計劃任務
crontab -r 删除某條計劃任務
crontab -u 編輯他人的計劃任務(需要管理者登入)
crontab設定任務參數及作用
分 取值為0-59的整數
時 取值為0-23的整數
日 取值為1-31的任意整數
月 取值為1-12的任意整數
星期 取值為0-7的整數(0/7均是周日)
指令 要執行的指令或腳本
###測試樣例
[[email protected] ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[[email protected] ~]# 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/*
###注意事項
在參數配置中,可以以#開頭寫上注釋資訊
計劃任務中的分字段必須有數值,不能是空或*
日與星期字段不能同時使用,否則會發生沖突