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風格啓動服務時的經常使用啓動格式。