條件判斷與流程控制
一、條件判斷式語句
1.按照文件類型判斷
(1)
常用:
-d 文件 判斷該文件是否存在,並且是否爲目錄文件(是目錄爲真)
-e 文件 判斷該文件是否存在(存在爲真)
-f 文件 判斷該文件是否存在,並且是否爲普通文件(是普通文件爲真)
(2)兩種判斷格式
test -e /root/install.log
[-e /root/install.log]
注:可以再次使用:
預定義變量$?
echo $?
返回0表示上一條命令成功執行
返回非0表示上一條命令未成功執行
上述方式不能直觀的表現想要的結果,可以使用
[-d /root] && echo "yes" || echo "no"
2.按照文件權限進行判斷
常用:
-r文件 判斷該文件是否存在,並且是否該文件擁有讀權限(有讀權限爲真)
-w文件 判斷該文件是否存在,並且是否該文件擁有寫權限(有寫權限爲真)
-x文件 斷該文件是否存在,並且是否該文件擁有執行權限(有執行權限爲真)
例子:
[-w /root/install.log]
只要該文件擁有該權限,不會判斷是所屬者或者所屬組是否擁有。
3.兩個文件之間進行比較
文件1 -nt 文件2 判斷文件1的修改時間是否比文件2的新(如果新則爲真)
文件1 -ot 文件2 判斷文件1的修改時間是否比文件2的舊(如果舊則爲真)
文件1 -ef 文件2 判斷文件1是否和文件2的Inode號一致,可以理解爲兩個文件是否爲同一個文件。這個判斷用於判斷硬鏈接是很好的方法
4.兩個整數之間的比較
5.字符串的判斷
eg:
[-z $name] && echo yes || echo no
aa=11
bb=22
["$aa" == "$bb"]
# 比較字符串,注意,這裏的$aa 和 $bb加了雙引號
6.多重條件判斷
二、單分支if語句
1.
if [ 條件判斷式 ];then
程序
fi
或者
if [ 條件判斷式 ]
then
程序
fi
單分支條件語句需要注意幾個點:
if語句使用fi結尾,和一般語言使用大括號結尾不同
[ 條件判斷式 ]就是使用test命令判斷,所以中括號和條件判斷式之間必須有空格
2.例子1.判斷登陸的用戶是否root
eg:
#!/bin/bash
test=$(env | grep "USER" | cut -d "=" -f 2)
if [ "$test" == "root" ]
then
echo "Current user is root."
fi
注:then後面跟符合條件之後執行的程序,可以放在[]之後,用";“分割。也可以換行寫入,就不需要”;"了
3.例子2:判斷分區使用率
#!/bin/bash
rate=$(df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f 1)
if [ "$rate" -ge "80" ]
then
echo "/dev/sda1 is full"
fi
三、雙分支if條件語句
1.
if [ 條件判斷式 ]
then
條件成立時,執行的程序
else
條件不成立時,執行的另一個程序
fi
2.例子3 輸入一個字符串,判斷是不是目錄
read -t 30 -p "please input a dir:" dir
# 等待30秒,輸出提示信息
if [-d "$dir"]
then
echo "yes"
else
echo "no"
fi
3.例子4 判斷Apache服務是否正常啓用
ps aux | grep httpd | grep -v grep #查詢httpd是否啓動
注:ps aux:查看系統中所有正在運行的進程
grep -v grep:取反,取出不包含grep的行
腳本:
#!/bin/bash
test=$(ps aux | grep httpd | grep -v grep)
if [ -n "$test" ]
then
echo "httpd is ok!"
else
/etc/rc.d/init.d/httpd start
echo "restart httpd !!"
fi
注意:腳本名不應該與服務名相同
四、多分支if條件語句
1.
if [ 條件判斷式1 ]
then
當條件判斷式1成立時,執行程序1
elif [ 條件判斷式2 ]
then
當條件判斷式2成立時,執行程序2
...省略更多條件...
else
當所有條件都不成立時,最後執行此程序‘
fi
2.例子5 簡單計算器
#!/bin/bash
read -t 30 -p "Please input num1:" num1
read -t 30 -p "Please input num2:" num2
read -t 30 -p "Please input operator:" ope
if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
then
test1=$(echo $num1 | sed 's/[0-9]//g')
test2=$(echo $num2 | sed 's/[0-9]//g')
if [ -z "$test1" -a -z "$test2" ]
then
if [ "$ope" == '+' ]
then
result=$(($num1+$num2))
elif [ "$ope" == '-' ]
then
result=$(($num1-$num2))
elif [ "$ope" == '/' ]
then
result=$(($num1 / $num2))
elif [ "$ope" == '*' ]
then
result=$(($num1*num2))
else
echo "Error: the input operator is worng, please input +-*/"
exit 111
fi
else
echo "Error: Please input numbers!"
exit 222
fi
echo "$num1 $ope $num2 is $result"
else
echo "Error: You input null value!"
exit 333
fi
3.例子6 判斷用戶輸入的是什麼文件
#!/bin/bash
read -t 30 -p "Please input a file name:" file
if [ -z "$file" ]
then
echo "Error, please input a file name!"
exit 11
elif [ ! -e "$file" ]
then
echo "Your input is not a file name!"
exit 22
elif [ -f "$file" ]
then
echo "$file is a regular file!"
elif [ -d "$file" ]
then
echo "$file is a directory !"
else
echo "$file is another file!"
fi
五、多分支case語句
1.
case語句和if…elif…else語句一樣都是多分支條件語句,不過和if多分支條件語句不同的是,case語句只能判斷一種條件關係,而if語句可以判斷多種條件關係。
case $變量名 in
"值1")
如果變量的值等於值1,則執行程序1
;; #注意分號(;)一定要加
"值2")
如果變量的值等於值2,則執行程序2
;;
…省略其他分支.…
*)
如果變量的值都不是以上的值,則執行此程序
;;
esac
2.例子7
#!/bin/bash
read -t 30 -p "please input yes/no:" cho
case "$cho" in
"yes")
echo "yes"
;;
"no")
echo "no"
;;
*)
echo "please input yes/no again!!!"
;;
esac
六、for循環
1.語法一
for 變量 in 值1 值2 值3...
do
程序
done
eg:
#!/bin/bash
for i in 1 2 3 4 5
do
echo $i
done
2.例子8 for循環批量解壓壓縮包
##!/bin/bash
cd /root/test
ls *.tar.gz > ls.log #(>覆蓋)
ls *.tgz >> ls.log #(>>追加)
for i in $( cat ls.log )
do
tar -czf $i &> /dev/null
#把執行過程中所有輸出信息丟到回收站,不顯示在屏幕上
done
rm -rf ls.log
3.語法二
for ((初始值;循環控制條件;變量變化))
do
程序
done
eg:1到100的累加
##!/bin/bash
s=0
for (( i=1;i<=100;i=i+1))
do
s=$(($s+$i))
done
echo "sum is: $s"
4.例子9 批量添加刪除指定數量的用戶
#!/bin/bash
#批量添加指定數量的用戶實例
read -t 30 -p "input user name:" name
read -t 30 -p "input password:" pass
read -t 30 -p "input user number:" num
#檢查輸入內容是否爲非空
if [ -n "$name" -a -n "$pass" -a -n "$num" ]
then
#檢查輸入的用戶數量是否爲純數字
chknum=$( echo "$num" | sed 's/[0-9]//g' )
if [ -z "$chknum" ]
then
for (( i=1;i<="$num";i=i+1 ))
do
#添加用戶
/usr/sbin/useradd $name$i &>/dev/null
#添加用戶密碼,passwd 的--stdin參數是非交互輸入,直接傳入密碼,不需要第二次確認
echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
echo "add $i complete"
done
else
echo "the num must be number"
fi
else
echo "input can not be null,please input"
fi
批量刪除用戶實例
cat /etc/passwd | grep /bin/bash | grep -v /root | cut -d “:” -f 1 #找出/etc/passwd下的普通用戶
#!/bin/bash
#批量刪除用戶
user=$(cat /etc/passwd | grep "/bin/bash" | grep -v root | cut -d ":" -f 1)
for i in $user
do
#刪除用戶,-r參數是刪除用戶家目錄
/usr/sbin/userdel -r $i
done
七、while循環和until循環
1.while循環
while循環是不定循環,也稱作條件循環。只要條件判斷式成立,循環就會一直繼續,直到條件判斷式不成立,循環纔會停止。這就和for的固定循環不太一樣了。
while[ 條件判斷式 ]
do
程序
done
2.例子10
#!/bin/bash
#從1加到100
i=1
s=0
while [ $i -le 100 ]
#如果變量i的值小於等於100,則執行循環
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is:$s"
3.until循環
until循環和while循環相反,until循環時只要條件判斷式不成立則進行循環,並執行循環程序,一旦循環條件成立,則終止循環
格式:
until [ 條件判斷式 ]
do
程序
done
4。例子11
#!/bin/bash
#until循環1加到100
sum=0
i=1
until [ $i -gt 100 ]
do
sum=$(( $sum+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $sum"