26_Shell語言————if條件判斷之文件測試、短路操做符

1、文件測試vim

文件測試大多都是單目測試,其用法相對簡單,其格式爲:bash

操做符:文件路徑ssh

能夠用來測試的選項有:ide

-f:測試其是否爲普通文件,即便用ls -l命令查看時,文件類型顯示爲 - 的文件;post

-d:測試其是否爲目錄文件,即便用ls -l命令查看時,文件類型顯示爲 d的文件;測試

-e:測試文件是否存在,不管是目錄仍是文件,若是存在則爲真,不然爲假;spa

-r:測試文件對當前訪問者來講(非建立者)是否可讀;rest

-w:測試文件對當前訪問者來講(非建立者)是否可寫;ip

-x:測試文件對當前訪問者來講(非建立者)是否可執行;rpc

-s:測試文件是否有大小,若是有大小則爲真,不然爲假;

-l:測試文件是否爲連接文件

 

例如要檢驗/tmp/test10是否不存在,若是不存在就建立之:

[root@localhost~]# vim if_exist.sh

#!/bin/bash
#
if [ ! -e /tmp/test10 ]; then
#測試文件不存在,故對文件存在的狀況取反
        mkdir /tmp/test10
fi

[root@localhost~]# bash -x if_exist.sh

+ '[' '!' -e /tmp/test10 ']'
+ mkdir /tmp/test10

[root@localhost~]# ls /tmp

a.sh  d.sh keyring-bgxXAq  orbit-gdm           pulse-yCmeAwocSW1U   virtual-root.plTHoO  yum.log
b.sh  e.sh keyring-Xi9NCS  orbit-root          test10               virtual-root.q9Sgpu
c.sh  f.sh keyring-xva5ss pulse-uP5T8Y6V6nIN virtual-root.nBhtJw virtual-root.rQ0Eab
#test10這個目錄已經建立了。

 

2、短路操做符

上面測試 /tmp/test10是否存在的例子,其實能夠寫做更簡單的形式:[-e /tmp/test10 ] || mkdir /tmp/test10

這裏的 || 就是短路操做符,意爲或運算,即先測試|| 前面的語句,若是爲真,就不測試 || 後面的語句了;若是|| 前面的語句爲假,則繼續測試 || 後面的語句。

短路操做符主要有如下幾種:

&&: 與運算, 與運算的狀況有:

&& =

&& =

&& =     

&& =

 ||: 或運算,或運算的狀況有:

|| =

|| =

|| =

|| =

注意,與運算具備優先級,即與運算先操做,或運算後操做

 

若是某個用戶不存在,就建立該用戶的例子,也能夠用這種方式寫:

id $UserName&> /dev/null || useradd $UserName

 

如今把這個例子複雜化:使用與運算和或運算的形式,測試一個用戶是否存在,若是存在就顯示其以存在,不然就建立這個用戶

[root@localhosttutor]# vim if_user6.sh

#1/bin/bash
 
UserName=$1
! id $UserName&> /dev/null && useradd $UserName || echo "$UserNameexists."
#若是用戶存在,則 && 前的部分爲假,那麼須要判斷&& 後面的部分;
#若是用戶不存在,則 &&前面的部分爲真,那麼不須要判斷&& 後面的部分
#對於 || 運算來講,若是用戶不存在,則前半部分都爲假,則須要運行 || 後面的部分


[root@localhosttutor]# bash -x if_user6.sh root

+UserName=root
+ id root
+ echo 'rootexists.'
root exists.

[root@localhosttutor]# bash -x if_user6.sh roott

+ UserName=roott
+ id roott
+ useraddroott

 

3、文件測試及短路運算綜合實例

1. 給定一個路徑,判斷若是爲普通文件,顯示之;若是爲目錄,顯示之;不然顯示爲沒法識別

 

[root@localhost tutor]# vim if_file.sh

#!/bin/bash
#
 
if [ ! -e $1]; then
        echo "No such file."
        exit 7
fi
# 先判斷文件是否存在
if [ -f $1 ];then
        echo "Common file."
elif [ -d $1]; then
        echo "Directory."
else
        echo "Unknown file."
fi

 

[root@localhost tutor]# bash if_file.sh /tmp

Directory.

[root@localhost tutor]# bash if_file.sh /etc

Directory.

[root@localhost tutor]# bash if_file.sh /etc/fstab

Common file.

[root@localhost tutor]# bash if_file.sh /etc/fstabb

No such file.

[root@localhost tutor]# bash if_file.sh /dev/sda

Unknown file.

 

2. 寫一個腳本,判斷/var/log目錄中全部文件的類型

[root@localhost tutor]# vim file_type.sh

#!/bin/bash
#
 
for File in/var/log/*; do
        if [ -f $File ]; then
                echo "$File: Commonfile."
        elif [ -d $File ]; then
                echo "$File:Directory."
        else
                echo "$File: Unknownfile."
        fi
done

[root@localhost tutor]# bash file_type.sh

/var/log/anaconda.yum.log:Common file.
/var/log/audit:Directory.
/var/log/boot.log:Common file.
/var/log/ConsoleKit:Directory.

 

3. 寫一個腳本:能夠接受一個參數,其使用形式以下:

          script.sh {start|stop|restart|status}

若是參數爲start,建立空文件/var/lock/subsys/script,並顯示「Starting scriptsuccessfully.」;

若是參數爲stop,則刪除文件/var/lock/subsys/script,並顯示「Stop script finished.」;

若是參數爲restart,則刪除文件/var/lock/subsys/script後從新建立,並顯示「Restarting scriptsuccessfully.」;

若是參數爲status,那麼:

          若是/var/lock/subsys/script文件存在,則顯示爲「script is running.

          不然,則顯示爲「script is stopped.

其它任何參數:則顯示「script.sh{start|stop|restart|status}

 

這裏稍微補充一下,$0爲腳本自身的名稱,可是引用$0時,會引用全路徑及名稱,故若是隻想引用腳本自己的名稱,可使用basename $0

[root@localhost tutor]# vim service.sh

——————————————如下爲腳本內容——————————————————

#!/bin/bash
#
 
SvcName=`basename$0`
 # 使用basename取該腳本的基名
LockFile="/var/lock/subsys/$SvcName"
 # 提供一個鎖文件的路徑
 
if [ $# -lt 1]; then
# 判斷參數個數是否少於1,是則給用戶提示信息,並退出腳本
        echo "Usage: $SvcName {start |stop | restart | status}"
        exit 3
fi
 
if [ $1 =='start' ]; then
 
        if [ -e $LockFile ]; then
# 先判斷該文件是否存在,若是存在,則不建立
                echo "$SvcName isrunning."
        else
                touch $LockFile &>/dev/null
# 若是參數爲start,且文件不存在,則建立該文件
                echo "Starting $SvcNamesuccessfully."
        fi
             
elif [ $1 =='stop' ]; then
 
        if [ -e $LockFile ]; then
# 若是傳遞的參數是stop,則先判斷文件是否存在,若是存在就刪除該文件
                rm -f $LockFile &>/dev/null
                echo "Stopping $SvcNamefinished."
        else
# 若是文件不存在,則無需刪除,給出提示信息便可
                echo "$SvcName is stoppedyet."
        fi
       
elif [ $1 =='restart' ]; then
        rm -f $LockFile &> /dev/null
        touch $LockFile &> /dev/null
# 若是參數爲restart,則先刪除該文件,再建立之
        echo "Restarting $SvcNamesuccessfully."
elif [ $1 =='status' ]; then
# 若是參數爲status,那麼須要用到嵌套語句,考慮文件是否存在
        if [ -e $LockFile ]; then
                echo "$SvcName isrunning."
        else
                echo "$SvcName isstopped."
        fi
else
        echo "Usage: $SvcName {start |stop | restart | status}"
        exit 4
# 若是輸入的參數不是這4箇中的一個,給用戶提示信息,並退出,且錯誤編號與無參數的狀況不一樣
fi

 

——————————————下面來測試該腳本——————————————————

 

[root@localhost tutor]# chmod +x service.sh

[root@localhost tutor]# ./service.sh

Usage:service.sh {start | stop | restart | status}

[root@localhost tutor]# echo $?

3

[root@localhost tutor]# ./service.sh start

Starting service.sh successfully.

[root@localhost tutor]# ls /var/lock/subsys

abrt-ccpp  atd    blk-availability  cups       local         network         pcscd    rpc.statd  sshd
abrtd      auditd certmonger        haldaemon  lvm2-monitor NetworkManager  postfix  rsyslog
acpid      autofs crond             ip6tables  messagebus   openct          rpcbind  service.sh
# 能夠看到/var/lock/subsys下成功建立了service.sh文件


[root@localhost tutor]# ./service.sh stop

Stopping service.sh finished.

[root@localhost tutor]# ls /var/lock/subsys

abrt-ccpp  atd    blk-availability  cups       local         network         pcscd    rpc.statd
abrtd      auditd certmonger        haldaemon  lvm2-monitor NetworkManager  postfix  rsyslog
acpid      autofs crond             ip6tables  messagebus   openct          rpcbind  sshd
# 傳遞的參數爲stop,則強行刪除了 service.sh文件


[root@localhost tutor]# ./service.sh restart

Restarting service.sh successfully.

[root@localhost tutor]# ls /var/lock/subsys

abrt-ccpp  atd    blk-availability  cups       local         network         pcscd    rpc.statd  sshd
abrtd      auditd certmonger        haldaemon  lvm2-monitor NetworkManager  postfix  rsyslog
acpid      autofs crond             ip6tables messagebus    openct          rpcbind  service.sh
# 傳遞的參數爲restart,強行刪除了 service.sh文件後又建立了一遍


[root@localhost tutor]# ./service.sh status

service.sh isrunning.
# 傳遞的參數爲status,則顯示當前文件存在與否


[root@localhost tutor]# ./service.sh stop

Stopping service.shfinished.

[root@localhost tutor]# ./service.sh status

service.sh isstopped.

[root@localhost tutor]# ./service.sh stat

Usage:service.sh {start | stop | restart | status}
# 傳遞錯誤參數,給予提示信息後退出


[root@localhost tutor]# ./service.sh start

Startingservice.sh successfully.

[root@localhost tutor]# ./service.sh start

service.sh isrunning.
# 文件已經存在了


[root@localhost tutor]# ./service.sh stop

Stoppingservice.sh finished.

[root@localhost tutor]# ./service.sh stop

service.sh isstopped yet.
# 文件不存在


上述腳本是紅帽系統遵循SysV風格啓動服務時的經常使用啓動格式

相關文章
相關標籤/搜索