shell編程、查找命令、壓縮文件工具

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命令

1find命令概述:實時查找工具,通過遍歷指定路徑完成文件查找;

工作特點:

查找速度略慢

精確查找

實時查找

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

2find語法

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 號等信息.

答:

圖片1.png

 

2 、寫一個腳本/root/bin/yesorno.sh ,提示用戶輸入yes或 或

no, 并判斷用戶輸入的是yes 還是no, 或是其它信息

答:

圖片2.png 

3 、寫一個腳本/root/bin/filetype.sh, 判斷用戶輸入文件路

徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)

答:

圖片3.png

4 、寫一個腳本/root/bin/checkint.sh, 判斷用戶輸入的參數

是否為正整數

答:判斷一個數是否為正整數,我想到了使用grep去匹配數字

圖片4.png 

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

答:

圖片5.png 

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

答:

圖片6.png 

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

root ,也不是postfix 的文件。

答: 圖片7.png8 、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪

問過的文件。

答:

圖片8.png

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

答:

圖片9.png 

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

答:

圖片10.png 

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

答:全部都有執行權限,進行取反即可。

圖片11.png

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

(0)
178babyhanggege178babyhanggege
上一篇 2016-08-15
下一篇 2016-08-15

相關推薦

  • shell腳本編程之函數、case語句

    一、函數 調用函數前必須先定義,調用時僅使用函數名即可。 語法: function  函數名 {      函數體 } 也可表示為: 函數名 () { 函數體 } 示例:寫一個腳本,判定網絡內有哪些主機在線,在線的用綠色顯示,不在線的用紅示表示: c_net&…

    Linux干貨 2015-08-24
  • grep的使用和正則表達式

           grep作為Linux中的文本編輯的三劍客之一,它的功能很強大,并不是虛傳,學會了grep在文本中找我們要找的的字符串總是能很輕易地找到,grep不僅僅就這一點功能,它在我們工作上也會對我們有很大的幫助。下面我來介紹一下grep的簡單的功能。 grep :文本過濾( 模式:patter…

    Linux干貨 2016-08-10
  • 8.1-用戶和組(作業篇)

     1、將/etc/issue文件中的內容轉換為大寫后保存至/tmp/issue.out文件中。 [root@localhost ~]# tr a-z A-Z </etc/issue > /tmp/issue.out [root@localhost ~]#&n…

    Linux干貨 2016-08-04
  • Linux運維之路-Linux基礎學習二

    Linux系統的一切皆文件思想會幫助我們學習

    2017-11-18
  • linux發行版說明和哲學思想,以及常用命令說明

    Linux發行版主要流行的版本有3種:debian,slackware,red 其說明和特點如下圖。 Linux哲學思想: 1、一切皆文件;所有的一切都變成了文件!不光是軟件方面的比如傳統文件、目錄、字符設備、還包括硬件或者接口。如鼠標/mouse、打印機/lp、還有接口比如/usb. 2、單一目的的小程序;一個程序只負責干一件事,而且要把這個任務做好。 3…

    Linux干貨 2016-10-30
  • N25第一周博客作業

    本周加班很多,視頻未看完,下周補上

    Linux干貨 2016-12-04

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-19 10:24

    文章寫的很用心,對當天所學的東西有了一個完整的人是和梳理,不過linux學習最重要是實際操作,希望下來多加練習,掌握當天所學的東西。

欧美性久久久久