shell腳本編程和文件查找及壓縮

shell腳本編程

read:使用read來把輸入值分配一個或多個shell變量

    -p 指定要顯示的提示

    -t TIMEOUT

    read 從標準輸入中讀取值,給每個單詞分配一個變量

    所有剩余單詞被分配給最后一個變量

    read -p "Enter a filename :" FILE

blob.png

條件選擇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
~

blob.png

雙分支

    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

blob.png

多分支

    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

blob.png

條件判斷: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
~

 blob.png

練習題

? 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

blob.png

 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

blob.png

 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

blob.png

? 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

blob.png

shell腳本編程總結:

    在shell腳本編程中if語句和case語句及其重要的,

case語句做條件判斷,行尾必須為單詞“in”,每一個模式必須以右括號“)”結束。

    雙分號“;;”表示命令序列結束。

    case支持glob風格的通配符       

if語句作條件選擇,有單分支雙分支及多分支,if語句可嵌套使用

文件查找

locate:非實時查找(數據庫查找)

查詢系統上預建的文件索引數據庫

    /var/lib/mlocate/mlocate.dbdb

索引的構建是在系統較為空閑時自動進行的(周期性任務),所以有的時候明明是有那個

文件但是不一定能查找得到,這時候需要手動更新數據庫,命令為:updatedb

blob.png

索引構建過程需要遍歷整個根文件系統,及其消耗資料

工作特點:

    1.查找速度快

    2.模糊查找

    3.非實時查找

    4.搜索的是文件的全路徑,不僅僅是文件名

    5.可能只搜索用戶具備讀取和執行權限的目錄

locate keyword

選項

    -i 忽略大小寫

    -n N :只列舉前n匹配項目

locate -r “\.shabi$”

使用擴展正則表達式來搜索以“.foo”結尾的文件

以下為搜索以bi結尾的文件

blob.png

find

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

工作特點:

    1.查找速度略慢

    2.精確查找

    3.實時查找

    4.可能只搜索用戶具備讀取和執行權限的目錄

語法:

    find [option0]…[查找路徑][查找條件][處理動作]

        查找路徑:指定具體目標路徑;默認為當前目錄

        查找條件:指定的查找標準,可以文件名,大小,類型,

權限等標準進行;默認為找出指定路徑下的所有文件

        處理動作:對符合條件的文件做操作,默認輸出至屏幕

查找條件


根據文件名和inode查找

-name “filename”:支持使用glob

        *,?,[],[^]

-iname “filename”:忽略大小寫

blob.png

-inum n :按inode號查找

-samefile name :相同inode號的文件

blob.png

-links n 鏈接數為n的文件

blob.png

-regex “pattern”:以pattern匹配整個文件路徑字符串,而不僅僅是文件名稱

blob.png

根據屬主,屬組查找

    -user username:查找屬主為指定用戶(UID)的文件

    -group groupname :查找屬主為指定組(GID)的文件

blob.png

    -uid  userid  :查找屬組為指定的UID號的文件

    -gid  groupid :查找屬組為指定的GID號的文件

blob.png

    -nouser  :查找沒有屬主的文件

    -nogroup :查找沒有屬組的文件

blob.png

根據文件類型查找

    -type TYPE:

    f :普通文件

    d :目錄文件

    l :符號鏈接文件

    s :套接字文件

    b :塊設備文件

    c :字符設備文件

    p :管道文件

blob.png

組合條件:

    與: -a

    或: -o

    非:-not ,!

德.摩根定律:

    (非p)或(非q)=非(p且q)

    (非p)且(非q)=非(p或q)

blob.png

blob.png

根據文件大小來查找:

-size [+|-]#UNIT

    常用單位:K,M,G

#UNIT:(#-1,#]

    如:6M表示(5M,6M]===>大于5M,小于等于6M

-#UNIT: [0,#-1]

    如:-6M表示[0,5M]===>大于等于0,小于等于5M

+#UNIT:(#,無窮大)

    如: +6M表示(6M,無窮大)===>大于6M

blob.png

根據時間戳:

以天為單位

    -atime [+|-]#,

    #:[#,#+1) 

      如:5,代表5天(包含第5天)到第6天前

    +#:[#+1,無窮大]

     如 +5,代表6天(包含第6天)到文件創建的這段時間

    -#:[0.#)

      如-5,代表5天內的文件

 -mtime 同上用法

 -ctime 同上用法

以分鐘為單位

    -amin

    -mmin

    -cmin

blob.png

根據權限查找:

-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

以下命令區別在于是否有交互式

blob.png

總結:

    find在整個磁盤上遍歷整個文件系統查找文件

    查找路徑

    查找條件:

        1.根據文件名和inode

        2.屬主屬組

        3.文件類型

        4.文件大小

        5.時間戳

        6.權限

        7.可根據德.摩根定律組合查找  

    處理動作

        可跟一些命令對查找出來的文件進行處理

練習

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

指令

find /var -user root -group mail

blob.png

 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

blob.png

? 3 、查找/var 目錄下最近一周內其內容修改過,同時屬主不為

root ,也不是postfix 的文件

指令:

find /var -mtime -7 -not -user root -not -user postfix -ls |head -2

blob.png

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

問過的文件

find / \( -nouser -o -nogroup \) -atime -7 -ls |head -2

blob.png

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

find -size +1M -type f -ls|head -3

blob.png

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

blob.png

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

說明:至少有一類用戶沒有執行權限的反義就是全部都有執行權限,

我們找出全部都有執行權限的然后取反就可以了

find -not -perm -111

find  -not -perm /100 -o -not -perm /010 -o -not -perm /001

blob.png

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

用戶有寫權限的文件

說明:

find /etc/init.d  -perm -113 -ls  ===>查找init.d這個文件本身  錯

find /etc/init.d/  -perm -113 -ls ===>進入init.d目錄查找   對

blob.png

blob.png

排除 目錄

示例:查找/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:不顯示解壓縮的前提下查看文本文件內容

blob.png

備注:不能對硬鏈接文件進行壓縮

blob.png

bzip2

    -k:keep 保留原文件

    -d:解壓縮

    -#:1-9,壓縮比,默認為6

bzcat:不顯示解壓縮的前提下查看文本文件的內容

blob.png

blob.png

xz

    -k:keep,保留原文件

    -d:解壓縮

    -#:壓縮比,默認為6

xzcat:不顯示解壓縮的前提下查看文本文件的內容

和上面用法一樣,就是壓縮比例不一樣,這里就不做演示了

zip

打包壓縮

    zip -r  “生成壓縮文件(可不帶后綴)" "要壓縮目錄"

blob.png

解包解壓縮

    unzip  "壓縮文件"

blob.png

壓縮cat /root/qiuwei/test |zip test –  ==>這個-代表的是前面的輸出

blob.png

解壓縮unzip -p test.zip >shab

blob.png

原創文章,作者:qiuwei,如若轉載,請注明出處:http://www.www58058.com/36051

(0)
qiuweiqiuwei
上一篇 2016-08-18
下一篇 2016-08-18

相關推薦

  • N25 – 第一周博客作業

      1. 描述計算機的組成及其功能2. 按系列羅列Linux的發行版,并描述不同發行版之間的聯系和區別3. 描述Linux的哲學思想,并按照自己的理解對其進行解釋性描述4. 說明Linux系統上命令的使用格式;詳細介紹ifconfig,echo,tty,startx,export,pwd,history,sh…

    Linux干貨 2016-11-28
  • Linux網絡管理之網卡別名及網卡綁定配置

    在日常的運維工作當中,有時候需要在一塊物理網卡上配置多個IP地址,這就是網卡子接口的概念,以及多塊網卡實現網卡的綁定,通俗來講就是多塊網卡使用的一個IP地址,下面我來詳細說明實現的過程。 &創建網卡子接口 在CentOS系統當中網絡是由NetworkManager這個服務來管理的,它提供了一個圖形的界面,但此服務不支持物理網卡子接口的設置,所以在配置網卡子接…

    系統運維 2016-09-02
  • CentOS6.8啟動卡死在開機進度條

    不知道什么原因CentOS6.8開機的時候卡在進度條一直進不去。就是下面的畫面 在這個畫面下面也看不到什么原因,果斷F5切換至有顯示開機進程的界面 看到了上述的錯誤提示:invalid user :'root' root是無效的root這是什么鬼? 接下來重新開機,進入到救援模式 開機的時候快速按一下ESC,進入到CD啟動,然后選擇救援模…

    Linux干貨 2016-12-08
  • 第10周作業(下)

    4、寫一個腳本(1) 能接受四個參數:start, stop, restart, statusstart: 輸出“starting 腳本名 finished.”(2) 其它任意參數,均報錯退出。 #!/bin/bash # [ $# -ne 1 ] && echo &quo…

    Linux干貨 2017-01-03
  • N22-第九周作業

    第九周    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現;    #!/bin/bash    #    decl…

    Linux干貨 2016-10-24
  • 學習伊始宣言

    學習后的狀態 以人事相宜為追求,優化職業資質 以勝任愉快為目標,保持職業體能 以創造績效為主導,開發職業意識 以適應市場為基點,修養職業道德 學習宣言 如果不踏出第一步就永遠也不可能到達目的地,讓我們從此刻出發

    Linux干貨 2016-11-28

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-19 12:16

    文章對當天的知識進行了完整的梳理與總結,對于腳本而言,我們需要記住的是其語法,而后多寫,多看優秀的代碼,對于find命令則要求我們熟練掌握了,因為這是在筆試中的一個重要考點。

欧美性久久久久