條件判斷之if、case語句和文件查找命令

一、腳本編程

1、if語句怎樣用

人生面臨許多選擇,在編程世界裏同樣也有許多選擇。同其他編程語言一樣,當我們想寫一個功能健壯的腳本時,通過條件判斷來選擇適合的操作尤爲重要。在我們執行某些重要的操作之前,判斷當前環境是否適合執行這一操作是非常重要的。我們可以用&&和||來做簡單的判斷,不過shell有更用的語句。shell有兩種常見的條件選擇語句if和case。我們先來看一下if該怎樣用吧。

if語句的單分支語法:

if 條件判斷 ;then;執行命令;fi

[root@localhost ~]# type if
if is a shell keyword
[root@localhost ~]# type fi
fi is a shell keyword
[root@localhost ~]# type then
then is a shell keyword

首先可以看到,if、fi和then在shell中都是關鍵詞

雙分支:

if 條件判斷 ;then
    執行代碼
else
    執行代碼
fi
多分支:
if 條件判斷;then
    執行代碼
elif 條件判斷;then
    執行代碼
elif 條件判斷;then
    執行代碼
.........
else
    執行代碼
fi

if語句逐一判斷,當遇到條件爲真時則執行該條件下的分支命令,而後結束整個if語句

當然,if語句本身很簡單的,但使用if語句必須要熟練掌握條件測試語句,並且當if語句和其他語句嵌套使用時必須要理清邏輯關係否則將很難排錯。


2、shell的case語句

當我們要判斷的條件是連續的邏輯關係時可以很方便的使用if來操作,但是如果是離散關係時,if語句將會顯得臃腫而繁瑣,這時使用case語句將非常高效。在Linux中特別是寫一些服務的啓動腳本時將會遇到很多的case語句,掌握case語句是做運維,至少是腳本開發要掌握的一個基本知識。

和if語句不同,case語句的邏輯關係更加清晰

case 變量引用 in
pat1)
    分支1
    ;;
pat2)
    分支2
    ;;
.........
*)
    最後的分支
    ;;
esac

case支持通配符,如*,?,[],|等

注意最後要寫esac,將case倒轉和if相同,如果不寫將報錯


二、文件查找

1、loacte通過名字查找文件

locate通過updatedb庫來查找文件,默認使用包含通配符的pattern,如果沒用通配符默認匹配全路徑包括路徑名。如果剛創建的文件沒有同步到數據庫中locate命令將無法查找。

locate默認的查找庫是/var/lib/mlocate/mlocate.db,系統設置默認計劃執行數據庫的同步任務,當整個文件系統很複雜且變化很大時時同步任務將會耗費大量的系統資源。

locate的特點:

  • 查找速度塊

  • 模糊查找

  • 非實時查找

  • 只搜索用戶具備讀取和執行權限的目錄

整個locate工作其實是由四部分組成的:
/usr/bin/updatedb       主要用來更新數據庫,這個工作是通過crontab自動完成的。
/usr/bin/locate(mlocate)   是作來完成查詢功能的程序。
/etc/updatedb.conff   是配置要查詢哪些目錄、哪些文件。
/var/lib/mlocate/mlocate.db   存放文件信息的文件。


locate命令的選項:

-A:--all 後面有多個模式,只打印符合所有匹配模式的文件

-b:--basename 只匹配基名符合pattern的文件,和--wholename的用法相反

-c:--count 只顯示匹配到的文件的數量,不顯示匹配到的文件

-d:--database 使用指定的搜索數據庫替換默認的,-表示從標準輸入讀取庫

-e:--existing 只顯示當locate運行時已存在的文件

-L:--follow 當文件存在時跟隨蔓延的符號鏈接(默認) 

-i:--ignore-case 匹配模式時忽略大小寫區別

-l:--limit -n LIMIT限制爲LIMIT項目的輸出(或計數)   

-m:--mmap 忽略向後兼容性

-P:--nofollow, -H當檢查文件時不跟隨蔓延的符號鏈接  

-0:--null 輸出時以NUL分隔項目 

-S:--statistics 不搜索項目,顯示有關每個已用數據庫的統計信息

-q:--quiet 不報告關於讀取數據庫的錯誤消息

-r:--regexp REGEXP搜索基本正則表達式REGEXP來代替glob模式  

--regex 模式是擴展正則表達式

-s:--stdio 忽略向後兼容性

-w:--wholename 匹配完整路徑名(默認) 


二、find實時查找工具,通過遍歷指定路徑完成文件查找

查找特點:

查找速度慢

精確查找

實時查找

只查找用戶有相應權限的目錄

語法:find [options] [查找起始路徑] [查找條件] [處理動作]

查找條件:選項+測試條件

條件測試:結果通常是布爾型

組合測試:

與:-a 或:-o 非:-no或!

德·摩根定律:

!(-pat1 -o -pat2) = ! -pat1 -a ! -pat2

wKiom1ev5jXx6JJTAABWjkFntsQ618.jpg

!(pat1 -a pat2) = ! pat1 -o ! pat2

wKioL1ev5yXAGXvZAAAsN0YEUds551.jpg

  • 根據文件名判斷

-name pattern,通配符匹配,精確匹配,pattern要加引號

-iname 不區分大小寫

-inum 查找所有分區某個inode號的所有文件

-samefile 查找inode相同的文件

[root@localhost ~]# find / -samefile test.sh
find: ‘/proc/3732/task/3732/fd/7’: No such file or directory
find: ‘/proc/3732/task/3732/fdinfo/7’: No such file or directory
find: ‘/proc/3732/fd/7’: No such file or directory
find: ‘/proc/3732/fdinfo/7’: No such file or directory
/root/test.sh
/opt/t

注意:find只找磁盤文件,對於/proc裏的內存文件無法查找

-links n 鏈接數爲n的文件或目錄

-regex 匹配整個路徑而不是基名,所以正則模式要把完整的目錄路徑也包括進去。find默認使用的是emacs正則,如果要換其他的正則可以用-regextype選項來指定

  • 根據文件的從屬關係

-user username 查找某個用戶的所有文件

-group groupname 查找某個組所有的文件

-uid 根據uid來查找

-gid 根據gid來查找

-nouser 查找沒有屬主的文件

-nogroup 查找沒有屬組的文件

注意:Linux使用id來標識文件的從屬關係

  • 根據文件類型查找

-type 後面接文件的類型,注意文件和目錄包括符號鏈接,所以判斷時最好將符號連接寫在前面

  • 根據文件大小查找:

-size [+|-]#UNIT 常用單位:K、M、G默認爲字節

注意:只有字節爲單位才能夠精確超找,如果以其他單位找,在兩個相鄰整數間的數一律看作大的那一個

#UNIT:(#-1,#]

-#UNIT:[0,#-1]

+#UNIT:(#,)

wKiom1ev63KweoChAAAacAGs0Lg734.jpg

  • 根據時間查找

根據時間查找有兩個單位,且他們的計算方法是不一樣的

1、以天爲單位

-atime [+|-]#

-mtime

-ctime

wKiom1ev7jrSBiksAAAivKTvov0731.jpg

2、以分鐘爲單位

-amin [+|-]#

-mmin

-cmin

wKiom1ev8krBxjWsAAAkAg-kGyw118.jpg

當#爲1時,mmin 1和mmin -1的區域將會重疊

  • 根據權限查找:

-perm:[/|-]mode 數字

mode 精確匹配權限

/mode 任何一類用戶的任何一位權限符合條件即可

-mode 所有用戶每一位權限都必須符合

注意:/000和-000一樣,0表示不關心權限

  • 處理動作

-print:輸出到stdout,默認打印

-ls:顯示文件的長格式信息

-delete 刪除查找的文件

-fls /PATH 將查找的文件保存到指定文件

-ok command {} \;將查找的文件執行command命令,{}代表查找到的文件,但每操作一個文件都會有提示。

-exec command {} \;沒有提示,其中\;代表結束

注意:-ok和-exec是將find找到的所有文件一個一個的處理,即給每一個文件執行一次命令,我們知道一個命令就是一個進程,當找到的文件有很多時,將會消耗較多的資源並導致效率的下降,爲了避免這個問題可以用xargs

find 查找條件 |xargs command

xargs是將find找到的所有結果當成一個參數傳給command,即command只執行了一次,效率更高。但是 由於將所有的結果用一個空格隔開然後變成一個變量的模式,當遇到查找到的文件名中有空格將會出錯

  • 排除目錄:

-path PATH -prune 組合排除,並且的關係

[root@localhost ~]# find /etc -path '/etc/sane.d' -prune -o -name "*.conf"
/etc/resolv.conf
/etc/fonts/conf.d/65-0-lohit-marathi.conf
/etc/fonts/conf.d/59-liberation-mono.conf
/etc/fonts/conf.d/67-lohit-malayalam.conf
/etc/fonts/conf.d/59-liberation-sans.conf
/etc/fonts/conf.d/65-0-lohit-punjabi.conf
/etc/fonts/conf.d/10-scale-bitmap-fonts.conf
/etc/fonts/conf.d/60-open-sans.conf
/etc/fonts/conf.d/20-unhint-small-vera.conf
/etc/fonts/conf.d/65-0-madan.conf
/etc/fonts/conf.d/25-no-bitmap-fedora.conf
/etc/fonts/conf.d/66-ucs-miscfixed.conf
......


練習

1、查找/var目錄下屬主爲root,且屬組爲mail的所有文件

[root@localhost ~]# find /var/ -user root -group mail -ls
201327104    0 drwxrwxr-x   2 root     mail           50 Aug 14 10:37 /var/spool/mail
206330921    8 -rw-------   1 root     mail         4219 Aug 14 10:37 /var/spool/mail/root

2、查找/var目錄下不屬於root、lp、gdm的所有文件

[root@localhost ~]# find /var/ ! \( -user root -o -user lp -o -user gdm \) -ls
135969642    0 drwxr-xr-x   3 colord   colord         50 Aug  2 21:22 /var/lib/colord
203103112    0 drwxr-xr-x   2 colord   colord          6 Nov 20  2015 /var/lib/colord/icc
139609985    4 -rw-r--r--   1 colord   colord       4096 Aug  2 21:22 /var/lib/colord/mapping.db
139609986    8 -rw-r--r--   1 colord   colord       7168 Aug  2 21:22 /var/lib/colord/storage.db
68217670    0 drwx------   2 tss      tss             6 Nov 21  2015 /var/lib/tpm
135970004    0 drwxr-xr-x   2 unbound  unbound        21 Aug  3 06:10 /var/lib/unbound
135970006    4 -rw-r--r--   1 unbound  unbound       409 Nov 20  2015 /var/lib/unbound/root.key
204613039    0 drwxr-x--x   7 qemu     qemu           69 Aug  2 21:18 /var/lib/libvirt/qemu
 10634    0 drwxr-xr-x   2 qemu     qemu            6 Aug  2 21:18 /var/lib/libvirt/qemu/save
70295736    0 drwxr-xr-x   2 qemu     qemu            6 Aug  2 21:18 /var/lib/libvirt/qemu/snapshot
139609974    0 drwxr-xr-x   2 qemu     qemu            6 Aug  2 21:18 /var/lib/libvirt/qemu/dump
206290799    0 drwxr-xr-x   3 qemu     qemu           19 Aug  2 21:18 /var/lib/libvirt/qemu/channel
 10635    0 drwxr-xr-x   2 qemu     qemu            6 Aug  2 21:18 /var/lib/libvirt/qemu/channel/target
.........

3、查找/var目錄下最近一週內其內容修改過,同時屬主不爲root,也不是postfix的文件

[root@localhost ~]# find /var/ -mtime -7 -not \( -user root -o -user postfix \) -ls
67136164    4 -rw-------   1 setroubleshoot setroubleshoot     3286 Aug 10 22:34 /var/lib/setroubleshoot/setroubleshoot_database.xml
1485002    0 drwxrwx--T   6 gdm      gdm            79 Aug 10 22:33 /var/lib/gdm
136239626    4 -rw-r--r--   1 gdm      gdm            43 Aug 10 22:33 /var/lib/gdm/.pulse/9987c5b50f134797b202165f43b10443-default-sink
136239627    4 -rw-r--r--   1 gdm      gdm            42 Aug 10 22:33 /var/lib/gdm/.pulse/9987c5b50f134797b202165f43b10443-default-source
 10663    4 -rw-------   1 gdm      gdm           930 Aug 10 22:33 /var/lib/gdm/.ICEauthority
.........

4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件

[root@localhost ~]# find / -atime -7 \( -nouser -o -nogroup \) -ls
find: ‘/proc/2924/task/2924/fd/6’: No such file or directory
find: ‘/proc/2924/task/2924/fdinfo/6’: No such file or directory
find: ‘/proc/2924/fd/6’: No such file or directory
find: ‘/proc/2924/fdinfo/6’: No such file or directory
139610001    0 drwx------   2 1000     1000            6 Aug  2 21:26 /tmp/.esd-1000
 10683    0 drwxr-xr-x   2 1000     1000            6 Aug  2 21:26 /tmp/hsperfdata_nieda
 10680    0 drwx------   2 1000     1000            6 Aug  2 21:26 /tmp/tracker-extract-files.1000
 10648    4 drwx------  14 1000     1000         4096 Aug  2 21:26 /home/nieda
67136350    0 drwxr-xr-x   4 1000     1000           37 Aug  3 06:08 /home/nieda/.mozilla
139173477    0 drwxr-xr-x   2 1000     1000            6 Jun 10  2014 /home/nieda/.mozilla/extensions
203103518    0 drwxr-xr-x   2 1000     1000  
.........

5、查找/etc目錄下大於1M且類型爲普通文件的所有文件

[root@localhost ~]# find /etc/ -size -1M -type f |xargs ls -lh
-rw-r--r--. 1 root root 0 Sep 10  2011 /etc/akonadi/mysql-local.conf
-rw-------. 1 root root 0 Jul 27  2015 /etc/cron.deny
-rw-------. 1 root root 0 Aug  3 06:08 /etc/crypttab
-rw-------. 1 root lp   0 Nov 20  2015 /etc/cups/classes.conf
-rw-r--r--. 1 root lp   0 Nov 20  2015 /etc/cups/client.conf
-rw-r--r--. 1 root lp   0 Nov 20  2015 /etc/cups/lpoptions
-rw-------. 1 root lp   0 Nov 20  2015 /etc/cups/printers.conf
-rw-r--r--. 1 root root 0 Aug 12  2015 /etc/environment
-rw-r--r--. 1 root root 0 Jun  7  2013 /etc/exports
-rw-r--r--. 1 root root 0 Mar  6  2015 /etc/ghostscript/9.07/cidfmap.local
-rw-r--r--. 1 root root 0 Mar  6  2015 /etc/ghostscript/9.07/CIDFnmap.local
-rw-r--r--. 1 root root 0 Mar  6  2015 /etc/ghostscript/9.07/Fontmap.local
-rw-r--r--. 1 root root 0 Jun  7  2013 /etc/motd
-rw-------. 1 root root 0 Aug  3 06:10 /etc/.pwd.lock
-rw-r--r--. 1 root root 0 Nov 20  2015 /etc/qemu-kvm/target-x86_64.conf
-rw-r--r--. 1 root root 0 Nov 20  2015 /etc/security/console.apps/xserver
-rw-------. 1 root root 0 Aug 18  2015 /etc/security/opasswd
-rw-r--r--. 1 root root 0 Nov 21  2015 /etc/selinux/targeted/contexts/files/file_contexts.local
-rw-r--r--. 1 root root 0 Nov 21  2015 /etc/selinux/targeted/contexts/files/file_contexts.subs
-rw-------. 1 root root 0 Nov 21  2015 /etc/selinux/targeted/modules/active/netfilter_contexts
-rw-r--r--. 1 root root 0 Nov 21  2015 /etc/selinux/targeted/modules/semanage.read.LOCK
-rw-r--r--. 1 root root 0 Nov 21  2015 /etc/selinux/targeted/modules/semanage.trans.LOCK
-rw-r--r--. 1 root root 0 Jun 10  2014 /etc/sysconfig/run-parts
-rw-r--r--. 1 root root 0 Jun 10  2014 /etc/wvdial.conf

6、查找/etc目錄下所有用戶都沒有寫權限的文件

[root@localhost ~]# find /etc/ -not -perm /222 -ls
134499699  196 -r--r--r--   1 root     root       198453 Aug  3 06:09 /etc/pki/ca-trust/extracted/java/cacerts
201850195  352 -r--r--r--   1 root     root       359773 Aug  3 06:09 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
330861  264 -r--r--r--   1 root     root       266702 Aug  3 06:09 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
330862  216 -r--r--r--   1 root     root       217510 Aug  3 06:09 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem
330863  208 -r--r--r--   1 root     root       211626 Aug  3 06:09 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
625260    4 -r--------   1 root     root           45 Aug  3 06:09 /etc/openldap/certs/password
136242234    4 ----------   1 root     root          785 Aug 16  2016 /etc/gshadow
134317908    4 ----------   1 root     root          795 Aug 13 18:26 /etc/gshadow-
134317916    4 ----------   1 root     root         1303 Aug 16  2016 /etc/shadow-
136242221    4 ----------   1 root     root         1183 Aug 16  2016 /etc/shadow
1058222    4 -r--r--r--   1 root     root          531 Sep  6  2015 /etc/lvm/profile/cache-mq.profile
1058223    4 -r--r--r--   1 root     root          338 Sep  6  2015 /etc/lvm/profile/cache-smq.profile
1058224    4 -r--r--r--   1 root     root         2249 Nov 21  2015 /etc/lvm/profile/command_profile_template.profile
1058225    4 -r--r--r--   1 root     root          828 Nov 21  2015 /etc/lvm/profile/metadata_profile_template.profile
1058226    4 -r--r--r--   1 root     root           76 Sep  6  2015 /etc/lvm/profile/thin-generic.profile
1058227    4 -r--r--r--   1 root     root           80 Sep  6  2015 /etc/lvm/profile/thin-performance.profile
136009869    4 -r--r--r--   1 root     root          460 Nov 20  2015 /etc/dbus-1/system.d/cups.conf
1788506    4 -r--r--r--   1 root     root           63 Nov 20  2015 /etc/ld.so.conf.d/kernel-3.10.0-327.el7.x86_64.conf
139173483 6852 -r--r--r--   1 root     root      7014922 Aug  3 06:18 /etc/udev/hwdb.bin
135840874    4 -r--r--r--   1 root     root           33 Aug  3 06:10 /etc/machine-id
1058267    4 -r--r--r--   1 root     root          146 Nov 20  2015 /etc/pam.d/cups
139259112    8 -r--r-----   1 root     root         4188 Jul  7  2015 /etc/sudoers

7、查找/etc目錄下至少有一類用戶沒有執行權限的文件

[root@localhost etc]# find /etc/ -not -perm -111 -ls

8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件

[root@localhost etc]# find /etc/init.d -perm -113 -ls
134370978    0 lrwxrwxrwx   1 root     root           11 Aug  3 06:08 /etc/init.d -> rc.d/init.d
[root@localhost etc]# ls /etc/init.d/ -l
total 32
-rw-r--r--. 1 root root 13948 Sep 16  2015 functions
-rwxr-xr-x. 1 root root  2989 Sep 16  2015 netconsole
-rwxr-xrwx. 1 root root  6630 Sep 16  2015 network
-rw-r--r--. 1 root root  1160 Nov 20  2015 README
[root@localhost etc]# find /etc/init.d/ -perm -113 -ls
203103221    8 -rwxr-xrwx   1 root     root         6630 Sep 16  2015 /etc/init.d/network

注意:查找目錄下的文件時,在目錄的後面必須要加上/,否則將查看目錄本身



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