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
下一篇 2016-08-18

相關推薦

  • 第五周作業

    1、顯示當前系統上root,fedora或user1用戶的默認shell。 [root@hostname ~]# grep -E ‘^(root|fedora|user1)’ /etc/passwd | cut -d: -f1,7 root:/bin/bash 2、找出/etc/rc.d/init.d/functions文件中某詞后面跟一組小括號的行,形如:…

    Linux干貨 2017-08-04
  • 計算機的組成及其功能

    計算機由運算器,控制器、存儲器及輸入、輸出裝置五部分組成。 第一,運算器(Arithmetical and Logical Unit),也稱作算術邏輯單元,主要是對數據進行各種運算。 第二,控制器(Control Unit)是計算機的控制中心,協調各計算機各部分按照預先的目標和步驟有序的工作??刂破鲝拇鎯ζ髦兄饤l取出指令,分析每條指令規定的操作和所需數據的存…

    Linux干貨 2016-09-17
  • Stream EDitor ( Blog 6)

    文本流編輯器,行編輯器sed詳解

    Linux干貨 2017-11-27
  • shell腳本編寫-3

    1、for循環 for 變量名 in  列表;do 循環體 done 執行機制:依次將列表中元素賦值給“變量名”;每次賦值后即執一次循環體;直到列表中元素耗盡循環結束 列表生成方式: (1) 直接給出列表 (2) 整數列表: (a){start..end} (b) $(seq [start [step]] end)  (3) 返回列表的命…

    Linux干貨 2016-08-18
  • lvm邏輯卷管理

    lvm邏輯卷管理: 允許對卷進行方便操作的抽象層,包括重新設定文件系統的大小 允許在多個物理設備間重新組織文件系統,將設備指定為物理卷 用一個或者多個物理卷來創建一個卷組 物理卷是用固定大小的物理區域(Physical Extent,PE)來定義的 在物理卷上創建的邏輯卷是由物理區域(PE)組成 可以在邏輯卷上創建文件系統 創建: 創建物理卷: pvcrea…

    Linux干貨 2016-09-01
  • 馬哥教育網絡班21期+第11周課程練習

    1、請描述一次完整的加密通訊過程,結合圖示最佳。 Bob先利用單向加密算法提取當前數據的指紋(特征碼),再用自己的私鑰加密數據指紋并附加于數據尾部,然后利用對稱加密將整個文件加密,之后用對方的公鑰加密對稱加密密鑰附加于尾部。 Alice收到數據后,先用自己的私鑰解密,得到對稱加密密鑰,之后用對稱加密密鑰解密,然后用Bob的公鑰解密得到數據指紋,并且驗證了Bo…

    Linux干貨 2016-09-26

評論列表(1條)

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

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

欧美性久久久久