shell中的條件判斷與控制流程

條件判斷

1.按照文件類型進行判斷

測試選項

作用

-b 文件

判斷該文件是否存在,並且是否爲塊設備文件(是塊設備文件則爲真)

-c 文件

判斷文件是否存在,並且是否爲字符設備文件(是字符設備文件爲真)

-d 文件

判斷文件是否存在,並且是否爲目錄文件(是目錄則爲真)

-e 文件

判斷文件是否存在(存在爲真)

-f 文件

判斷文件是否存在,並且是否爲普通文件(是普通文件則爲真)

-L 文件

判斷文件是否存在,並且是否爲符號鏈接文件(是符號鏈接文件爲真)

-p 文件

判斷文件是否存在,並且是否爲管道文件(是管道文件則爲真)

-s 文件

判斷文件是否存在,並且是否爲空(非空爲真)

-S 文件

判斷文件是否存在,且是否爲套接字文件(是套接字文件爲真)

判斷式有兩種格式(通常使用後一種)

test -e /etc/profile

[ -e /etc/profile ](中括號和條件判斷式之間一定要有空格!)


例如,執行:

[ -e /etc/profile ] && echo yes || echo no

執行結果爲 yes


2.按文件權限判斷

測試選項

作用

-r 文件

文件存在且擁有讀權限爲真

-w 文件

文件存在且有寫權限爲真

-x 文件

文件存在且擁有執行權限爲真

-u 文件

文件存在且擁有SUID權限爲真

-g 文件

文件存在且擁有SGID權限爲真

-k 文件

文件存在且擁有SBIT權限爲真


例如執行:

[ -w /etc/profile ] && echo yes || echo no結果爲yes

這裏要注意:權限測試並不區分是哪一個用戶的權限,只要存在一個用戶有相應的權限即爲真。


3.比較兩個文件

測試選項

作用

文件1 -nt文件2

判斷文件1的修改時間是否比文件2新(新,則爲真)

文件1 -ot文件2

判斷文件1的修改時間是否比文件2舊(舊,則爲真)

文件1 -ef文件2

判斷文件1是否和文件2lnode號一致,可以理解爲判斷兩個文件是否爲同一個文件。這個判斷可用於判斷硬鏈接。


例如,執行:

ln /home/hunan/student.txt /home/hunan/bin/stu.txt

[ /home/hunan/student.txt -ef /home/hunan/bin/stu.txt ] && echoyes || echo no


上述命令先是創建了一個硬鏈接,然後判斷指向的文件是否相同,結果爲:yes


4.比較兩個整數

測試選項

作用

整數1 -eq整數2

整數1等於整數2爲真

整數1 -ne整數2

整數1不等於整數2爲真

整數1 -gt整數2

整數1大於整數2爲真

整數1 -lt整數2

整數1小於整數2爲真

整數1 -ge整數2

整數1大於等於整數2爲真

整數1 -le整數2

整數1小於等於整數2爲真


例如,執行:

$[ 23 -gt 22 ] && echo yes || echo no

yes

$[ 23 -lt 22 ] && echo yes || echo no

no


5.比較兩個字符串


測試選項

作用

-z 字符串

字符串爲空返回真

-n 字符串

字符串非空返回真

字符串1==字符串2

字符串1和字符串2相等返回真

字符串1=字符串2

字符串1和字符串2不相等返回真


例如,執行:

$name=mike

$[ -z $name ] && echo yes || echo no

no

$[ $name == mike ] && echo yes || echo no

yes


6.shell中的與,或,非

測試選項

作用

判斷式1 -a判斷式2

邏輯與

判斷式1 -o判斷式2

邏輯或

! 判斷式

邏輯非


例如,執行:

$aa=11

$[ -n $aa -a "$aa" -gt 22 ] && echo yes || echo no

no

控制流程

1.單分支if條件語句

if [ 條件判斷式 ];then
    程序
fi

或者

if [ 條件判斷式 ]
    then
        程序
fi


注意:

1.要記得以fi結尾/2.條件判斷式和中括號之間必須有空格/3.如果thenif在同一行要以 分隔。


示例1:判斷當前用戶是否爲root用戶。思路:用env輸出所有環境變量,用grep提取出USER變量,用cutUSER=XXX以“=”爲分隔符切分,取切分後的第二個字符串即爲當前用戶名。命令之間以管道連接。

腳本內容:

#!/bin/bash
#提取出用戶名賦值給test變量
test=$(env| grep USER | cut -d "=" -f 2)
if [ $test == "root" ];then
<span style="white-space:pre">	</span>echo "this is root login."
fi

注意:要給腳本執行權限才能執行(chmoda+x *.sh)。


示例2:判斷分區使用率。當根分區使用率大於某一閾值,給出警告。思路:

df -h | grep sda4 | awk '{print $5}'| cut -d "%" -f 1

df -h打印分區信息,我這裏的根分區掛在在sda4,用grep過濾出這一行,用awk打印出第五部分,在用cut切掉%號。即可得到使用率數值。

腳本內容:

#!/bin/bash
#提取出當前根分區的使用率
test=$(df -h | grep sda4 | awk '{print $5}' | cut -d "%" -f 1)
if [ "$test" -gt 30 ];then
    echo "/ is full!"
fi
(這裏爲了體現程序作用,閾值取30%.


2.雙分支if語句

if[條件判斷式 ]
    then
        條件成立時執行語句
    else
        條件不成立時執行語句
fi


示例3:用戶輸入一個路徑,程序判斷是否爲一個目錄。思路:用read命令讀取用戶輸入,用-d判斷是否爲目錄。

腳本內容:

#!/bin/bash
read -t 30 -p "請輸入路徑:" path
if [ -d $path ];then
    echo "is directory!"
else
    echo "not directory!"
fi



示例4:判斷apache服務是否啓動。思路:用psaux列出所有進程,過濾出含有httpd但是不含grep的進程(因爲grephttpd命令也會產生一個含有httpd的進程)

腳本內容:

#!/bin/bash
test=$(ps aux | grep httpd | grep -v grep)
#如果字符串不爲空
if [ -n $test ]
	then
		echo “$(date) httpd is ok” >> /tmp/autostart-acc.log
	else
		echo “$(date) restart httpd !!” >> /tmp/autostart-err.log
		/etc/rc.d/init.d/httpd start
fi


注意:這種方法,腳本名中不能含有httpd


3.多分支if語句

if [ 條件判斷式1 ]
	then
		當條件判斷式1成立,執行語句
elif [ 條件判斷式2 ]
	then
		當條件判斷式2成立,執行語句
             . . . 省略 . . .
else
	當所有條件判斷式都不成立,執行語句
fi

示例5:判斷輸入的文件類型

腳本內容:

#!/bin/bash
#讀入用戶輸入的路徑
read -t 30 -p 請輸入路徑名: path
if [ -z $path ]
	then
		echo 請輸入路徑。
		exit 1
elif [ ! -e $path ]
	then
		echo 您輸入的路徑不存在!
		exit 2
elif [ -f $path ]
	then
		echo 您輸入的是普通文件。
elif [ -d $path ]
	then
		echo 您輸入的是目錄。
else
	echo 您輸入的是其它文件。
fi

4.多分支case語句

case $變量名 in
	“值1”)
		如果變量的值等於值1,則執行程序1
		;;
	“值2”)
		如果變量的值等於值2,則執行程序2
		;;
	. . . 省略其它分支 . . .
	*)
		如果變量的值都不是以上的值,則執行此程序
	;;
esac

注意:每次選擇之後都要加上“雙分號”!除了最後的*其它的值都要被雙引號引起來。


示例6:根據用戶輸入做出不同反應。

 #!/bin/bash
  read -t 30 -p '請輸入你的選擇 yes/no:' cho
  case $cho in
           "yes")
                   echo 你的選擇是yes
                   ;;
           "no")
                   echo 你的選擇是no
                   ;;
          *)
                  echo 你的選擇是其它。
                  ;;
  esac


5.for循環

語法1

for  變量 in 值1 值2 值3...
	do
		程序
	done

示例7:循環打印數字

#!/bin/bash
for i in 1 2 3 4 5
	do
		echo $i
	done

示例8:批量解壓縮

#!/bin/bash
cd /root/test
for i in $(ls *.tar.gz *.gz)
	do
		tar -zxf $i
	done

語法2

for ((初始值; 循環空值條件; 變量變化))
	do
		程序
	done

示例9:計算1+2+...+100

#!/bin/bash
   s=0
   for ((i=1; i<=100; i=i+1))
           do
                   s=$(($s+$i))
           done
   echo $s


6.while循環

while [ 條件判斷式 ]
	do
		程序
	done


示例10:用while循環計算1+2+...+100

#!/bin/bash
   s=0
   i=1
   while [ $i -le 100 ]
           do
                   s=$(($i+$s))
                   i=$(($i+1))
           done
   echo "the sum is:"$s

7.until循環

until循環和while循環相反,until循環時只要條件判斷式不成立則繼續循環,一旦條件判斷式成立則停止循環。

until [ 條件判斷式 ]
	do
		程序
	done


示例11:用until循環計算1+2+...+100

   #!/bin/bash
   s=0
   i=1
   until [ $i -gt 100 ]
           do
                   s=$(($s+$i))
                   i=$(($i+1))
           done
   echo 'the sum is:'$s



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