Shell基礎(五):條件判斷與流程控制

一、條件判斷

格式:test  [選項]  file    

或者    [(空格)條件判斷式(空格)]         注:不要忘記空格

1、按文件類型進行判斷

選項:-d:判斷文件是否存在,且是目錄文件時爲真

-e:判斷文件是否存在,存在時爲真

-f:判斷文件是否爲真,且爲普通文件時爲真

-b:判斷文件是否存在,且爲塊設備文件時爲真

-c:判斷文件是否存在,且爲字符設備時爲真

-L:判斷文件是否存在,且爲符號鏈接文件時爲真

-p:判斷文件是否存在,且爲管道文件時爲真

-s:判斷文件是否爲非空,非空時爲真

-S:判斷套接字文件是否存在,存在時爲真

例:[-e  filename]   執行命令後echo  $?查看若值爲0說明執行正確,文件存在

[-e  filename]  &&  echo  yes  ||  echo no

2、按文件權限進行判斷

-r:擁有讀權限時爲真

-w:擁有寫權限時爲真

-x:擁有執行權限時爲真

-u:  有SUID權限時爲真

-g:有SGID權限時爲真

-k:有SBit權限時爲真

3、兩個文件間比較

文件1  -nt  文件2           判斷文件1是否比文件2新,若新則爲真

文件1  -ot  文件2           判斷文件1是否比文件2舊,若舊則爲真

文件1  -ef  文件2           判斷文件1iNode節點號是否和文件2相同,(可用此判斷硬鏈接)

4、兩個整數間比較

整數1  -eq  整數2          判斷是否相等

整數1  -ne  整數2          判斷是否不相等

整數1  -gt  整數2           判斷是否大於

整數1  -ge  整數2           判斷是否大於等於

整數1  -lt  整數2             判斷是否小於

整數1  -le  整數2            判斷是否小於等於

5、字符串的判斷

-z  字符串                       判斷字符串是否爲空

-n  字符串                       判斷字符串是否爲非空

字符串1  ==  字符串2      判斷是否相等

字符串1  !=   字符串2       判斷是否不等

例:[  -z  "$name"]  $$  echo yes  ||  echo no

6、多重條件判斷

判斷1  -a  判斷2               邏輯與,1和2都爲真最終結果才爲真

判斷1  -o  判斷2               邏輯或,1和2有一個爲真結果就爲真

!判斷                              邏輯非

二、流程控制

1、單分支if語句

if  [ 條件判斷式 ];then

程序

fi

或者:if  [ 條件判斷式 ]

then

程序

fi

例程:判斷當前用戶是root

#!/bin/bash
test=$(env | grep USER | cut -d ":" -f2)
if ["$test" == "root"]
     then
           echo current user is root
fi
例程:判斷分區使用率

#!/bin/bash
test=$(df -h | grep /dev/sda5 | awk '{print $5}' | cut -d "%" -f1)
if [ $test -ge 80 ]
    then
          echo "sda5 is full"
fi

2、雙分支if語句

if [ 條件判斷語句 ]

then

程序

else

程序

fi
例程:判斷手動輸入的是不是目錄文件

#! /bin/bash


read -t 30 -p "please input num1:" num1
read -t 30 -p "please input num2:" num2


read -t 30 -p "please input operate:" 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
                                        ans=$(($num1 + $num2))
                                elif [ "$ope" == '-' ]
                                        then
                                        ans=$(($num1 - $num2))
                                elif [ "$ope" == '*' ]
                                        then
                                        ans=$(($num1 * $num2))
                                elif [ "$ope" == '/' ]
                                        then
                                        ans=$(($num1 / $num2))
                                        else
                                        echo "error: input operate wrong"
                                        exit 9
                                fi
                        else
                                echo "error: input is not a num"
                                exit 10
                fi
        else
                echo "error: input num is null"
                exit 11


fi
echo "$num1" "$ope" "$num2" = $ans"

3、多分支case語句

case $變量名 in

“值1”)

若等於值1,程序

;;

“值2”)

若等於值2,程序

;;

*)

若都不等於,程序

;;

esac

4、for循環

語法一:

for   變量名   in  值1  值2  值3  ...

do

程序

done

語法二:

for  ((初始值;循環控制條件;變量變化))

do

程序

done

例程:批量解壓縮文件

#!/bin/bash
ls  *.tar.gz > tar.log
for i in $(cat tar.log)
    do
        tar -zxf $i &> /dev/null
done
rm -rf tar.log 
例程:1加到100
#!/bin/bash
s=0
for ((i=1;i<=100;i=i+1))
    do
         s=$(($s+$i))
done
echo "$s"

例程:批量添加用戶

#!/bin/bash
read -t 30 -p "please input user name" name
read -t 30 -p "please input the numbers of users" num
read -t 30 -p "please input user passwd" pass
if [ -n "$name" -a -n "$num" -a -n "$pass" ]
    then
          y=$( echo $num | sed 's/[0-9]'//g )
          if [ -z $y ]
              then
               for ((i=1;i<=$num;i=i+1))
                     do
                         /user/sbin/useradd  $name$i $>/dev/null
                         echo $pass | /user/bin/passwd  --stdin  $name$i  $>/dev/null
                done
          fi
fi
例程:批量刪除普通用戶

#!/bin/bash
for i in $(cat /etc/passwd | grep /bin/bash | grep -v root)
    do
        userdel  $i
done
5、while循環

語法:

while  [ 條件判斷式 ]

do
程序

done

6、until循環

語法: 是在條件不成立時執行

until  [ 條件判斷式 ]

do

程序

done

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章