溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2020-07-04 10:08:53 來源:網(wǎng)絡(luò) 閱讀:1071 作者:nieda_linux 欄目:數(shù)據(jù)庫

一、腳本編程

1、if語句怎樣用

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

if語句的單分支語法:

if 條件判斷 ;then;執(zhí)行命令;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中都是關(guān)鍵詞

雙分支:

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

if語句逐一判斷,當(dāng)遇到條件為真時則執(zhí)行該條件下的分支命令,而后結(jié)束整個if語句

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


2、shell的case語句

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

和if語句不同,case語句的邏輯關(guān)系更加清晰

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

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

注意最后要寫esac,將case倒轉(zhuǎn)和if相同,如果不寫將報錯


二、文件查找

1、loacte通過名字查找文件

locate通過updatedb庫來查找文件,默認(rèn)使用包含通配符的pattern,如果沒用通配符默認(rèn)匹配全路徑包括路徑名。如果剛創(chuàng)建的文件沒有同步到數(shù)據(jù)庫中l(wèi)ocate命令將無法查找。

locate默認(rèn)的查找?guī)焓?var/lib/mlocate/mlocate.db,系統(tǒng)設(shè)置默認(rèn)計劃執(zhí)行數(shù)據(jù)庫的同步任務(wù),當(dāng)整個文件系統(tǒng)很復(fù)雜且變化很大時時同步任務(wù)將會耗費大量的系統(tǒng)資源。

locate的特點:

  • 查找速度塊

  • 模糊查找

  • 非實時查找

  • 只搜索用戶具備讀取和執(zhí)行權(quán)限的目錄

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


locate命令的選項:

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

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

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

-d:--database 使用指定的搜索數(shù)據(jù)庫替換默認(rèn)的,-表示從標(biāo)準(zhǔn)輸入讀取庫

-e:--existing 只顯示當(dāng)locate運行時已存在的文件

-L:--follow 當(dāng)文件存在時跟隨蔓延的符號鏈接(默認(rèn)) 

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

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

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

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

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

-S:--statistics 不搜索項目,顯示有關(guān)每個已用數(shù)據(jù)庫的統(tǒng)計信息

-q:--quiet 不報告關(guān)于讀取數(shù)據(jù)庫的錯誤消息

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

--regex 模式是擴(kuò)展正則表達(dá)式

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

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


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

查找特點:

查找速度慢

精確查找

實時查找

只查找用戶有相應(yīng)權(quán)限的目錄

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

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

條件測試:結(jié)果通常是布爾型

組合測試:

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

德·摩根定律:

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

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

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

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

  • 根據(jù)文件名判斷

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

-iname 不區(qū)分大小寫

-inum 查找所有分區(qū)某個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里的內(nèi)存文件無法查找

-links n 鏈接數(shù)為n的文件或目錄

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

  • 根據(jù)文件的從屬關(guān)系

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

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

-uid 根據(jù)uid來查找

-gid 根據(jù)gid來查找

-nouser 查找沒有屬主的文件

-nogroup 查找沒有屬組的文件

注意:Linux使用id來標(biāo)識文件的從屬關(guān)系

  • 根據(jù)文件類型查找

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

  • 根據(jù)文件大小查找:

-size [+|-]#UNIT 常用單位:K、M、G默認(rèn)為字節(jié)

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

#UNIT:(#-1,#]

-#UNIT:[0,#-1]

+#UNIT:(#,)

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

  • 根據(jù)時間查找

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

1、以天為單位

-atime [+|-]#

-mtime

-ctime

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

2、以分鐘為單位

-amin [+|-]#

-mmin

-cmin

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

當(dāng)#為1時,mmin 1和mmin -1的區(qū)域?qū)丿B

  • 根據(jù)權(quán)限查找:

-perm:[/|-]mode 數(shù)字

mode 精確匹配權(quán)限

/mode 任何一類用戶的任何一位權(quán)限符合條件即可

-mode 所有用戶每一位權(quán)限都必須符合

注意:/000和-000一樣,0表示不關(guān)心權(quán)限

  • 處理動作

-print:輸出到stdout,默認(rèn)打印

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

-delete 刪除查找的文件

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

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

-exec command {} \;沒有提示,其中\(zhòng);代表結(jié)束

注意:-ok和-exec是將find找到的所有文件一個一個的處理,即給每一個文件執(zhí)行一次命令,我們知道一個命令就是一個進(jìn)程,當(dāng)找到的文件有很多時,將會消耗較多的資源并導(dǎo)致效率的下降,為了避免這個問題可以用xargs

find 查找條件 |xargs command

xargs是將find找到的所有結(jié)果當(dāng)成一個參數(shù)傳給command,即command只執(zhí)行了一次,效率更高。但是 由于將所有的結(jié)果用一個空格隔開然后變成一個變量的模式,當(dāng)遇到查找到的文件名中有空格將會出錯

  • 排除目錄:

-path PATH -prune 組合排除,并且的關(guān)系

[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
......


練習(xí)

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目錄下最近一周內(nèi)其內(nèi)容修改過,同時屬主不為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、查找當(dāng)前系統(tǒng)上沒有屬主或?qū)俳M,且最近一個周內(nèi)曾被訪問過的文件

[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目錄下所有用戶都沒有寫權(quán)限的文件

[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目錄下至少有一類用戶沒有執(zhí)行權(quán)限的文件

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

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

[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

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



向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI