shell腳本編程
read:使用read來把輸入值分配一個或多個shell變量
-p 指定要顯示的提示
-t TIMEOUT
read 從標準輸入中讀取值,給每個單詞分配一個變量
所有剩余單詞被分配給最后一個變量
read -p "Enter a filename :" FILE
條件選擇if語句
注意:if語句可以嵌套
單分支
if 判斷語句;then
條件為真的分支代碼
fi
1 #!/bin/bash 2 num1=10 3 num2=15 4 if [[ $num1 -lt $num2 ]];then 5 echo $num1 6 fi ~
雙分支
if判斷條件;then
條件為真的分支代碼
else
條件為假的分支代碼
fi
1 #!/bin/bash 2 num1=20 3 num2=9 4 if [[ $num1 -lt $num2 ]];then 5 echo $num1 6 else 7 echo $num2 8 fi
多分支
if判斷條件1;then
if-ture
elif 判斷條件2;then
if-ture
elif 判斷條件3;then
if-ture
….
else
all-false
fi
注意:逐條件進行判斷,第一次遇到為"真"條件時,執行其分支.而后結束整個if語句
1 #!/bin/bash 2 file=/etc/issue 3 4 if [[ -d $file ]];then 5 echo "the $file is a diretory" 6 elif [[ -h $file ]];then 7 echo "the $file is a sysmbol file" 8 elif [[ -b $file ]];then 9 echo "the $file is a block file" 10 elif [[ -f $file ]];then 11 echo "the $file is a common file" 12 else 13 echo "the $file is other file" 14 fi
條件判斷:case語句
case 變量引用 in
pat1)
分支1
;;
pat2)
分支2
;;
….
*)
默認分支
;;
esac
case支持glob風格的通配符:
*:任意長度任意字符
?:任意單個字符
[]:指定范圍內的任意單個字符
a|b:z或者b
1 #!/bin/bash 2 read -p "input a num:" num 3 case $num in 4 3|6|1) 5 echo "madan" 6 ;; 7 2|0|4|5) 8 echo "shabi" 9 ;; 10 7|8|9) 11 echo "haha" 12 ;; 13 *) 14 echo "why" 15 esac ~
練習題
? 1 、寫一個腳本/root/bin/createuser.sh ,實現如下功能:
使用一個用戶名做為參數,如果指定參數的用戶存在,就顯
示其存在,否則添加之;顯示添加的用戶的id 號等信息
1 #!/bin/bash 2 #author:qiuwei 3 [[ $# -lt 1 ]]&&echo "please input at least one username"&&exit 4 5 if id $* &>/dev/null;then 6 echo "the user $* exist" 7 8 else useradd $* &> /dev/null&&echo "the user $* create sucess" &&id $* 9 fi
2 、寫一個腳本/root/bin/yesorno.sh ,提示用戶輸入yes或 或
no, 并判斷用戶輸入的是yes 還是no, 或是其它信息
方法一
此方法比較笨,如果組合的選項太多就不適用,
1 #!/bin/bash 2 read -p "please input yes or no :" num 3 if [[ $num =~ ^[yY][Ee][sS]$ ]];then 4 echo yes 5 elif [[ $num =~ ^[Nn][oO]$ ]];then 6 echo no 7 else 8 echo "please input correct info" 9 fi
方法二
此方法就是將輸入的字符全部轉換為大寫或者小寫,
1 #!/bin/bash 2 read -p "please input yes or no:" num 3 num1=`echo $num|tr "A-Z" "a-z"` 4 if [[ $num1 =~ ^yes$ ]];then 5 echo "yes" 6 elif [[ $num1 =~ ^no$ ]];then 7 echo "no" 8 else 9 echo "please input correct info" 10 fi
3 、寫一個腳本/root/bin/filetype.sh, 判斷用戶輸入文件路
徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)
1 #!/bin/bash 2 [[ $# -lt 1 ]]&&echo "please input at least one file"&&exit 3 if [[ -h $* ]];then 4 echo "the $* is a sysmbol file" 5 elif [[ -f $* ]];then 6 echo "the $* is a common file" 7 elif [[ -d $* ]];then 8 echo "the $* is a directory " 9 elif [[ -b $* ]];then 10 echo "the $* is a block file" 11 else 12 echo "the $* is other file" 13 fi
? 4 、寫一個腳本/root/bin/checkint.sh, 判斷用戶輸入的參數
是否為正整數
1 #!/bin/bash 2 read -p "please input a num:" num 3 [[ -z $num ]]&&echo "please input one num"&&exit 4 num1=`echo "$num"|egrep -o "\-?\<[[:digit:]]+\>"` 5 if [[ $num == $num1 ]];then 6 if [[ $num1 -lt 0 ]];then 7 echo "the number is a negative integer" 8 elif [[ $num1 -eq 0 ]];then 9 echo "the numbei is 0" 10 else 11 echo "the numbei is a positive integer" 12 fi 13 else 14 echo "the number is a non-integer" 15 fi
shell腳本編程總結:
在shell腳本編程中if語句和case語句及其重要的,
case語句做條件判斷,行尾必須為單詞“in”,每一個模式必須以右括號“)”結束。
雙分號“;;”表示命令序列結束。
case支持glob風格的通配符
if語句作條件選擇,有單分支雙分支及多分支,if語句可嵌套使用
文件查找
locate:非實時查找(數據庫查找)
查詢系統上預建的文件索引數據庫
/var/lib/mlocate/mlocate.dbdb
索引的構建是在系統較為空閑時自動進行的(周期性任務),所以有的時候明明是有那個
文件但是不一定能查找得到,這時候需要手動更新數據庫,命令為:updatedb
索引構建過程需要遍歷整個根文件系統,及其消耗資料
工作特點:
1.查找速度快
2.模糊查找
3.非實時查找
4.搜索的是文件的全路徑,不僅僅是文件名
5.可能只搜索用戶具備讀取和執行權限的目錄
locate keyword
選項
-i 忽略大小寫
-n N :只列舉前n匹配項目
locate -r “\.shabi$”
使用擴展正則表達式來搜索以“.foo”結尾的文件
以下為搜索以bi結尾的文件
find
實時查找工具,通過遍歷指定路徑完成文件查找
工作特點:
1.查找速度略慢
2.精確查找
3.實時查找
4.可能只搜索用戶具備讀取和執行權限的目錄
語法:
find [option0]…[查找路徑][查找條件][處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄
查找條件:指定的查找標準,可以文件名,大小,類型,
權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕
查找條件
根據文件名和inode查找
-name “filename”:支持使用glob
*,?,[],[^]
-iname “filename”:忽略大小寫
-inum n :按inode號查找
-samefile name :相同inode號的文件
-links n 鏈接數為n的文件
-regex “pattern”:以pattern匹配整個文件路徑字符串,而不僅僅是文件名稱
根據屬主,屬組查找
-user username:查找屬主為指定用戶(UID)的文件
-group groupname :查找屬主為指定組(GID)的文件
-uid userid :查找屬組為指定的UID號的文件
-gid groupid :查找屬組為指定的GID號的文件
-nouser :查找沒有屬主的文件
-nogroup :查找沒有屬組的文件
根據文件類型查找
-type TYPE:
f :普通文件
d :目錄文件
l :符號鏈接文件
s :套接字文件
b :塊設備文件
c :字符設備文件
p :管道文件
組合條件:
與: -a
或: -o
非:-not ,!
德.摩根定律:
(非p)或(非q)=非(p且q)
(非p)且(非q)=非(p或q)
根據文件大小來查找:
-size [+|-]#UNIT
常用單位:K,M,G
#UNIT:(#-1,#]
如:6M表示(5M,6M]===>大于5M,小于等于6M
-#UNIT: [0,#-1]
如:-6M表示[0,5M]===>大于等于0,小于等于5M
+#UNIT:(#,無窮大)
如: +6M表示(6M,無窮大)===>大于6M
根據時間戳:
以天為單位
-atime [+|-]#,
#:[#,#+1)
如:5,代表5天(包含第5天)到第6天前
+#:[#+1,無窮大]
如 +5,代表6天(包含第6天)到文件創建的這段時間
-#:[0.#)
如-5,代表5天內的文件
-mtime 同上用法
-ctime 同上用法
以分鐘為單位
-amin
-mmin
-cmin
根據權限查找:
-perm [/|-]mode
mode:精確權限匹配 .
例如:-perm 222,表示文件權限正好為222的文件
/mode:任何一類(u,g,o)對象的權限只要能一位匹配即可,
或關系,+從centos7開始淘汰
-mode:每一類對象都必須同時擁有指定權限,與關系
0 表示不關注
find -prem 755 會匹配權限模式恰好是755的文件
只有當每個人都有寫權限時,find -porm -222才會匹配
只有當任意人有寫權限時,find -prom +222就會匹配
+或者/表示或關系
– 表示與關系
只有其他人(other)有寫權限時,find -perm -002才會匹配
[root@localhost qiuwei]# ll total 12 --w--w--w- 2 1001 1001 49 Aug 10 12:58 aaa -rwxr-xr-x 1 root root 0 Aug 16 09:39 aaa222aaa --w--w--w- 2 1001 1001 49 Aug 10 12:58 file --------w- 1 root root 57 Aug 10 12:57 file2 drwxrwxrwx 2 root root 6 Aug 16 10:13 test [root@localhost qiuwei]# find -perm 222 ===>只會匹配為222的文件 ./file ./aaa [root@localhost qiuwei]# find -perm -222 ===>只要每個人都有寫權限,其他權限不管有沒,都可以匹配到 . ./file ./aaa ./test [root@localhost qiuwei]# find -perm +222 ====>表示+在centos7上以淘汰,要使用/ find: warning: you are using `-perm +MODE'. The interpretation of `-perm +omode' changed in findutils-4.5.11. The syntax `-perm +omode' was removed in findutils-4.5.12, in favour of `-perm /omode'. ./file ./aaa [root@localhost qiuwei]# find -perm /222 ===>任何人只有有讀權限,只要有一個人有讀權限,不管其他人有什么權限,都可以匹配 . ./file2 ./file ./aaa ./aaa222aaa ./test [root@localhost qiuwei]# find -perm -002 ===>只要other有讀權限,其他不做任何要求,都可以匹配到 . ./file2 ./file ./aaa ./test [root@localhost qiuwei]# find -perm 755 ====>只會匹配權限為755的文件 ./aaa222aaa [root@localhost qiuwei]# find -perm /755 ====>在o,g,u中的任意一位中的任意權限相同就都可以匹配上 . ./file ./aaa ./aaa222aaa ./test [root@localhost qiuwei]# find -perm -755 ====>每個人都有至少有755的權限,才能被匹配上 . ./aaa222aaa ./test [root@localhost qiuwei]#
處理動作
-print:默認的處理的動作,顯示至屏幕
-ls:類似對找到的文件執行 “ls -l”
-delete:刪除查找到的文件
-fls file:查找到的所有文件的長格式信息保存至指定文件中
[root@localhost qiuwei]# find -perm -755 -ls ===>顯示匹配道德文件的長格式信息 447840 0 drwxrwxrwx 3 root test 87 Aug 16 14:55 . 447845 0 -rwxr-xr-x 1 root root 0 Aug 16 09:39 ./aaa222aaa 68613053 0 drwxrwxrwx 2 root root 6 Aug 16 10:13 ./test [root@localhost qiuwei]# find -perm 755 -ls 447845 0 -rwxr-xr-x 1 root root 0 Aug 16 09:39 ./aaa222aaa [root@localhost qiuwei]# find -perm 755 -delete ===>刪除了匹配到文件,完全不提醒,慎用?。?! [root@localhost qiuwei]# ll total 12 --w--w--w- 2 1001 1001 49 Aug 10 12:58 aaa -rwxrwx-w- 1 root root 0 Aug 16 14:54 bbbb -r-------- 1 root root 0 Aug 16 14:55 ccc --w--w--w- 2 1001 1001 49 Aug 10 12:58 file --------w- 1 root root 57 Aug 10 12:57 file2 drwxrwxrwx 2 root root 6 Aug 16 10:13 test
[root@localhost qiuwei]# find -perm 222 -fls ddd ==>將匹配的文件的長格式信息保存至ddd文件中 [root@localhost qiuwei]# ll total 16 --w--w--w- 2 1001 1001 49 Aug 10 12:58 aaa -rwxrwx-w- 1 root root 0 Aug 16 14:54 bbbb -r-------- 1 root root 0 Aug 16 14:55 ccc -rw-r--r-- 1 root root 147 Aug 16 15:13 ddd --w--w--w- 2 1001 1001 49 Aug 10 12:58 file --------w- 1 root root 57 Aug 10 12:57 file2 drwxrwxrwx 2 root root 6 Aug 16 10:13 test [root@localhost qiuwei]# cat ddd 447872 4 --w--w--w- 2 1001 1001 49 Aug 10 12:58 ./file 447872 4 --w--w--w- 2 1001 1001 49 Aug 10 12:58 ./aaa
-ok command {}\;對查找到的每個文件執行有command指定的命令;
執行命令之前,都會交互式要求用戶確認
-exex command {}\;對查找到的每個文件執行有command指定的命令;
直接執行命令,不會有交互式,所以要謹慎使用
find命令傳遞查找的文件至后面的命令時,是所有參數一次性傳遞的
但是有些命令接受參數的個數是有上限的,超過上限命令會失敗,
可使用 find|xargs command
以下命令區別在于是否有交互式
總結:
find在整個磁盤上遍歷整個文件系統查找文件
查找路徑
查找條件:
1.根據文件名和inode
2.屬主屬組
3.文件類型
4.文件大小
5.時間戳
6.權限
7.可根據德.摩根定律組合查找
處理動作
可跟一些命令對查找出來的文件進行處理
練習
? 1 、查找/var 目錄下屬主為root ,且屬組為mail 的所有文件
指令
find /var -user root -group mail
2 、查找/var 目錄下不屬于root 、lp 、gdm 的所有文件
匹配到的文件挺多的,只選了兩行
方法1
find /var -not \( -user root -o -user lp -o -user gdm \) -ls |head -2
方法2
-a選項是默認的
find /var -not -user root -not -user lp -not -user gdm -ls |head -2
? 3 、查找/var 目錄下最近一周內其內容修改過,同時屬主不為
root ,也不是postfix 的文件
指令:
find /var -mtime -7 -not -user root -not -user postfix -ls |head -2
? 4 、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪
問過的文件
find / \( -nouser -o -nogroup \) -atime -7 -ls |head -2
5 、查找/etc 目錄下大于1M 且類型為普通文件的所有文件
find -size +1M -type f -ls|head -3
6 、查找/etc 目錄下所有用戶都沒有寫權限的文件
說明:
都沒有寫權限理解為u沒有寫權限且g沒有寫權限且o沒有寫權限
(u無w)且(g無w)且(o無w)
根據德.摩根定律,可替換成
無(u有w 或 g有w 或 o有w)
都沒有寫權限可以表示為 -not -prem /222 ===>/222表示的就是或關系
find /etc -not -perm /222 -ls |head -2
? 7 、查找/etc 目錄下至少有一類用戶沒有執行權限的文件
說明:至少有一類用戶沒有執行權限的反義就是全部都有執行權限,
我們找出全部都有執行權限的然后取反就可以了
find -not -perm -111 find -not -perm /100 -o -not -perm /010 -o -not -perm /001
? 8 、查找/etc/init.d 目錄下,所有用戶都有執行權限,且其它
用戶有寫權限的文件
說明:
find /etc/init.d -perm -113 -ls ===>查找init.d這個文件本身 錯 find /etc/init.d/ -perm -113 -ls ===>進入init.d目錄查找 對
排除 目錄
示例:查找/etc/ 下,除/etc/sane.d 目錄的其它所有.conf 后綴的文件
find /etc -path ‘/etc/sane.印,
如果-o前面的沒有執行,就打印后面的,
這樣就實現了排除
排除多個就在中間加上是那個 -o -path ‘/etc/sane.d’ -a -prune
壓縮和解壓縮
compress [-dfvcVr] [-b maxbits] [file …]
-d:解壓縮
-c:結果輸出至標準輸出,不刪除原文件
-v:顯示過程
uncompress 解壓縮
zcat
我的linux系統上沒有安裝此命令,安裝也安裝不上,所以就不演示了
gzip:
-d 解壓縮,相當于gunzip
-c:將壓縮或解壓縮的結果輸出至標準輸出
-#:1-9 指定壓縮比,值越大壓縮比越大
zcat:不顯示解壓縮的前提下查看文本文件內容
備注:不能對硬鏈接文件進行壓縮
bzip2
-k:keep 保留原文件
-d:解壓縮
-#:1-9,壓縮比,默認為6
bzcat:不顯示解壓縮的前提下查看文本文件的內容
xz
-k:keep,保留原文件
-d:解壓縮
-#:壓縮比,默認為6
xzcat:不顯示解壓縮的前提下查看文本文件的內容
和上面用法一樣,就是壓縮比例不一樣,這里就不做演示了
zip
打包壓縮
zip -r “生成壓縮文件(可不帶后綴)" "要壓縮目錄"
解包解壓縮
unzip "壓縮文件"
壓縮cat /root/qiuwei/test |zip test – ==>這個-代表的是前面的輸出
解壓縮unzip -p test.zip >shab
原創文章,作者:qiuwei,如若轉載,請注明出處:http://www.www58058.com/36051
文章對當天的知識進行了完整的梳理與總結,對于腳本而言,我們需要記住的是其語法,而后多寫,多看優秀的代碼,對于find命令則要求我們熟練掌握了,因為這是在筆試中的一個重要考點。