Shell攻關之條件判斷與流程控制

                 條件判斷與流程控制

一、條件判斷式語句
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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章