Shell编程2
1.2 條件判斷
1.2.1 按照文件類型進行判斷
-b 文件 是否存在且為塊狀設備文件
-c 文件 是否存在且為字符設備文件
-d 文件 是否存在且為目錄
-e 文件 是否存在
-f 文件 是否存在且為普通文件
-L 文件 是否存在且為符號鏈接文件
-p 文件 是否存在且為管道文件
-s 文件 是否存在且為非空
-S 文件 是否存在且為套接字文件
?
常用
-d 文件 是否存在且為目錄
-e 文件 是否存在
-f 文件 是否存在且為普通文件
?
兩種判斷格式
test -e /root/install.log
[ -e /root/install.log ] && echo "yes" || echo "no"
?
echo $? 判斷上一條命令是否正確 0為正確
?
1.2.2 按照文件權限進行判斷
-r 文件 是否存在并且可讀
-w 文件 是否存在并且可寫
-x 文件 是否存在并且可運行
-u 文件 是否存在并且有SUID權限
-g 文件 是否存在并且有SGID權限
-k 文件 是否存在并且有SBit權限
?
1.2.3 兩個文件之間進行比較
文件1 -nt 文件2 ? ? ?文件1的修改時間是否比文件2新
文件1 -ot 文件2 ? ? ?文件1的修改時間是否比文件2舊
文件1 -ef 文件2 ? ? ?判斷Inode號是否一致,是否為同一個文件。可用于判斷硬連接。
?
1.2.4 兩個整數之間比較
整數1 -eq 整數2 是否相等
整數1 -ne 整數2 ? 是否不等
整數1 -gt 整數2 ? 是否大于
整數1 -lt 整數2 ? 是否小于
整數1 -ge 整數2 ? 是否大于等于
整數1 -le 整數2 ? 是否小于等于
?
1.2.5 字符串判斷
-z 字符串 是否為空
-n 字符串 是否非空
字串1 == 字串2 是否相等
字串1 != 字串2 是否不等
?
name=sc //等號兩邊不能有空格
[ -z "$name" ] && echo yes || echo no
no 結果
?
1.2.6 多重條件判斷
判斷1 -a 判斷2 邏輯與
判斷1 -o 判斷2 邏輯或
!判斷 邏輯非,原始判斷取反
?
1.3 流程控制
if ?case ?for ?while
11.3.1單分支if條件語句
if [ 條件判斷式 ];then
????程序
fi
?
if [ 條件判斷式 ]
??then
????程序
fi
所有的計算機技術,不是學會的,而是練會的。
例子
#!/bin/bash
#統計根分區使用率
?
rate=$(df -h | grep "/dev/sda2" | awk '{print $5}' | cut -d "%" -f 1)
#把根分區使用率作為變量值賦予變量rate
?
if [ $rate -ge 80 ]
??then
????echo "Warning! /dev/sda2 is full!!!"
fi
?
1.3.2 雙分支if條件語句
if [ 條件判斷式 ]
????then
????????條件成立時,執行的程序
????else
????????條件不成立時,執行的另一個程序
fi
?
例子
#!/bin/bash
#備份mysql數據庫
?
ntpdate asia.pool.ntp.org &>/dev/null
#同步系統時間 ????????????輸出內容丟棄
?
date=$(date +%y%m%d)
#時間戳
?
size=$(du -sh /var/lib/mysql)
#統計mysql數據庫的大小
?
if [ -d /tmp/dbbak ]
????then
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Data size : $size" >> /tmp/dbbak/dbiinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt
????????&>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
????else
mkdir /tmp/dbbak
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Data size : $size" >> /tmp/dbbak/dbiinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt
????????&>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
fi
?
?
啟動Apache
service httpd start
查詢Apache是否啟動
ps aux | grep httpd
判斷端口
netstat -tlun
安裝nmap工具
yum -y install nmap
?
例子
#!/bin/bash
#判斷Apache是否啟動
port=$(nmap -sT 192.168.143.132 | grep tcp | grep http | awk '{print $2}')
#使用nmap命令掃描服務器,并截取Apache服務的狀態,賦予變量prot
?
if [ "$port" == "open"]
????then
echo "$(date) httpd is OK!" >> /tmp/autostart-acc.log
????else
? /etc/rc.d/init.d/httpd start &>/dev/null
echo "$(date) restart httpd!!" >> /tmp/autostart-err.log
fi
?
1.3.3 多分支if條件語句
if [ 條件判斷式1 ]
??then
????當條件判斷1成立時,執行程序1
elif [ 條件判斷式2 ]
??then
????當條件判斷2成立時,執行程序2
...
?
else
????當所有條件都不成立時,最后執行此程序
fi
?
例子
#!bin/bash
#判斷用戶輸入的是什么文件
?
read -p "Please input a filename: " file
#接收鍵盤的輸入,并賦予變量file
?
if [ -z "$file" ]
#判斷file變量是否為空
????then
echo "Error, please input a filename."
exit 1
elif [ ! -e "$file" ]
#判斷file的值是否存在
????then
echo "Your input is not a file!"
exit 2
elif [ -f "$file" ]
#判斷file的值是否為普通文件
????then
echo "$file is a regulare file!"
elif [ -d "$file"]
#判斷file的值是否為目錄文件
????then
echo "$file is a directory!"
else
echo "$file is an other file!"
fi
?
1.3.4 case語句
case $變量名 in
????"值1")
????????程序1
????????;;
????"值2")
????????程序2
????????;;
????... ...
????*)
????????如果哦變量值都不是以上的值,此程序
????????;;
esac
?
1.3.5 for循環
語法一
for 變量 in 值1 值2 值3 ...
????do
??????程序
????done
?
例子
#!/bin/bash
#打印時間
for time in morning noon afternoon evening
????do
????????echo "This time is $time!"
????done
?
#!/bin/bash
#批量解壓縮腳本
cd /lamp
ls *.tar.gz >ls.log
for i in $(cat ls.log)
????do
??????tar -zxf $i &>/dev/null
????done
rm -rf /lamp/ls.log
?
語法二
for ((初始值;循環控制條件;變量變化))
??do
????程序
??done
?
例子
#!/bin/bash
#從1加到100
s=0
for((i=1; i<=100; i=i+1))
??do
????s=$(($s+$i))
??done
echo "The sum of 1+2+...+100 is : $s"
?
#!/bin/bash
#批量添加指定數量的用戶
read -p "input user name: " -t 30 name
read -p "input the number of user: " -t 30 num
read -p "input the password of user: " -t 30 pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
????then
????y=$(echo $num | sed 's/[0-9]//g')
????????if [ -z "$y" ]
????then
????for((i=1; i<=$num; i=i+1))
?? do
????/usr/sbin/useradd $name$i &>/dev/null
????echo $pass |/usr/bin/passwd--stdin $name$i &>/dev/null
done
fi
fi
?
1.3.6 while循環
不定循環,也稱作條件循環。
只要條件判斷式成立,循環就會一直繼續。
和for的固定循環不太一樣。
?
while [ 條件判斷式 ]
??do
????程序
??done
?
例子
#!/bin/bash
#從1加到100
i=1
s=0
while [ $i -le 100 ]
??do
????s=$(($s+$i))
????i=$(($i+1))
??done
echo "The sum is: $s"
?
until循環
和while循環相反,只要條件判斷式不成立則進行循環
?
until [ 條件判斷式 ]
??do
????程序
??done
?
例子
#!/bin/bash
#從1加到100
i=1
s=0
util [ $i -gt 100 ]
??do
????s=$(($s+$i))
????i=$(($i+1))
??done
echo "The sum is: $s"
腳本語言:不適用于數值計算,主要用于輔助系統運維工作
好處:無需編譯,所見即所得
壞處:運行速度慢
總結