shell脚本中if与case使用
查找文件locate与find的使用
压缩,解压及归档工具
执行的循序
顺序执行
选择执行
循环执行
条件语句if
if只是一个有含义的词,不能单独作为指令使用。
单分支
if 条件判断:then
条件为真的分支代码
fi
双分支
if 判断条件:then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支
if 判断条件1,
if-true
elif 判断条件2,then
if-ture
elif 判断条件3,then
if-ture
...
else
all-false
fi
case 条件判断
多用于离散值的判断
case
PAT1)
分支
;;
PAT2)
分支2
;;
...
*)
默认分支
::
esac
case *:任意长度任意字符
?:任意单个字符
[]:指定范围内的任意单个字符
a|b: a or b
例子:
case $number in
1|3|6)
echo good
;;
2|4|7)
echo bad
;;
10|8|66)
echo very good
;;
esac
read -p "please input a number: " number
[ -z "$number" ] && echo "you must input a number " && exit
判断输入的数字是否正整数
read -p "please input a integer" n
! expr "$n" + 0 &> /dev/null && echo no digit && exit
[ $n -gt 0 ] && echo integer || echo "passive inte ger or zoro"
文件查找和压缩文件
文件查找
locate
locate +文件名
默认是全文件系统搜索
基于数据库搜索 /var/lib/mlocate/mlocate,db
updatedb 更新数据库指令
-i 执行忽略大小写
-n 只显示指定的行数目
locate foo 搜索名称或路径带有foo的文件
locate -r ‘\.sh$‘ 搜索以.sh结尾的文件
locate 是外部命令
-r, --regexp REGEXP 搜索基本正则表达式 REGEXP 来代替模式
find
实时查找工具,通过遍历指定路径完成文件查找:
查找速度慢
精确查找
实时查找
可能只搜索用户具备读取和执行权限的目录
find 是外部命令
查找条件:
-name "文件名称":可以使用 *,?,[],[^]
find -name "checkint*" 要使用"" ‘‘不然会出现问题
find -name ‘[af]*.sh‘
-iname:忽略大小写
-inum n :按inode号码查找
-samefile name :查找相同inode号码的文件
-links n:连接数目为n的文件
-regex "PATTERN" :
find -regex ‘.*/.sh$‘
-p:显示文件所使用的真实路径
根据属主和属组查找
按照UID,GID搜索
-user name:查找属主为指定用户的文件
-group grpname:查找属组为指定组的文件
-uid userID:查找属主指定UID的文件
-gid groupID:查找属组指定GID的文件
-nouser:查找没有属主的文件
find / nouser
-nogroup:查找没有属组的文件
find / -nouser -nogroup
默认可以多指令使用
文件类型
-type
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
find / -type b 搜索块设备文件
组合条件:
与:-a
或:-o
非:-not, !
find -not -name "*.sh" -not -name "f*"
默认可以多指令使用
摩根定律:
非(P 且Q) = (非P) 或(非Q)
非(P 或Q) = (非P) 且(非Q)
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
不加括号括住所选的条件,最后加的-ls只会显示最后的条件的值
-a:与的使用时候可以直接在后面 -ls
-o:或的时候使用要用括号括起来
-path 排除
find /root -path/root/bin -a -prune -o -name "*.sh" -print(打印) 排除了/rootbin ,查找.sh结尾 的文件打印
格式:-path 路径 -a -prune(裁掉)
根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G
find / -size 10K =(9K,10K]
#UNIT: (#-1, #],如:6k
(5k.6k] 5k到6k之间
-#UNIT:[0,#-1], 如:-6k
[0,5k] 0k到5k
+#UNIT:(#,∞), 如:+6k
[6k,+∞] 6k到无穷大
根据时间戳:
用“天”为单位
-atime [+|-]#
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
-atime 7 [7,8)
-atime -7 [0,7]
-atime +7 [8,+∞)
find /etc/ -mmin -1 一分钟以内发生变化的文件
以“分钟”为单位:
-amin
-mmin
-cmin
根据权限查找
-perm +数字表示的权限
find /bin/ -perm 4755 -ls 精确查找权限为4755的文件
find -perm /222(+222) 7版本用/222 属主属组其他有一个有读权限就满足搜索条件
find -perm -222 属主属组其他都要有读权限才能满足搜索条件
没有-,/,+,直接+数字就是精确匹配
处理动作:
-print:默认的处理动作,显示至屏幕;
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件;
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;
对于每个文件执行命令之前,都会交互式要求用户确认
find -perm -222 -ok rm {} \:
固定语法要带\:结束
-ok chmod o-w {} \:
-exec cp {} {} .bak \:
{}专门配合find使用,表示搜索出匹配的文件
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题
find | xargsCOMMAND
find -perm /222 |xargs 0(换行)
find -perm /002 type f -delete 删除权限002的文件
压缩,解压及归档工具
compress[-dfvcVr] [-b maxbits] [file ...]
-d: 解压缩,相当于
-c: 结果输出至标准输出,不删除原文件
-v: 显示详情
uncompress解压缩
zcatfile.Z>file
compress m 压缩,源文件删除了
compress -c m > m.Z
compress -c -d m.Z >m 解压缩,不删除源文件。
uncompress m.Z 解压文件
zcat m.Z 看压缩文件内容,不进行文件解压
zcat m.gz
gzip 压缩(较常用)
gzip m 压缩文件,.gz格式
gzip -d m.gz 解压文件=gunzip
gzip -9 mgz(文件名)压缩比例(1-9),默认是6
bzip2 压缩效率更高
bzip2 m(文件)
bzip2 -d m 解压缩文件
bzip2 -k m 压缩保留源文件
bzip2 -9 m (1-9)压缩比例,默认是6
bzcat 不显式解压缩的前提下查看文本文件内容
xz 压缩效率最高
xz m(文件)
xz -d m 解压缩文件
xz -k m 压缩保留源文件
xz -9 m (1-9)压缩比例,默认是6
xzcat :不显示解压缩的前提下查看文本内容
zip 打包压缩 (压缩多个文件)
zip –r sysconfig sysconfig/
zip m m
unzip m.zip 解压缩
cat /var/log/messages | zip message - 压缩文件
unzip -p message >message 会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
查找/var目录下属主为root,且属组为mail的所有文件
查找/var目录下不属于root、lp、gdm的所有文件
查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
[[email protected] ~]# find / -nouser -nogroup -atime -7
查找/etc目录下大于1M且类型为普通文件的所有文件
查找/etc目录下所有用户都没有写权限的文件
查找/etc目录下至少有一类用户没有执行权限的文件
[[email protected] ~]# find /etc/ -not -perm /111
查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
[[email protected] ~]# find /etc/init.d/ -perm -113