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 #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的文件
查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件 [iyunv@zczx ~]# find / -nouser -nogroup -atime -7
查找/etc目录下大于1M且类型为普通文件的所有文件
查找/etc目录下所有用户都没有写权限的文件
查找/etc目录下至少有一类用户没有执行权限的文件 [iyunv@zczx ~]# find /etc/ -not -perm /111
查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件 [iyunv@zczx ~]# find /etc/init.d/ -perm -113
|