使用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
注意:紅色的地方不能帶$號
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
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
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
locate命令
快速、模糊、非實時查詢,搜索未必精確,其依賴文件索引數據庫/var/lib/mlocate/mlocate.db
linux有內容變動時,執行updatedb命令手動更新數據庫,經實驗加-v參數觀察/tmp目錄不在更新范圍,因此/tmp內的文件無法被搜到,可采用find命令
locate常用選項:
-i:忽略大小寫
-r:正則匹配,例:locate -r '\.exe$' // 搜索以.exe結尾的文件
find命令
find [option] [path] [conditon] [action]
根據文件名和inode 查找:
-name " 文件名稱":支持使用glob
-iname "文件名稱":不區分字母大小寫
-inum n 按inode號查找
-samefile name 相同inode號的文件
-links n 鏈接數為n的文件
-regex "PATTERN":以PATTERN 匹配整個文件路徑字符串,而不僅僅是文件名稱
根據屬主、屬組查找:
-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互換
實例
find / -user wang –o –uid 33213
找出/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目錄
根據文件大小來查找:
-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 :每一類對象都必須同時擁有指定權限,與關系
0 表示不關注
find -perm 755 會匹配權限模式恰好是755 的文件
只要當任意人有寫權限時,find -perm +222 就會匹配
只有當每個人都有寫權限時,find -perm -222 才會匹配
只有當other有寫權限時,find -perm -002才會匹配
記憶:"與"是求交集,結果少,用減號(–);"或"是求并集,結果多,用正斜線(/)
處理動作
-print :默認的處理動作,顯示至屏幕;
-ls :類似于對查找到的文件執行“ls -l” 命令
-delete :刪除查找到的文件;
-fls file :查找到的所有文件的長格式信息保存至指定文件中,也開用>,重定向
-ok COMMAND {} \; 對查找到的每個文件執行由
COMMAND 指定的命令;
對于每個文件執行命令之前,都會交互式要求用戶確認
實驗得-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文件并添加執行權限
find -name *.xml -exec cp {} {}.org \; //配置文件做備份
find /tmp -ctime +3 -user root -ok rm {} \; //刪除root存在時間超過3天以上的臨時文件
find ~ -perm -002 -exec chmod o-w {} \;
實戰:
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
文章寫的很認真,對細節方面有了一些明顯的標識,通過實踐操作將自己遇到的問題記錄下來寫成博客是個很好的習慣。