shell脚本编程
read:使用read来把输入值分配一个或多个shell变量
-p 指定要显示的提示
-t TIMEOUT
read 从标准输入中读取值,给每个单词分配一个变量
所有剩余单词被分配给最后一个变量
read -p "Enter a filename :" FILE
条件选择if语句
注意:if语句可以嵌套
单分支
if 判断语句;then
条件为真的分支代码
fi
1 #!/bin/bash 2 num1=10 3 num2=15 4 if [[ $num1 -lt $num2 ]];then 5 echo $num1 6 fi ~
双分支
if判断条件;then
条件为真的分支代码
else
条件为假的分支代码
fi
1 #!/bin/bash 2 num1=20 3 num2=9 4 if [[ $num1 -lt $num2 ]];then 5 echo $num1 6 else 7 echo $num2 8 fi
多分支
if判断条件1;then
if-ture
elif 判断条件2;then
if-ture
elif 判断条件3;then
if-ture
….
else
all-false
fi
注意:逐条件进行判断,第一次遇到为"真"条件时,执行其分支.而后结束整个if语句
1 #!/bin/bash 2 file=/etc/issue 3 4 if [[ -d $file ]];then 5 echo "the $file is a diretory" 6 elif [[ -h $file ]];then 7 echo "the $file is a sysmbol file" 8 elif [[ -b $file ]];then 9 echo "the $file is a block file" 10 elif [[ -f $file ]];then 11 echo "the $file is a common file" 12 else 13 echo "the $file is other file" 14 fi
条件判断:case语句
case 变量引用 in
pat1)
分支1
;;
pat2)
分支2
;;
….
*)
默认分支
;;
esac
case支持glob风格的通配符:
*:任意长度任意字符
?:任意单个字符
[]:指定范围内的任意单个字符
a|b:z或者b
1 #!/bin/bash 2 read -p "input a num:" num 3 case $num in 4 3|6|1) 5 echo "madan" 6 ;; 7 2|0|4|5) 8 echo "shabi" 9 ;; 10 7|8|9) 11 echo "haha" 12 ;; 13 *) 14 echo "why" 15 esac ~
练习题
1 、写一个脚本/root/bin/createuser.sh ,实现如下功能:
使用一个用户名做为参数,如果指定参数的用户存在,就显
示其存在,否则添加之;显示添加的用户的id 号等信息
1 #!/bin/bash 2 #author:qiuwei 3 [[ $# -lt 1 ]]&&echo "please input at least one username"&&exit 4 5 if id $* &>/dev/null;then 6 echo "the user $* exist" 7 8 else useradd $* &> /dev/null&&echo "the user $* create sucess" &&id $* 9 fi
2 、写一个脚本/root/bin/yesorno.sh ,提示用户输入yes或 或
no, 并判断用户输入的是yes 还是no, 或是其它信息
方法一
此方法比较笨,如果组合的选项太多就不适用,
1 #!/bin/bash 2 read -p "please input yes or no :" num 3 if [[ $num =~ ^[yY][Ee][sS]$ ]];then 4 echo yes 5 elif [[ $num =~ ^[Nn][oO]$ ]];then 6 echo no 7 else 8 echo "please input correct info" 9 fi
方法二
此方法就是将输入的字符全部转换为大写或者小写,
1 #!/bin/bash 2 read -p "please input yes or no:" num 3 num1=`echo $num|tr "A-Z" "a-z"` 4 if [[ $num1 =~ ^yes$ ]];then 5 echo "yes" 6 elif [[ $num1 =~ ^no$ ]];then 7 echo "no" 8 else 9 echo "please input correct info" 10 fi
3 、写一个脚本/root/bin/filetype.sh, 判断用户输入文件路
径,显示其文件类型(普通,目录,链接,其它文件类型)
1 #!/bin/bash 2 [[ $# -lt 1 ]]&&echo "please input at least one file"&&exit 3 if [[ -h $* ]];then 4 echo "the $* is a sysmbol file" 5 elif [[ -f $* ]];then 6 echo "the $* is a common file" 7 elif [[ -d $* ]];then 8 echo "the $* is a directory " 9 elif [[ -b $* ]];then 10 echo "the $* is a block file" 11 else 12 echo "the $* is other file" 13 fi
4 、写一个脚本/root/bin/checkint.sh, 判断用户输入的参数
是否为正整数
1 #!/bin/bash 2 read -p "please input a num:" num 3 [[ -z $num ]]&&echo "please input one num"&&exit 4 num1=`echo "$num"|egrep -o "\-?\<[[:digit:]]+\>"` 5 if [[ $num == $num1 ]];then 6 if [[ $num1 -lt 0 ]];then 7 echo "the number is a negative integer" 8 elif [[ $num1 -eq 0 ]];then 9 echo "the numbei is 0" 10 else 11 echo "the numbei is a positive integer" 12 fi 13 else 14 echo "the number is a non-integer" 15 fi
shell脚本编程总结:
在shell脚本编程中if语句和case语句及其重要的,
case语句做条件判断,行尾必须为单词“in”,每一个模式必须以右括号“)”结束。
双分号“;;”表示命令序列结束。
case支持glob风格的通配符
if语句作条件选择,有单分支双分支及多分支,if语句可嵌套使用
文件查找
locate:非实时查找(数据库查找)
查询系统上预建的文件索引数据库
/var/lib/mlocate/mlocate.dbdb
索引的构建是在系统较为空闲时自动进行的(周期性任务),所以有的时候明明是有那个
文件但是不一定能查找得到,这时候需要手动更新数据库,命令为:updatedb
索引构建过程需要遍历整个根文件系统,及其消耗资料
工作特点:
1.查找速度快
2.模糊查找
3.非实时查找
4.搜索的是文件的全路径,不仅仅是文件名
5.可能只搜索用户具备读取和执行权限的目录
locate keyword
选项
-i 忽略大小写
-n N :只列举前n匹配项目
locate -r “\.shabi$”
使用扩展正则表达式来搜索以“.foo”结尾的文件
以下为搜索以bi结尾的文件
find
实时查找工具,通过遍历指定路径完成文件查找
工作特点:
1.查找速度略慢
2.精确查找
3.实时查找
4.可能只搜索用户具备读取和执行权限的目录
语法:
find [option0]…[查找路径][查找条件][处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名,大小,类型,
权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
查找条件
根据文件名和inode查找
-name “filename”:支持使用glob
*,?,[],[^]
-iname “filename”:忽略大小写
-inum n :按inode号查找
-samefile name :相同inode号的文件
-links n 链接数为n的文件
-regex “pattern”:以pattern匹配整个文件路径字符串,而不仅仅是文件名称
根据属主,属组查找
-user username:查找属主为指定用户(UID)的文件
-group groupname :查找属主为指定组(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)
根据文件大小来查找:
-size [+|-]#UNIT
常用单位:K,M,G
#UNIT:(#-1,#]
如:6M表示(5M,6M]===>大于5M,小于等于6M
-#UNIT: [0,#-1]
如:-6M表示[0,5M]===>大于等于0,小于等于5M
+#UNIT:(#,无穷大)
如: +6M表示(6M,无穷大)===>大于6M
根据时间戳:
以天为单位
-atime [+|-]#,
#:[#,#+1)
如:5,代表5天(包含第5天)到第6天前
+#:[#+1,无穷大]
如 +5,代表6天(包含第6天)到文件创建的这段时间
-#:[0.#)
如-5,代表5天内的文件
-mtime 同上用法
-ctime 同上用法
以分钟为单位
-amin
-mmin
-cmin
根据权限查找:
-perm [/|-]mode
mode:精确权限匹配 .
例如:-perm 222,表示文件权限正好为222的文件
/mode:任何一类(u,g,o)对象的权限只要能一位匹配即可,
或关系,+从centos7开始淘汰
-mode:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
find -prem 755 会匹配权限模式恰好是755的文件
只有当每个人都有写权限时,find -porm -222才会匹配
只有当任意人有写权限时,find -prom +222就会匹配
+或者/表示或关系
– 表示与关系
只有其他人(other)有写权限时,find -perm -002才会匹配
[root@localhost qiuwei]# ll total 12 --w--w--w- 2 1001 1001 49 Aug 10 12:58 aaa -rwxr-xr-x 1 root root 0 Aug 16 09:39 aaa222aaa --w--w--w- 2 1001 1001 49 Aug 10 12:58 file --------w- 1 root root 57 Aug 10 12:57 file2 drwxrwxrwx 2 root root 6 Aug 16 10:13 test [root@localhost qiuwei]# find -perm 222 ===>只会匹配为222的文件 ./file ./aaa [root@localhost qiuwei]# find -perm -222 ===>只要每个人都有写权限,其他权限不管有没,都可以匹配到 . ./file ./aaa ./test [root@localhost qiuwei]# find -perm +222 ====>表示+在centos7上以淘汰,要使用/ find: warning: you are using `-perm +MODE'. The interpretation of `-perm +omode' changed in findutils-4.5.11. The syntax `-perm +omode' was removed in findutils-4.5.12, in favour of `-perm /omode'. ./file ./aaa [root@localhost qiuwei]# find -perm /222 ===>任何人只有有读权限,只要有一个人有读权限,不管其他人有什么权限,都可以匹配 . ./file2 ./file ./aaa ./aaa222aaa ./test [root@localhost qiuwei]# find -perm -002 ===>只要other有读权限,其他不做任何要求,都可以匹配到 . ./file2 ./file ./aaa ./test [root@localhost qiuwei]# find -perm 755 ====>只会匹配权限为755的文件 ./aaa222aaa [root@localhost qiuwei]# find -perm /755 ====>在o,g,u中的任意一位中的任意权限相同就都可以匹配上 . ./file ./aaa ./aaa222aaa ./test [root@localhost qiuwei]# find -perm -755 ====>每个人都有至少有755的权限,才能被匹配上 . ./aaa222aaa ./test [root@localhost qiuwei]#
处理动作
-print:默认的处理的动作,显示至屏幕
-ls:类似对找到的文件执行 “ls -l”
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
[root@localhost qiuwei]# find -perm -755 -ls ===>显示匹配道德文件的长格式信息 447840 0 drwxrwxrwx 3 root test 87 Aug 16 14:55 . 447845 0 -rwxr-xr-x 1 root root 0 Aug 16 09:39 ./aaa222aaa 68613053 0 drwxrwxrwx 2 root root 6 Aug 16 10:13 ./test [root@localhost qiuwei]# find -perm 755 -ls 447845 0 -rwxr-xr-x 1 root root 0 Aug 16 09:39 ./aaa222aaa [root@localhost qiuwei]# find -perm 755 -delete ===>删除了匹配到文件,完全不提醒,慎用!!! [root@localhost qiuwei]# ll total 12 --w--w--w- 2 1001 1001 49 Aug 10 12:58 aaa -rwxrwx-w- 1 root root 0 Aug 16 14:54 bbbb -r-------- 1 root root 0 Aug 16 14:55 ccc --w--w--w- 2 1001 1001 49 Aug 10 12:58 file --------w- 1 root root 57 Aug 10 12:57 file2 drwxrwxrwx 2 root root 6 Aug 16 10:13 test
[root@localhost qiuwei]# find -perm 222 -fls ddd ==>将匹配的文件的长格式信息保存至ddd文件中 [root@localhost qiuwei]# ll total 16 --w--w--w- 2 1001 1001 49 Aug 10 12:58 aaa -rwxrwx-w- 1 root root 0 Aug 16 14:54 bbbb -r-------- 1 root root 0 Aug 16 14:55 ccc -rw-r--r-- 1 root root 147 Aug 16 15:13 ddd --w--w--w- 2 1001 1001 49 Aug 10 12:58 file --------w- 1 root root 57 Aug 10 12:57 file2 drwxrwxrwx 2 root root 6 Aug 16 10:13 test [root@localhost qiuwei]# cat ddd 447872 4 --w--w--w- 2 1001 1001 49 Aug 10 12:58 ./file 447872 4 --w--w--w- 2 1001 1001 49 Aug 10 12:58 ./aaa
-ok command {}\;对查找到的每个文件执行有command指定的命令;
执行命令之前,都会交互式要求用户确认
-exex command {}\;对查找到的每个文件执行有command指定的命令;
直接执行命令,不会有交互式,所以要谨慎使用
find命令传递查找的文件至后面的命令时,是所有参数一次性传递的
但是有些命令接受参数的个数是有上限的,超过上限命令会失败,
可使用 find|xargs command
以下命令区别在于是否有交互式
总结:
find在整个磁盘上遍历整个文件系统查找文件
查找路径
查找条件:
1.根据文件名和inode
2.属主属组
3.文件类型
4.文件大小
5.时间戳
6.权限
7.可根据德.摩根定律组合查找
处理动作
可跟一些命令对查找出来的文件进行处理
练习
1 、查找/var 目录下属主为root ,且属组为mail 的所有文件
指令
find /var -user root -group mail
2 、查找/var 目录下不属于root 、lp 、gdm 的所有文件
匹配到的文件挺多的,只选了两行
方法1
find /var -not \( -user root -o -user lp -o -user gdm \) -ls |head -2
方法2
-a选项是默认的
find /var -not -user root -not -user lp -not -user gdm -ls |head -2
3 、查找/var 目录下最近一周内其内容修改过,同时属主不为
root ,也不是postfix 的文件
指令:
find /var -mtime -7 -not -user root -not -user postfix -ls |head -2
4 、查找当前系统上没有属主或属组,且最近一个周内曾被访
问过的文件
find / \( -nouser -o -nogroup \) -atime -7 -ls |head -2
5 、查找/etc 目录下大于1M 且类型为普通文件的所有文件
find -size +1M -type f -ls|head -3
6 、查找/etc 目录下所有用户都没有写权限的文件
说明:
都没有写权限理解为u没有写权限且g没有写权限且o没有写权限
(u无w)且(g无w)且(o无w)
根据德.摩根定律,可替换成
无(u有w 或 g有w 或 o有w)
都没有写权限可以表示为 -not -prem /222 ===>/222表示的就是或关系
find /etc -not -perm /222 -ls |head -2
7 、查找/etc 目录下至少有一类用户没有执行权限的文件
说明:至少有一类用户没有执行权限的反义就是全部都有执行权限,
我们找出全部都有执行权限的然后取反就可以了
find -not -perm -111 find -not -perm /100 -o -not -perm /010 -o -not -perm /001
8 、查找/etc/init.d 目录下,所有用户都有执行权限,且其它
用户有写权限的文件
说明:
find /etc/init.d -perm -113 -ls ===>查找init.d这个文件本身 错 find /etc/init.d/ -perm -113 -ls ===>进入init.d目录查找 对
排除 目录
示例:查找/etc/ 下,除/etc/sane.d 目录的其它所有.conf 后缀的文件
find /etc -path ‘/etc/sane.印,
如果-o前面的没有执行,就打印后面的,
这样就实现了排除
排除多个就在中间加上是那个 -o -path ‘/etc/sane.d’ -a -prune
压缩和解压缩
compress [-dfvcVr] [-b maxbits] [file …]
-d:解压缩
-c:结果输出至标准输出,不删除原文件
-v:显示过程
uncompress 解压缩
zcat
我的linux系统上没有安装此命令,安装也安装不上,所以就不演示了
gzip:
-d 解压缩,相当于gunzip
-c:将压缩或解压缩的结果输出至标准输出
-#:1-9 指定压缩比,值越大压缩比越大
zcat:不显示解压缩的前提下查看文本文件内容
备注:不能对硬链接文件进行压缩
bzip2
-k:keep 保留原文件
-d:解压缩
-#:1-9,压缩比,默认为6
bzcat:不显示解压缩的前提下查看文本文件的内容
xz
-k:keep,保留原文件
-d:解压缩
-#:压缩比,默认为6
xzcat:不显示解压缩的前提下查看文本文件的内容
和上面用法一样,就是压缩比例不一样,这里就不做演示了
zip
打包压缩
zip -r “生成压缩文件(可不带后缀)" "要压缩目录"
解包解压缩
unzip "压缩文件"
压缩cat /root/qiuwei/test |zip test – ==>这个-代表的是前面的输出
解压缩unzip -p test.zip >shab
原创文章,作者:qiuwei,如若转载,请注明出处:http://www.178linux.com/36051
评论列表(1条)
文章对当天的知识进行了完整的梳理与总结,对于脚本而言,我们需要记住的是其语法,而后多写,多看优秀的代码,对于find命令则要求我们熟练掌握了,因为这是在笔试中的一个重要考点。