shell編程、查找命令、壓縮文件工具
shell編程
一、條件測試
1、判斷某需求是否滿足,需要由測試機制來實現。
測試命令:
·test Expression
·[ EXPRESSION ]
·[[ EXPRESSION ]]
需要注意的是:EXPRESSION前后必須有空白字符。&&代表and之意。||代表條件性OR
長格式的舉例:
$ test “$A” == “$B” && echo “Strings are equal”
2、數值測試
-gt:是否大于
-ge:是否大于等于
-eq:是否等于
-ne:是否不等于
-lt:是否小于
-le:是否小于等于
3、字符串測試
==:是否等于
>:ascii碼是否大于ascii碼
<:是否小于
!=:是否不等于
=~:左側字符是否能夠被右側的PATTERN所匹配
-z "STRING" :字符串是否為空,空為真,不空為假
-n "STRING" :字符串是否不空,不空為真,空為假
注意:用于字符串比較時的用到的操作數都應該使用引號
4、文件測試
存在性測試
-a FILE :同-e
-e FILE: 文件存在性測試,存在為真,否則為假;
存在性及類別測試
-b FILE :是否存在且為塊設備文件;
-c FILE :是否存在且為字符設備文件;
-d FILE :是否存在且為目錄文件;
-f FILE :是否存在且為普通文件;
-h FILE 或 -L FILE :存在且為符號鏈接文件;
-p FILE :是否存在且為命名管道文件;
-S FILE:是否存在且為套接字文件
5、文件權限測試
文件權限測試:
-r FILE :是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
文件特殊權限測試:
-g FILE :是否存在且擁有sgid 權限;
-u FILE :是否存在且擁有suid 權限;
-k FILE :是否存在且擁有sticky
6、文件大小測試:
-s FILE: 是否存 在 且非空;
文件是否打開:
-t fd: fd 表示文件描述符是否已經打開且與某終端相關
-N FILE :文件自動上一次被讀取之后是否被修改過
-O FILE :當前有效用戶是否為文件屬主
-G FILE :當前有效用戶是否為文件屬組
7、 雙目測試:
FILE1 -ef FILE2: FILE1 與FILE2 是否指向同一個設
備上的相同inode
FILE1 -nt FILE2: FILE1 是否新于FILE2; ;
FILE1 -ot FILE2: FILE1 是否舊于FILE2;
8、組合測試條件
第一種方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[ -e FILE ] && [ -r FILE ]
第二種方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必須使用測試命令進行;
9、使用read命令來接收輸入
使用read 來把輸入值分配給一個或多個shell 變量:
-p 指定要顯示的提示
-t TIMEOUT
read 從標準輸入中讀取值,給每個單詞分配一個變量
所有剩余單詞都被分配給最后一個變量
舉例:read -p “please input a number:“ FILE
二、流程控制
1、條件選擇if語句
選擇執行:
注意: :if 語句可 嵌套
單分支
if 判斷條件:then
條件為真的分支代碼
fi
雙分支
if 判斷條件; then
條件為真的分支代碼
else
條件為假的分支代碼
fi
多分支
if CONDITION1 ; then
if-true
elif CONDITION2 ; then
if-ture
elif CONDITION3 ; then
if-ture
…
else
all-false
fi
逐條 件進行判斷,第一次遇為“真”條件時,執行其分支,
而后 結束整個if
舉例:命令行輸入: ]#if [ -r /etc/shadow ];then echo "the file is read "; fi
the file is read
2、條件判斷:case 語句
case 用 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
…
*)
默認分支
;;
esac
case 支持glob 風格的通配符:
*: 任意長度任意字符
?: 任意單個字符
[] :指定范圍內的任意單個字符
a|b: a 或b
文件查找與壓縮
1、locate命令
·查詢系統上預建的文件索引數據庫
/var/lib/mlocate/mlocate.db
·依賴于事先構建的索引;
·索引的構建是在系統較為空閑時自動進行( 周期性任務) ;管理
員手動更新數據庫(updatedb); ;
·索引構建過程需要遍歷整個根文件系統,極消耗資源;
·工作特點:
查找速度快;
模糊查找;
非實時查找
搜索的是文件的全路徑,不僅僅是文件名
可能只搜索用戶具備讀取和執行權限的目錄
locate的使用
locate KEYWORD
有用的選項
? -i 執行區分大小寫的搜索
? -n X 只列舉前X 個匹配項目
locate foo
? 搜索名稱或路徑中帶有“foo ”的文件
locate -r ‘\.foo$’
? 使用Regex 來搜索以“.foo
2、find命令
(1)find命令概述:實時查找工具,通過遍歷指定路徑完成文件查找;
工作特點:
查找速度略慢
精確查找
實時查找
可能只搜索用戶具備讀取和執行權限的目錄
(2)find語法
find [OPTION]… [ 查找路徑] [ 查找條件] [ 處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、
權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕
(3)查找條件
<1>根據文件名和inode 查找:
-name " 文件名稱" :支持使用glob
*, ?, [], [^]
-iname " 文件名稱" :不區分字母大小寫
-inum n 按inode 號查找
-samefile name 相同inode 號的文件
-links n 鏈接數為n 的文件
舉例:
find / -name “*.txt”記得需要加“”引號
<2>根據屬主、屬組查找:
-user USERNAME :查找屬主為指定用戶(UID) 的文件
-group GRPNAME: 查找屬組為指定組(GID) 的文件
-uid UserID :查找屬主為指定的UID 號的文件
-gid GroupID :查找屬組為指定的GID 號的文件
-nouser :查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
<3> 根據文件類型查找:
-type TYPE:
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s :套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件
<4> 組合條件:
與:-a
或:-o
非:-not, !
德 德· 摩根 定律:
非 非(P 且 且 Q) = (非 非 P) 或 或 (非 非 Q)
非 非(P 或 或 Q) = (非 非 P) 且 且 (非 非 Q)
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
<5> 根據文件大小來查找:
-size [+|-]#UNIT
常用單位:k, M, G
#UNIT: (#-1, #] ,如:6k
-#UNIT :[0,#-1], 如:-6k
+#UNIT :(#, ∞ ), 如:+6k
<6>根據時間戳:
以“天”為單位;
-atime [+|-]#,
#: [#,#+1)
+#: [#+1, ∞ ]
-#: [0,#)
-mtime
-ctime
以“分鐘”為單位:
-amin
-mmin
-cmin
<7> 根據權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配
/MODE :任何一類(u,g,o) 對象的權限中只要能一位匹配
即 可 ,或關系,+ 從centos7 開始淘汰
-MODE :每一類對象都必須同時擁有指定權限,與關系
0 表示不關注
? find -perm 755 會匹配權限模式恰好是755 的文件
? 只要當任意人有寫權限時,find -perm +222 就會匹配
? 只有當每個人都有寫權限時,find -perm -222 才會匹配
? 只有當其它人(other )有寫權限時,find -perm -002才 才
會匹配
<8> 處理動作
-print :默認的處理動作,顯示至屏幕;
-ls :類似于對查找到的文件執行“ls -l” 命令
-delete :刪除查找到的文件;
-fls file :查找到的所有文件的長格式信息保存至指定文件中
-ok COMMAND {} \; 對查找到的每個文件執行由
COMMAND 指定的命令;
對于每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \; 對查找到的每個文件執行由
COMMAND 指定的命令
{}: 用于引用查找到的文件名稱自身
find 傳遞查找到的文件至后面指定的命令時,查找到所有符合
條件的文件一次性傳遞給后面的命令
有些命令不能接受過多參數,此時命令執行可能會失敗,下
面方式可規避此問題
find | xargs COMMAND
壓縮文件工具
一、comperss命令(不常用)
compress [-dfvcVr] [-b maxbits] [file …]
-d: 解壓縮,相當于
-c: 結果輸出至標準輸出, 不刪除原文件
-v: 顯示詳情
uncompress 解壓縮
zcat file.Z >file
二、gizp命令
gzip [OPTION]… FILE …
-d: 解壓縮,相當于gunzip
-c: 將壓縮或解壓縮的結果輸出至標準輸出
-# :1-9 ,指定壓縮比,值越大壓縮比越大
zcat :不顯式解壓縮的前提下查看文本文件內容
實例:
gzip -c messages >messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
三、bizp2命令
bzip2 [OPTION]… FILE …
-k: keep, 保留原文件
-d :解壓縮
-# :1-9 ,壓縮比,默認為6
bzcat :不顯式解壓縮的前提下查看文本文件內容;
四、xz命令
xz [OPTION]… FILE …
-k: keep, 保留原文件;
-d :解壓縮
-# :1-9 ,壓縮比,默認為6; ;
xzcat: 不顯式解壓縮的前提下查看文本文件內容
作業
1 、寫一個腳本/root/bin/createuser.sh ,實現如下功能:
使用一個用戶名做為參數,如果指定參數的用戶存在,就顯
示其存在,否則添加之;顯示添加的用戶的id 號等信息.
答:
2 、寫一個腳本/root/bin/yesorno.sh ,提示用戶輸入yes或 或
no, 并判斷用戶輸入的是yes 還是no, 或是其它信息
答:
3 、寫一個腳本/root/bin/filetype.sh, 判斷用戶輸入文件路
徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)
答:
4 、寫一個腳本/root/bin/checkint.sh, 判斷用戶輸入的參數
是否為正整數
答:判斷一個數是否為正整數,我想到了使用grep去匹配數字
5、查找/var 目錄下屬主為root ,且屬組為mail 的所有文件
答:
6 、查找/var 目錄下不屬于root 、lp 、gdm 的所有文件
答:
7 、查找/var 目錄下最近一周內其內容修改過,同時屬主不為
root ,也不是postfix 的文件。
答: 8 、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪
問過的文件。
答:
9 、查找/etc 目錄下大于1M 且類型為普通文件的所有文件
答:
10 、查找/etc 目錄下所有用戶都沒有寫權限的文件
答:
11、查找/etc 目錄下至少有一類用戶沒有執行權限的文件
答:全部都有執行權限,進行取反即可。
12、查找/etc/init.d/目錄下,所有用戶都有執行權限,且其它
用戶有寫權限的文件
答:注意/etc/init.d后需要加/。
# find /etc/init.d/ -perm -111 -a -perm /002 -ls
# find /etc/init.d/ -perm -113 -ls
原創文章,作者:178babyhanggege,如若轉載,請注明出處:http://www.www58058.com/35800
文章寫的很用心,對當天所學的東西有了一個完整的人是和梳理,不過linux學習最重要是實際操作,希望下來多加練習,掌握當天所學的東西。