shell腳本進階

shell腳本進階

一、shell腳本進階之條件測試

   在編寫shell腳本時,經常需要對一些條件進行判斷,可以使用測試命令test輔助完成測試過程。test命令測試特定的表達式是否成立,當條件成立時,命令執行後的返回值爲0,否則爲其他數值。

條件測試的基本格式有:

格式1
test EXPRESSION
格式2
[ EXPRESSION ]
注意:使用方括號時,條件兩邊必須加上空格。

常見的測試類型有

  • 文件測試
  • 數值測試
  • 字符串測試
  • 組合測試
  • 文件測試

文件存在性及類別測試

-a FILE:同-e
-e FILE: 文件存在性測試,存在爲真,否則爲假
-b FILE:是否存在且爲塊設備文件
-c FILE:是否存在且爲字符設備文件
-d FILE:是否存在且爲目錄文件
-f FILE:是否存在且爲普通文件
-h FILE 或 -L FILE:存在且爲符號鏈接文件
-p FILE:是否存在且爲命名管道文件
-S FILE:是否存在且爲套接字文件

文件權限測試

-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
-u FILE:是否存在且擁有suid權限
-g FILE:是否存在且擁有sgid權限
-k FILE:是否存在且擁有sticky權限

文件屬性測試

s FILE: 是否存在且非空
-t fd: fd表示文件描述符是否已經打開且與某終端相關
-N FILE:文件自動上一次被讀取之後是否被修改過
-O FILE:當前有效用戶是否爲文件屬主
-G FILE:當前有效用戶是否爲文件屬組
FILE1 -ef FILE2: FILE1與FILE2是否指向同一個設備上的相同inode
FILE1 -nt FILE2: FILE1是否新於FILE2(mtime)
FILE1 -ot FILE2: FILE1是否舊於FILE2

數值測試

-gt 是否大於
-ge 是否大於等於
-eq 是否等於
-ne 是否不等於
-lt 是否小於
-le 是否小於等於

字符串測試

== 是否等於
是否大於 (ascii 碼)
< 是否小於
!= 是否不等於
=~ 是否能夠被右側的 pattern 所匹配(一般用於[[ ]]中)
-z 檢驗字符串是否爲空,空爲真,非空爲假
-o 與-z 相反

組合測試

第一種方式:
COMMAND1 && COMMAND2 並且
COMMAND1 || COMMAND2 或者
! COMMAND 非
第二種方式:
EXPRESSION1 -a EXPRESSION2 並且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION 非

二、shell腳本進階之條件語句

   Shell有一套自己的流程控制語句,其中包括條件語句、循環語句等。

條件選擇if語句

單分支:

if 判斷條件;then
條件爲真的分支代碼
fi
示例:

#!/bin/bash
use=df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f1
if [ $use -gt 80 ];then
echo "Warning!! /boot disk is full"
fi

雙分支:

if 判斷條件; then
條件爲真的分支代碼
else
條件爲假的分支代碼
fi

示例:

if ping -c1 -W2 station1 &> /dev/null; then
echo 'Station1 is UP'
else
echo 'Station1 is unexpectedly DOWN!'
exit 1
fi

多分支:

if 判斷條件1; then
條件爲真的分支代碼
elif 判斷條件2; then
條件爲真的分支代碼
elif 判斷條件3; then
條件爲真的分支代碼
else
以上條件都爲假的分支代碼
fi

示例:

#!/bin/sh
scores=40
if [[ $scores -gt 90 ]]; then
echo "very good!"
elif [[ $scores -gt 80 ]]; then
echo "good!"
elif [[ $scores -gt 60 ]]; then
echo "pass!"
else
echo "no pass!"
fi

條件判斷case語句

case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默認分支
;;
esac

示例:

#!/bin/sh
case $1 in
start | begin)
echo "start something"
;;
stop | end)
echo "stop something"
;;
*)
echo "Ignorant"
;;
esac

今天的博客就到這裏,下次繼續整理shell腳本的知識。

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