shell編程之條件判斷和find查詢

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

-p 指定要顯示的提示

-t TIMEOUT

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

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

read -p “Enter a filename: “ FILE

 

條件選擇if語句  多分支

if  CONDITION1 ; then

if-true

elif CONDITION2 ; then

if-ture

elif CONDITION3 ; then

if-ture

else

all-false

fi

逐條 件進行判斷,第一次遇為“真”條件時,執行其分支,而后結束整個if

 

條件判斷:case

case 用 變量引用 in

PAT1)

分支1

;;

PAT2)

分支2

;;

*)

默認分支

;;

esac

 

1.寫一個腳本/root/bin/createuser.sh ,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id

#!/bin/bash

read -p "please input a username: "  user

id $user &>/dev/null

if [ $? -eq 0 ];then

    echo "$user is exists"

else

    useradd $user

    echo "$user already created "

    id $user

fi

注意:紅色的地方不能帶$號

blob.png

 

2.寫一個腳本/root/bin/yesorno.sh ,提示用戶輸入yes或no, 并判斷用戶輸入的是yes 還是no

#!/bin/bash

read -p "Please input yes/no: " yesorno

case $yesorno in

[Yy][Ee][Ss]|[Yy])

echo yes

;;

[Nn][Oo]|[Nn])

echo no

;;

*)

  echo other

  ;;

esac 

blob.png

 

3.寫一個腳本/root/bin/filetype.sh, 判斷用戶輸入文件路徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)

#!/bin/bash

read -p "Input a file path: " file

file $file

if [ -h $file ];then

     echo "$file is a symbolic link"

elif [ -f $file ];then

    echo "$file is a common file"

elif [ -d $file ];then

    echo "$file is a directory"

elif [ -p $file ];then

    echo "$file is a pipe file"

elif [ -S $file ];then

    echo "$file is a socket file"

elif [ -b $file ];then

    echo "$file is a block file"

else

    echo "please enter a correct file"

fi

blob.png

 

4. 寫一個腳本/root/bin/checkint.sh, 判斷用戶輸入的參數是否為正整數

[root@localhost 0815]# vim checkint.sh

#!/bin/bash                          

read -p "please input a number: " number

[ -z $number ] && echo echo "you must input a number " && exit

echo $number|egrep -q '^[-[:digit:]]*$'

if [ $? -eq 0 ];then

    if [ $number -gt 0 ];then

        echo "$number is a positive number"

    elif [ $number -eq 0 ];then

                                echo "Input is zero"                                    

    else

        echo "$number is a negative number"

    fi

else

    echo Input is not a number!

fi

blob.png

 


 

 

 

locate命令

快速、模糊、非實時查詢,搜索未必精確,其依賴文件索引數據庫/var/lib/mlocate/mlocate.db

linux有內容變動時,執行updatedb命令手動更新數據庫,經實驗加-v參數觀察/tmp目錄不在更新范圍,因此/tmp內的文件無法被搜到,可采用find命令

locate常用選項:

-i:忽略大小寫

blob.png

-r:正則匹配,例:locate -r '\.exe$'  // 搜索以.exe結尾的文件

blob.png

 

find命令

find [option] [path] [conditon] [action]

根據文件名和inode 查找:

-name " 文件名稱":支持使用glob

blob.png

-iname "文件名稱":不區分字母大小寫

blob.png

-inum n 按inode號查找

blob.png

-samefile name 相同inode號的文件

blob.png

-links n 鏈接數為n的文件

blob.png

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

blob.png

根據屬主、屬組查找:

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

-group GRPNAME: 查找屬組為指定組(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)

!A -a !B = !(A -o B)

!A -o !B = !(A -a B)

記憶:非運算進出括號 -a與-o互換

blob.png

實例

find / -user wang –o –uid 33213

blob.png

 

找出/tmp 目錄下,屬主不是root ,且文件名不是fstab

find /tmp -not \( -user root -o -name 'fstab' \) 等價于

find /tmp \( -not -user root -a -not -name 'fstab' \)

注意: \( …… \) 格式,中間的空格不能省

 

排除目錄

例: find /usr/local/tomcat/ -path '/usr/local/tomcat/conf' -a -prune -o -name *.xml –print   //排除conf目錄

blob.png


 

根據文件大小來查找:

-size [+|-]#UNIT

常用單位:k, M, G

#UNIT: (#-1, #] ,如:6k 范圍為5k~6k

-#UNIT :[0,#-1],  如:-6k 范圍為0~5k

+#UNIT :(#, ∞ ), 如:+6k 范圍為6k~∞

 

根據時間戳:

以“天”為單位;

-atime [+|-]#,

#: [#,#+1)

+#: [#+1,∞]

-#: [0,#)

-mtime

-ctime

以“分鐘”為單位:

-amin

-mmin

-cmin

 

根據權限查找:

-perm [/|-]MODE

MODE:  精確權限匹配

/MODE :任何一類(u,g,o) 對象的權限中只要能一位匹配即可 ,或關系

-MODE :每一類對象都必須同時擁有指定權限,與關系

表示不關注

find -perm 755 會匹配權限模式恰好是755 的文件

只要當任意人有寫權限時,find -perm +222 就會匹配

只有當每個人都有寫權限時,find -perm -222 才會匹配

只有當other有寫權限時,find -perm -002才會匹配

記憶:"與"是求交集,結果少,用減號();"或"是求并集,結果多,用正斜線(/


 

處理動作

-print :默認的處理動作,顯示至屏幕;

-ls :類似于對查找到的文件執行“ls -l” 命令

-delete :刪除查找到的文件;

-fls file :查找到的所有文件的長格式信息保存至指定文件中,也開用>,重定向

-ok COMMAND {} \;  對查找到的每個文件執行由

COMMAND 指定的命令;

對于每個文件執行命令之前,都會交互式要求用戶確認

blob.png

blob.png

實驗得-ok rm {} \; 可以交互式刪除文件

-ok delete {} \; 會報文件目錄不存在

-delete 無提示直接刪除

 

-exec COMMAND {} \;  對查找到的每個文件執行由COMMAND 指定的命令

{}:  用于引用查找到的文件名稱自身

find 傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令

有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題

find | xargs COMMAND

 

實例:

find /root/shellscripts/ -type f -perm 644 -name *.sh -exec chmod 755 {} \;

//找到sh文件并添加執行權限

blob.png

find -name *.xml -exec cp {} {}.org \;   //配置文件做備份

blob.png

find /tmp -ctime +3 -user root -ok rm {} \;  //刪除root存在時間超過3天以上的臨時文件 

find ~ -perm -002 -exec chmod o-w {} \;

blob.png

 

 

實戰:

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

find /var -user root -group mail

2.查找/var 目錄下不屬于root.lp.的所有文件

  find /var -not -user root -not -user lp

3.查找/var 目錄下最近一周內其內容修改過,同時屬主不為root ,也不是postfix 的文件

  find /var -not \( -user root -o -user postfix \) -mtime -7

4.查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件

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

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

  find /etc -size +1M -type f

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

  find /etc/ -not -perm /222

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

  find /etc/ -not -perm /111

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

  find /etc/ -perm -111 -perm /002


 

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

(1)
victorycommandervictorycommander
上一篇 2016-08-18 10:10
下一篇 2016-08-18 10:10

相關推薦

  • screen命令

    安裝SCREEN[root@centos6 ~]# dfFilesystem     1K-blocks    Used Available Use% Mounted on/dev/sda2       51475068 5052580  43801048  11% /…

    2017-07-22
  • 新的開始

    加入馬幫,新的開始,加油!

    Linux干貨 2016-09-19
  • 網絡基礎知識

    網絡基礎知識: 網絡設備 TCP/IP協議 ARP協議 網絡設備:     HUB集線器: 工作在物理層,沒有學習能力,作用在于把各種節點匯聚在以它為中心的節點上,同時也有傳輸數據的作用,由于沒有學習能力,只能以廣播的形式將數據發送給與它相連的所有節點。 特點:共享帶寬,半雙工     &…

    Linux干貨 2016-09-02
  • 2018/8/3作業

    問題: 在/data/testdir里創建的新文件自動屬于g1組,組g2的成員如:alice能對這些新文件有讀寫權限,組g3的成員如:tom只能對新文件有讀權限,其它用戶(不屬于g1,g2,g3)不能訪問這個文件夾。 groupadd g1         &…

    Linux干貨 2016-08-05
  • linux終端的類型與linux發展歷史

    一、linux console的類型與說明 說明:        1 由于虛擬終端的實現,人們可以多用戶多任務的在一臺計算機操作系統上工作             2 在80或90年代的舊電腦上,人們只能用分屏這樣的方法來實現多用戶,多任務的工作  …

    Linux干貨 2016-11-03
  • rpm詳解

    rpm詳解 rpm詳解 rpm使用方法 rpm起源 rpm是什么 rpm命名格式 rpm優缺點 rpm獲取注意 rpm命令使用 rpm起源  由于在linux中安裝應用程序需要源碼包編譯安裝,對于非專業人員而言難度太大,因而出現一種將源碼編譯好的二進制程序,庫文件,配置文件,幫助文件等打包成一個或多個特定格式的程序包,而管理這類包的工具之一,則稱為…

    Linux干貨 2016-12-23

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-19 14:51

    文章寫的很認真,對細節方面有了一些明顯的標識,通過實踐操作將自己遇到的問題記錄下來寫成博客是個很好的習慣。

欧美性久久久久