- Shell作用和使用技巧
- Shell文件权限和脚本执行
- Shell变量类型和运算符
- Shell输入和输出功能
- Shell条件测试和流程控制
- Shell文件操作
- Linux启动流程和服务脚本
- Shell编写字符菜单管理
- Shell编写邮件报警脚本
- Shell信号捕捉和日志处理
- Shell如何操作Mysql数据库
- Shell结合cgi实现web功能
- Shell结合php实现web功能
- Rsync智能网站备份
一、Shell作用和使用技巧
1、Shell的作用
命令解释器,“翻译官”
shell命令,shell脚本
查看文件:ls
查看根目录下文件:ls /
清屏:clear
简单的循环:
<bash-3.2>inas@44-_-[/inas/inas/dream]# ls for.sh <bash-3.2>inas@44-_-[/inas/inas/dream]# cat for.sh #!/bin/bash #for.sh for i in a b c d e f do echo $i done <bash-3.2>inas@44-_-[/inas/inas/dream]# ./for.sh a b c d e f <bash-3.2>inas@44-_-[/inas/inas/dream]#
运行脚本命令:
sh for.sh
bash for.sh
./for.sh
for语句用一行表示:
webusr@iomtimer1:/bea/script/iom/ksprocess/tmpbak >for i in `cat *pid`;do echo \'kill -9 \'$i >> killprocess.sh;done webusr@iomtimer1:/bea/script/iom/ksprocess/tmpbak >cat killprocess.sh kill -9 4588444 kill -9 3605060 kill -9 6619324 kill -9 3932688 kill -9 6947664 kill -9 1049448 webusr@iomtimer1:/bea/script/iom/ksprocess/tmpbak >
#!/bin/bash #for.sh for (( i = 0; i < 10; i++ )); do #一行写多个命令用分号隔开 echo $i sleep 1 #循环1秒 done
开发模式技巧,通过scp或FileZilla登录后,在线打开编辑,通过专业编辑软件(例如Sublime Text3)进行开发,比vi、vim模式更便于开发。
2、Shell的常用技巧
登录工具,putty、SecureCRT
修改用户密码:
普通用户登录,修改自己的密码,passwd回车,会让你先输入自己的旧密码,再输入两遍新密码。
root用户登录,修改子用户密码,password username回车,就可以修改username的密码了,直接输入两遍新密码就可以了,不用输入旧密码。
关机及重启:
关机命令: 1、halt 立刻关机 2、poweroff 立刻关机 3、shutdown -h now 立刻关机(root用户使用) 4、shutdown -h 10 10分钟后自动关机 如果是通过shutdown命令设置关机的话,可以用shutdown -c命令取消重启 5、init 0 立即关机 重启命令: 1、reboot 2、shutdown -r now 立刻重启(root用户使用) 3、shutdown -r 10 过10分钟自动重启(root用户使用) 4、shutdown -r 20:35 在时间为20:35时候重启(root用户使用) 如果是通过shutdown命令设置重启的话,可以用shutdown -c命令取消重启 5、init 6 立即重启 或 init 1 init 是所有进程的祖先,它的进程号始终为1,所以发送TERM信号给init会终止所有的用户进程,守护进程等,init定义了8个运行级别(runlevel),init 0为关机,init 1为重启。
关机重启系列命令的区别,参考文章:https://www.cnblogs.com/zhangbing12304/p/8185346.html
退出会话:exit
3、Shell重定向和管道
Bash常用功能
解释器:
#!/bin/bash
#!/bin/ksh
#!/usr/bin/env python
Tab键自动补齐:
bash下,按下tab键会自动识别并补全命令。
命令历史:
[webusr@iomweb1 network-scripts]$ history -c #清楚历史命令 [webusr@iomweb1 network-scripts]$ history #查看历史命令 29 hisroty 30 history 31 ls 32 clear 33 history [webusr@iomweb1 network-scripts]$ !31 #实际上执行的是历史中第31条命令 ls ifcfg-bond0 ifdown ifdown-isdn ifdown-TeamPort ifup-ib ifup-post ifup-tunnel ifcfg-eno1 ifdown-bnep ifdown-post ifdown-tunnel ifup-ippp ifup-ppp ifup-wireless ifcfg-eno2 ifdown-eth ifdown-ppp ifup ifup-ipv6 ifup-routes init.ipv6-global ifcfg-eno3 ifdown-ib ifdown-routes ifup-aliases ifup-isdn ifup-sit network-functions ifcfg-eno4 ifdown-ippp ifdown-sit ifup-bnep ifup-plip ifup-Team network-functions-ipv6 ifcfg-lo ifdown-ipv6 ifdown-Team ifup-eth ifup-plusb ifup-TeamPort [webusr@iomweb1 network-scripts]$
命令别名
别名使用:为使用频率较高的复杂命令行设置简短的调用名称
存放位置:~/.bashrc #放到这里永久生效
查看命令别名:alias [别名]
设置命令别名:alias 别名=\'实际执行的命令\'
取消已设置的命令别名:unalias 别名
<bash-3.2>inas@44-_-[/inas/inas/dream]# ddd bash: ddd: command not found <bash-3.2>inas@44-_-[/inas/inas/dream]# alias ddd=\'df -m\' #定义别名 <bash-3.2>inas@44-_-[/inas/inas/dream]# ddd #使用别名 Filesystem 1M-blocks Used Available Use% Mounted on /dev/hd4 4096 66 4031 2% / /dev/hd2 6144 2509 3636 41% /usr /dev/hd9var 4096 813 3284 20% /var /dev/hd3 10240 6413 3828 63% /tmp /dev/hd1 5120 2414 2707 48% /home /proc - - 0 - /proc /dev/hd10opt 2048 448 1601 22% /opt /dev/lv_oracle 20480 5994 14487 30% /oracle /dev/lv_csm 10240 42 10199 1% /csm /dev/lv_inas 40960 32085 8876 79% /inas <bash-3.2>inas@44-_-[/inas/inas/dream]# unalias ddd #卸除别名 <bash-3.2>inas@44-_-[/inas/inas/dream]# ddd bash: ddd: command not found <bash-3.2>inas@44-_-[/inas/inas/dream]# alias #查看系统自定义及默认的别名信息 alias ll=\'ls -al\' alias ls=\'/usr/linux/bin/ls --color=auto\' alias vi=\'/opt/freeware/bin/vim\' <bash-3.2>inas@44-_-[/inas/inas/dream]#
输出重定向:对处理结果进行再次处理
重定向存储记录
<bash-3.2>inas@44-_-[/inas/inas/dream]# ls / >root.txt <bash-3.2>inas@44-_-[/inas/inas/dream]# ls -lrt total 8 -rwxr-xr-x 1 inas inas 128 Mar 6 19:37 for.sh -rw-r--r-- 1 inas inas 206 Mar 7 15:03 root.txt <bash-3.2>inas@44-_-[/inas/inas/dream]# cat root.txt INAS Mail TT_DB audit bin bosinst.data<bash-3.2>inas@44-_-[/inas/inas/dream]#
bash的重定向操作:改变标准输入、标准输出、标准错误的方向
1>>正确时输出,>和>>默认是1(正确时输出)
2>>错误时输出
&> 正确、错误 时都输出
bash red.sh 1>> net.txt 2 >&1 用bash解释器运行red.sh正确(1)结果输入net.txt,并将错误(2)结果重定向给net.txt中。
管道操作“|”和grep(grep -i 忽略大小写):把前边的值赋值给后边的运算
<bash-3.2>inas@44-_-[/inas/inas/dream]# df -m|grep inas /dev/lv_inas 40960 33874 7087 83% /inas <bash-3.2>inas@44-_-[/inas/inas/dream]# df -m|grep inas|awk \'{print $4}\' 7087 <bash-3.2>inas@44-_-[/inas/inas/dream]# df -m|grep inas|awk \'{print $2,$3,$4}\' 40960 33875 7086 <bash-3.2>inas@44-_-[/inas/inas/dream]# df -m|grep -i inas|awk \'{print "total:\n"$2"\n"$3"\n"$4}\' total: 40960 33877 7084 <bash-3.2>inas@44-_-[/inas/inas/dream]# df -m|grep -i inas|awk \'{print "total:"$2"\nuse:"$3"\nfree:"$4}\' total:40960 use:33879 free:7082 <bash-3.2>inas@44-_-[/inas/inas/dream]#
使用管道批量杀进程
grep -v 反向查找,例如grep -v grep 查找不含"grep"的内容
批量杀进程 ps -ef | grep java|grep -v grep | awk \'{print $2}\'|xargs kill -9 ps -ef | grep java |grep "=vociedmin" | grep -v grep | awk \'{print $2}\'|xargs kill -9 ---管理 ps -ef | grep java |grep "NodeManager" | grep -v grep | awk \'{print $2}\'|xargs kill -9 ---节点 efile92@iomitfdb2:/interface/contabfile/exceptiondeal >ls -l|grep exception -rw-r----- 1 efile92 jiekou 50 Mar 14 18:10 p_deal_exception.log -rwxr-xr-x 1 efile92 jiekou 703 Nov 11 2016 p_deal_exception.sh -rw-r----- 1 efile92 jiekou 1348 Mar 14 17:51 p_deal_exception_hour.log -rwxr-x--- 1 efile92 jiekou 702 Mar 14 16:52 p_deal_exception_hour.sh efile92@iomitfdb2:/interface/contabfile/exceptiondeal >ls -l|grep exception|grep -v p_deal_exception_hour.sh -rw-r----- 1 efile92 jiekou 50 Mar 14 18:10 p_deal_exception.log -rwxr-xr-x 1 efile92 jiekou 703 Nov 11 2016 p_deal_exception.sh -rw-r----- 1 efile92 jiekou 1348 Mar 14 17:51 p_deal_exception_hour.log efile92@iomitfdb2:/interface/contabfile/exceptiondeal > efile92@iomitfdb2:/interface/contabfile/exceptiondeal > efile92@iomitfdb2:/interface/contabfile/exceptiondeal >ls -l|grep exception|grep -v log -rwxr-xr-x 1 efile92 jiekou 703 Nov 11 2016 p_deal_exception.sh -rwxr-x--- 1 efile92 jiekou 702 Mar 14 16:52 p_deal_exception_hour.sh efile92@iomitfdb2:/interface/contabfile/exceptiondeal >
查看IP信息
Aix系统命令ifconfig -a,Linux系统命令ifconfig
<bash-3.2>inas@44-_-[/inas/inas/dream]# ifconfig -a en0: flags=5e080863,c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),PSEG,LARGESEND,CHAIN> inet 10.193.139.38 netmask 0xffffffc0 broadcast 10.193.139.63 inet 10.193.139.44 netmask 0xffffffc0 broadcast 10.193.139.63 tcp_sendspace 131072 tcp_recvspace 65536 rfc1323 0 en4: flags=1e080863,c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),LARGESEND,CHAIN> inet 192.168.1.143 netmask 0xffffff00 broadcast 192.168.1.255 lo0: flags=e08084b<UP,BROADCAST,LOOPBACK,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT> inet 127.0.0.1 netmask 0xff000000 broadcast 127.255.255.255 inet6 ::1/0 tcp_sendspace 131072 tcp_recvspace 131072 rfc1323 1 <bash-3.2>inas@44-_-[/inas/inas/dream]#
更改IP地址:
临时(服务器重启后失效):ifconfig eth0 192.168.100.3
永久(修改网卡,重启系统后生效):
vi /etc/sysconfig/network-scripts/ifcfg-eth0
或:
[webusr@iomweb1 network-scripts]$ cat /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 TYPE=bonding ONBOOT=yes BOOTPROTO=none IPADDR=132.78.140.16 NETMASK=255.255.255.192 GATEWAY=132.78.140.1 USERCTL=no BONDING_OPTS="mode=1 miimon=100" [webusr@iomweb1 network-scripts]$
安装包:yum -y install httpd* #yum自动识别并安装httpd相关的包
启动服务:service httpd start
重启服务:service httpd restart
停止服务:service httpd stop
查看挂载信息、磁盘信息:df -th、df -k/m/g、du -k/m/g
二、Shell文件权限和脚本执行
4、认识权限和用户管理
查看文件属性:ls -l file 权限类型: rwx 读,写,执行 -rw-r--r-- 1 root root 41 Jul 19 10:49 file #root用户对file具有rw权限 #root组其他用户对file具有r权限 #other其他所有人对file具有r权限 #第一个root是创建file文件的所有者 #第二个root是创建file文件的所属组 <bash-3.2>inas@44-_-[/inas/inas/dream]# ll total 12 drwxr-xr-x 3 inas inas 256 Mar 7 18:42 . drwxr-xr-x 28 inas inas 4096 Mar 7 17:18 .. -rwxr-xr-x 1 inas inas 128 Mar 6 19:37 for.sh -rw-r--r-- 1 inas inas 206 Mar 7 15:03 root.txt drwxr-xr-x 2 inas inas 256 Mar 7 18:42 test #d表示目录,即directory <bash-3.2>inas@44-_-[/inas/inas/dream]#
Linux权限:
1.r 读
2.w 写
3.x 执行
Linux用户:
1.所有者(u)
2.所属组(g)
3.其他用户(o)
4.所有用户(a)
文件权限:
--rw-r--r-- 1 root root 0 Oct 19 12:21 shell.txt
1.所有者(root用户)对shell.txt具有rw(读写)的权限
2.所属组(root组内用户)对shell.txt具有r(只读)的权限
3.其他用户(root以外用户)对shell.txt具有r(只读)的权限
用户管理:
1.查看用户:id user1,例如 id root 查看root用户信息
2.用户添加:useradd user1
3.用户删除:userdel -r user1
4.修改密码:passwd user1
inas@jm_csminf2:/inas/inas/dream >id inas #查看ians用户组信息 uid=202(inas) gid=206(inas) groups=1(staff) inas@jm_csminf2:/inas/inas/dream > <bash-3.2>inas@44-_-[/inas/inas/dream]# cat /etc/passwd #查看系统用户信息 root:!:0:0::/:/usr/bin/ksh daemon:!:1:1::/etc: bin:!:2:2::/bin: sys:!:3:3::/usr/sys: adm:!:4:4::/var/adm: guest:!:100:100::/home/guest: oracle:!:1000:1::/home/oracle:/usr/bin/ksh admin1:!:203:4::/home/admin1:/usr/bin/ksh csm:!:300:1::/home/csm:/usr/bin/ksh inas:!:202:206::/inas/inas:/usr/bin/ksh mysql:*:205:203::/home/mysql:/usr/bin/ksh bj-4a:!:40233:4023::/home/bj-4a:/usr/bin/rksh sshd:*:206:205::/var/empty:/usr/bin/ksh <bash-3.2>inas@44-_-[/inas/inas/dream]# cat /etc/group #查看系统用户组信息 system:!:0:root,esaadmin staff:!:1:ipsec,esaadmin,oracle,admin1,csm,inas,oscheck,mysql,bj-4a,sshd bin:!:2:root,bin sys:!:3:root,bin,sys adm:!:4:bin,adm,admin1,oscheck usr:!:100:guest dba:!:1000:oracle hagsuser:!:1001:oracle csm:!:300:csm inas:!:206:inas mysql:!:203:mysql bj4a:!:4023:bj-4a sshd:!:205:sshd <bash-3.2>inas@44-_-[/inas/inas/dream]# useradd user1 #增加用户 <bash-3.2>inas@44-_-[/inas/inas/dream]# userdel -r user1 #删除用户 #建完用户后,会分别在home、passw、group下新增信息 <bash-3.2>inas@44-_-[/inas/inas/dream]# ls /home admin1 guest inas oracle <bash-3.2>inas@44-_-[/inas/inas/dream]# cat /etc/passwd #存用户的信息 user1:x:500:500::/home/user1:/bin/bash <bash-3.2>inas@44-_-[/inas/inas/dream]# cat /etc/group #存用户的组信息 user1:x:500: <bash-3.2>inas@44-_-[/inas/inas/dream]# cat /etc/shadow #存用户的密码,两个感叹号!表示用户密码,这里没有设置密码 user1:!:16362:0:99999:7::: <bash-3.2>inas@44-_-[/inas/inas/dream]# passwd user1 #修改用户密码为123 <bash-3.2>inas@44-_-[/inas/inas/dream]# cat /etc/shadow user1:$1$3zu3p/Jz$UGxL1jcuTnKUg6.CCXjvl1:16362:0:99999:7:::
普通用户的家目录都是在"/home/用户"目录下,root用户的家目录在/root/下
用户与组:
1.新建组:groupadd grp1
2.删除组:groupdel grp1
3.把用户加入组:gpasswd -a user1 root
4.把组中用户删除:gpasswd -d user1 root
<bash-3.2>inas@44-_-[/inas/inas/dream]# useradd user1 <bash-3.2>inas@44-_-[/inas/inas/dream]# id user1 uid=500(user1) gid=500(user1) groups=500(user1) <bash-3.2>inas@44-_-[/inas/inas/dream]# gpasswd -a user1 root #将user1加入到root组 Adding user user1 to group root <bash-3.2>inas@44-_-[/inas/inas/dream]# id user1 #user1用户属于user1组、和root组 uid=500(user1) gid=500(user1) groups=500(user1),0(root) <bash-3.2>inas@44-_-[/inas/inas/dream]# gpasswd -d user1 root #将user1从root组删除 Removing user user1 to group root <bash-3.2>inas@44-_-[/inas/inas/dream]# id user1 uid=500(user1) gid=500(user1) groups=500(user1)
5、chmod权限分配
用户文件关系-权限
1.chmod:
读 :r 4
写 :w 2
执行:x 1
chmod 755 file #需要三个类型一起授权,u(当前用户)为7,g(当前组)为5,o(其他用户)为5
2.acl
3.sudo 用户对脚本、应用程序
<bash-3.2>inas@44-_-[/inas/inas/dream]# touch root.txt <bash-3.2>inas@44-_-[/inas/inas/dream]# chmod o+w root.txt #授权给root外其他用户 <bash-3.2>inas@44-_-[/inas/inas/dream]# ll total 4 -rw-r--rw- 2 root root 93 Oct 19 13:43 root.txt <bash-3.2>inas@44-_-[/inas/inas/dream]# chmod o-w root.txt #收回对root外其他用户写root.txt的权限 <bash-3.2>inas@44-_-[/inas/inas/dream]# ll total 4 -rw-r--r- 2 root root 93 Oct 19 13:43 root.txt <bash-3.2>inas@44-_-[/inas/inas/dream]# chmod g+w root.txt #给所属组(root)授权写root.txt的权限 <bash-3.2>inas@44-_-[/inas/inas/dream]# ll total 4 -rw-rw-r- 2 root root 93 Oct 19 13:43 root.txt <bash-3.2>inas@44-_-[/inas/inas/dream]# gpassd -a user1 root #将user1加入到root组 <bash-3.2>inas@44-_-[/inas/inas/dream]#id user1 uid=500(user1) gid=500(user1) groups=500(user1),0(root) <bash-3.2>inas@44-_-[/inas/inas/dream]# chmod o+w,o+x root.txt #同时授多个权限 <bash-3.2>inas@44-_-[/inas/inas/dream]# chmod a+x root.txt #a表示所有用户,给所有用户都授x权限 <bash-3.2>inas@44-_-[/inas/inas/dream]# ll total 4 -rwxrwxr-x 2 root root 93 Oct 19 13:43 root.txt
6、acl权限分配
acl的权限控制
【如果是文件内容,直接对文件进行权限操作,如果是文件本身,只能对文件所在的目录进行权限操作】
解决不同用户或组对统一文件不同权限的处理。
1.设置权限:setfacl -m u:user1:rwx /test
2.查看权限:getfacl /test
3.删除user1在/test上的权限:setfacl -x u:user1 /test
4.删除/test上所有acl权限:setfacl -b /test
5.设置acl的默认权限:setfacl -m d:u:user1:rwx test
#当前目录的子目录会继承目录的acl权限
6.创建和删除文件权限:需要对目录设置acl权限即可
[webusr@iomweb1 dream]$ setfacl -m u:iomdicp:r /mnt
7.如何对目录以及子目录和文件设置acl权限(递归)
[webusr@iomweb1 dream]$ setfacl -m u:iomdicp:r -R /mnt
8.目录中后期添加的子目录和文件如何继承父目录的权限
[webusr@iomweb1 dream]$ setfacl -m u:iomdicp:r -R /mnt #对目录及子目录进行授权(递归)
[webusr@iomweb1 dream]$ setfacl -m d:u:iomdicp:r -R /mnt #设置默认权限
[webusr@iomweb1 dream]$ touch root.txt [webusr@iomweb1 dream]$ ll 总用量 0 -rw-r-----. 1 webusr webgrp 0 3月 11 12:44 root.txt [webusr@iomweb1 dream]$ getfacl root.txt #查看权限 # file: root.txt # owner: webusr # group: webgrp user::rw- group::r-- other::--- [webusr@iomweb1 dream]$ setfacl -m u:test:rw root.txt #如果所授权用户不存在,则报错 setfacl: Option -m: 无效的参数 near character 3 [webusr@iomweb1 dream]$ setfacl -m u:iomdicp:rw root.txt #授权:将root.txt文件授予iomdicp用户rw权限 [webusr@iomweb1 dream]$ ll 总用量 4 -rw-rw----+ 1 webusr webgrp 0 3月 11 12:44 root.txt [webusr@iomweb1 dream]$ getfacl root.txt # file: root.txt # owner: webusr # group: webgrp user::rw- user:iomdicp:rw- group::r-- mask::rw- other::--- [webusr@iomweb1 dream]$ setfacl -x user:iomdicp root.txt #收回权限:收回root.txt对iomdicp授予的所有权限,如果只是部分收回,用授权的命令修改权限 [webusr@iomweb1 dream]$ getfacl root.txt # file: root.txt # owner: webusr # group: webgrp user::rw- group::r-- mask::r-- other::--- [webusr@iomweb1 dream]$ ll 总用量 4 -rw-r----- 1 webusr webgrp 0 3月 11 12:44 root.txt [webusr@iomweb1 dream]$ setfacl -m u:iomdicp:r /mnt #对目录进行授权 [webusr@iomweb1 dream]$ setfacl -m u:iomdicp:r -R /mnt #对目录及子目录进行授权(递归) [webusr@iomweb1 dream]$ setfacl -m d:u:iomdicp:r -R /mnt #设置默认权限
sudo授权
visudo,对应用程序或命令进行权限控制
需要密码:user1 localhost=/usr/sbin/useradd
不需要密码:user1 ALL=NOPASSWD:/usr/bin/passwd
设置用户命令的执行权限-visudo
1.设置 visudo user4 localhost=/usr/sbin/useradd 或 user4 localhost=/usr/sbin/useradd,/usr/sbin/userdel 2.使用有密码sudo授权命令 sudo /usr/sbin/useradd user5 #增加用户 sudo /usr/sbin/useradd -r user5 #删除用户 id user5 #查看用户信息 3.使用无密码的sudo授权命令 user5 localhost=NOPASSWD: /usr/sbin/useradd,/usr/sbin/userdel 或 user5 ALL=NOPASSWD: /usr/sbin/useradd,/usr/sbin/userdel
7、脚本执行和编写
shell脚本的概念:
1.用途:完成特定的、较复杂的系统管理任务
2.格式:集中保存多条Linux命令,普通文本文件
3.执行方式:按照预设的顺序依次解释执行
建立包含执行语句的脚本文件
#脚本文件中包含的内容
- 运行环境设置:#!/bin/bash
- 注释信息:以#开始的说明性文字
- 可执行的Linux命令行
为脚本文件添加可执行权限
执行shell脚本的方式:
1.bash test.sh
#不需要解析器
#不需要给脚本设置执行权限
2../test.sh
#需要写解析器
#需要给脚本设置执行权限
shell脚本小例子:
#!/bin/bash #for.sh echo \'dick space\' echo df -m echo echo \'free space\' echo free -m echo echo \'user:\' for i in `ls /home` do id -u $i done for (( i = 0; i < 10; i++ )); do #statements echo $i done
ls -lhR 查看目录详细信息,并以树形结构展示。
<bash-3.2>inas@44-_-[/inas/inas/dream]# ls -lhR .: total 8.0K drwxr-xr-x 2 inas inas 256 Mar 11 14:00 a -rwxr-xr-x 1 inas inas 205 Mar 11 2019 for.sh -rw-r--r-- 1 inas inas 206 Mar 8 17:38 root.txt drwxr-xr-x 2 inas inas 256 Mar 7 18:42 test ./a: total 0 ./test: total 0
三、Shell变量类型和运算符
8、变量的定义和使用
Shell变量的种类
用户自定义变量:由用户自己定义、修改和使用
预定义变量:Bash预定义的特殊变量,不能直接修改
位置变量:通过命令行给程序执行参数
定义新的变量:
变量名要以英文字母或下划线开头,区分大小写
格式:变量名=变量值
查看变量的值:echo $变量名
<bash-3.2>inas@44-_-[/inas/inas/dream]# day=sunday <bash-3.2>inas@44-_-[/inas/inas/dream]# echo $day sunday <bash-3.2>inas@44-_-[/inas/inas/dream]# echo ${day} sunday <bash-3.2>inas@44-_-[/inas/inas/dream]# echo "The Today is ${day}dd" The Today is sundaydd <bash-3.2>inas@44-_-[/inas/inas/dream]#
从键盘输入内容为变量值:
格式:read [-p "信息"] 变量名
结合不通的引号为变量赋值:
双引号"":允许通过$符号应用其他变量值
单引号\'\':禁止应用其他变量值,$视为普通字符
反撇号``:将命令执行的结果输出给变量
单双引号是不能解析转义字符/n 、/t,例如:echo "$name \n"或echo \'$name \n\'
[webusr@iomweb1 dream]$ ls test.sh [webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #tets.sh #name="dream" read -p "please input your name:" name echo "my name is $name" echo "my name is ${name}" [webusr@iomweb1 dream]$ sh test.sh please input your name:dream my name is dream my name is dream [webusr@iomweb1 dream]$
删除变量:unset name
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #tets.sh #name="dream" read -p "please input your name:" name echo "my name is $name" unset name echo "my name is ${name}" [webusr@iomweb1 dream]$ sh test.sh please input your name:dream my name is dream my name is [webusr@iomweb1 dream]$
9、位置变量、预定义变量和运算符
位置变量(最多可以接收9个位置参数):表示$n,n为1~9之间的数字
sh test.sh one two three four five six
case相当于switch
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #tets.sh echo $1 echo $2 echo $3 echo $4 echo $5 echo $6 echo $7 echo $8 echo $9 echo $10 [webusr@iomweb1 dream]$ sh test.sh q w e r t y u i o q w e r t y u i o q0 [webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #tets.sh case $1 in start ) echo \'start...\' ;; stop ) echo \'stop...\' ;; esac[webusr@iomweb1 dream]$ sh test.sh stop stop... [webusr@iomweb1 dream]$
数学运算
计算整数表达式的运算结果:
格式:expr 变量1 运算符 变量2 …[运算符 变量n],也可以用双括号(())来表示
expr的常用运算符:
加法:+
减法:-
乘法:\*
除法:/
求模(取余)运算:%
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #tets.sh echo $(($1+$2)) expr $1 + $2[webusr@iomweb1 dream]$ sh test.sh 10 20 30 30 [webusr@iomweb1 dream]$ expr 10 + 20 30 [webusr@iomweb1 dream]$
[webusr@iomweb1 dream]$ expr 4 + 2 - 1 5 [webusr@iomweb1 dream]$ expr 5 % 2 1 [webusr@iomweb1 dream]$ expr 4 \* 3 12 [webusr@iomweb1 dream]$ expr 7 / 3 2 [webusr@iomweb1 dream]$
预定义变量
表示形式如下:
$#:命令行中位置参数的个数
$*:所有位置参数的内容
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
$0:当前执行的进程名
[webusr@iomweb1 dream]$ ./test.sh ./test.sh [webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #tets.sh echo "当前进程名称:"$0 echo "命令行中位置参数的个数:" $# echo "所有位置参数的内容:" $* echo "上一条命令执行后返回的状态,0为正常,非0标识异常或出错:" $? tot=0 for i in $*; do tot=$(($tot + $i)) done echo "程序$0共$#个参数($*)的和:"$tot [webusr@iomweb1 dream]$ sh test.sh 22 7 13 当前进程名称:test.sh 命令行中位置参数的个数: 3 所有位置参数的内容: 22 7 13 上一条命令执行后返回的状态,0为正常,非0标识异常或出错: 0 程序test.sh共3个参数(22 7 13)的和:42
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #tets.sh for i in $*; do echo $i sleep 1 done [webusr@iomweb1 dream]$ sh test.sh 4 7 2 4 7 2 [webusr@iomweb1 dream]$
判断语句:
[webusr@iomweb1 dream]$ #!/bin/bash #tets.sh ls if [[ $? == 0 ]]; then echo "上条命令执行成功" else echo "上条命令执行失败" fi [webusr@iomweb1 dream]$ sh test.sh test.sh 上条命令执行成功 [webusr@iomweb1 dream]$ sh test.sh test.sh:行4: luuuus: 未找到命令 上条命令执行失败
四、Shell输入和输出功能
10、Shell输入、输出功能和字符颜色设置
1)Shell输入、输出
#!/bin/bash #test.sh #-e可以解析字符串中的转义字符(但是最后一次执行完还要再换一行),否则\n单独不能实现换行 echo "my name is user123" #普通输出 echo -e "my name is user123\n my name is user456" #-n去掉换行,不能带键盘的输入,如果需要获取键盘输入,需要用read单独处理 echo -n "please input your name:" read name echo "keybord input1:"$name #-p 在一行实现提示,获取键盘输入,并赋给变量 read -p \'please input your name:\' name echo "keybord input2:"$name #echo 输出空行 echo echo \'########\'
其他输出命令:
cat 查看,预定义格式化输出
[webusr@iomweb1 dream]$ ls test.sh [webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh cat << x please choose your name: 1)user1 2)user2 3)user3 4)user4 x
[webusr@iomweb1 dream]$ sh test.sh please choose your name: 1)user1 2)user2 3)user3 4)user4 [webusr@iomweb1 dream]$
tee 输出一份并且保存一份,在前面程序执行的输出另存为新的文件中。
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh cat << x please choose your name: 1)user1 2)user2 3)user3 4)user4 x
[webusr@iomweb1 dream]$ [webusr@iomweb1 dream]$ ./test.sh |tee menu.txt please choose your name: 1)user1 2)user2 3)user3 4)user4 [webusr@iomweb1 dream]$ cat menu.txt please choose your name: 1)user1 2)user2 3)user3 4)user4 [webusr@iomweb1 dream]$ ls menu.txt test.sh [webusr@iomweb1 dream]$ ls |tee tt.txt menu.txt test.sh [webusr@iomweb1 dream]$ cat tt.txt menu.txt test.sh [webusr@iomweb1 dream]$
more 分页查看,即超过文本超过一页,则逐页读取
[webusr@iomweb1 dream]$ cat /etc/passwd |more root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt --More--
head,默认查看前10行,如果后面跟参数,表示查看前面n行。
[webusr@iomweb1 ~]$ cat /etc/passwd |head root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [webusr@iomweb1 ~]$ cat /etc/passwd |head -2 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin [webusr@iomweb1 ~]$
tail 默认查看后十行,如果后面跟参数,表示查看最后n行
[webusr@iomweb1 ~]$ cat /etc/passwd |tail sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin admin1:x:1000:1000:admin1:/home/admin1:/bin/bash webusr:x:501:501::/home/webgrp:/bin/bash weblogic:x:502:502::/bea:/bin/bash oscheck:x:202:4::/home/oscheck:/bin/bash bj-4a:x:40233:4023::/home/bj-4a:/bin/rbash sisips:x:40234:4024:SDCSS_User:/opt/Symantec/sdcssagent/IPS:/bin/sh iomdicp:x:40235:40235::/home/iomdicp:/bin/bash [webusr@iomweb1 ~]$ cat /etc/passwd |tail -2 sisips:x:40234:4024:SDCSS_User:/opt/Symantec/sdcssagent/IPS:/bin/sh iomdicp:x:40235:40235::/home/iomdicp:/bin/bash [webusr@iomweb1 ~]$
nl 给输出增加行号
nl /etc/passwd >>mypass.txt 给输出加上行号,并输出到mypass.txt文件中
[webusr@iomweb1 dream]$ cat /etc/passwd |head|nl 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin [webusr@iomweb1 dream]$ ls |nl 1 menu.txt 2 test.sh 3 tt.txt [webusr@iomweb1 dream]$ nl test.sh 1 #!/bin/bash 2 #test.sh 3 cat << x 4 please choose your name: 5 1)user1 6 2)user2 7 3)user3 8 4)user4 9 x [webusr@iomweb1 dream]$
2)颜色
CRT设置,默认CRT是黑白模式:
1、点击"选项"(Options)-"全局选项"(Global options)
2、左边选择"默认会话"(Default Session)
3、右边选择"编辑默认设置"(Edit default setting)
4、左边选择"外观"(Appearance)
5、右边的"当前颜色方案"(Current color scheme),选择"Traditional",确定
6、弹出的对话框选择"是"(yes)保存为默认配置。
7、以后再创建新的会话就会使用Traditional颜色方案了。
颜色设置格式 \033[前景颜色;背景颜色m] 前景颜色 和 背景颜色的顺序可以倒换 \033[0m] 表示恢复到系统默认颜色,否则前面的设置会影响后续的显示 例如:echo -e "\033[32;47m[my name is dream.]\033[0m" 解读:-e用来识别转义字符\上面语句前景色32绿色,背景色47白色,最后要重置系统默认颜色\033[0m, 前景颜色编码: 30 黑色,31 红色,32 绿色,33 棕色,34 蓝色,35 紫色,36 青色,37 白色,0 重置 背景颜色编码: 40 黑色,41 红色,42 绿色,43 棕色,44 蓝色,45 紫色,46 青色,47 白色 echo -e "\033[43;35m david use echo say Hello World \033[0m \n" printf "\033[44;36m david use printf say Hello World \033[0m \n" echo -e "\033[47;30;5m david use echo say \033[0m Hello World \n"
#一些设置字体颜色的命令如下: echo -e "\033[0m none \033[0m" echo -e "\033[30m black \033[0m" echo -e "\033[1;30m dark_gray \033[0m" echo -e "\033[0;34m blue \033[0m" echo -e "\033[1;34m light_blue \033[0m" echo -e "\033[0;32m green \033[0m" echo -e "\033[1;32m light_green \033[0m" echo -e "\033[0;36m cyan \033[0m" echo -e "\033[1;36m light_cyan \033[0m" echo -e "\033[0;31m red \033[0m" echo -e "\033[1;31m light_red \033[0m" echo -e "\033[0;35m purple \033[0m" echo -e "\033[1;35m light_purple \033[0m" echo -e "\033[0;33m brown \033[0m" echo -e "\033[1;33m yellow \033[0m" echo -e "\033[0;37m light_gray \033[0m" echo -e "\033[1;37m white \033[0m" echo -e "\033[0m none \033[0m" echo -e "\033[0m none \033[0m" echo -e "\033[0m none \033[0m" echo -e "\033[0m none \033[0m" echo -e "\033[0m none \033[0m" echo -e "\033[40;37m 黑底白字 \033[0m" echo -e "\033[41;30m 红底黑字 \033[0m" echo -e "\033[42;34m 绿底蓝字 \033[0m" echo -e "\033[43;34m 黄底蓝字 \033[0m" echo -e "\033[44;30m 蓝底黑字 \033[0m" echo -e "\033[45;30m 紫底黑字 \033[0m" echo -e "\033[46;30m 天蓝底黑字 \033[0m" echo -e "\033[47;34m 白底蓝字 \033[0m" echo -e "\033[4;31m 下划线红字 \033[0m" echo -e "\033[5;31m 红字在闪烁 \033[0m" echo -e "\033[8m 消隐 \033[0m "
五、Shell条件测试和流程控制
11、文件测试和整型测试
1)shell条件测试,条件测试的操作
test命令:
用户:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值
格式:test 条件表达式
测试文件状态:
格式:[操作符 文件或目录]
常用的测试操作符:
-d:测试是否为目录(Directory)
[webusr@iomweb1 dream]$ [ -d /etc ] [webusr@iomweb1 dream]$ echo $? 0 [webusr@iomweb1 dream]$
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
[webusr@iomweb1 dream]$ ls menu.txt test.sh [webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh if [ -f ./file1 ]; then echo "file is exists!" else echo "file is not exists!" fi[webusr@iomweb1 dream]$ sh test.sh file is not exists! [webusr@iomweb1 dream]$ touch file1 [webusr@iomweb1 dream]$ sh test.sh file is exists! [webusr@iomweb1 dream]$
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否可执行(Excute)该文件
-L:测试是否为符号连接(Link)文件
2)整数值比较
格式:[整数1 操作符 整数2]
常用的测试操作符:
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Less or Equal)
-ge:大于或等于(Greater or Equal)
[webusr@iomweb1 dream]$ cat test.sh
#!/bin/bash
#test.sh
age=30
if [ $age -ge 18 ];then
echo "已成年"
else
echo "未成年"
fi
[webusr@iomweb1 dream]$ sh test.sh
已成年
[webusr@iomweb1 dream]$
12、字符串测试和逻辑测试
1)字符串比较
字符串内容相同:str1 = str2
字符串内容不相同:str != str2
字符串内容为空:-z str1
登录校验示例:
[webusr@iomweb1 dream]$ cat test.sh
#!/bin/bash
#test.sh
read -p \'name:\' name
read -p \'pass:\' pass
if [ $name = \'admin\' ] && [ $pass = \'123\' ]
then
echo "登录成功!"
else
echo \'登录失败!\'
fi
[webusr@iomweb1 dream]$ sh test.sh
name:admin
pass:123
登录成功!
[webusr@iomweb1 dream]$ sh test.sh
name:dream
pass:123
登录失败!
[webusr@iomweb1 dream]$
查看当前系统登录的用户数,$? 返回上一条命令的执行结果
[webusr@iomweb1 dream]$ who
admin1 :0 2016-09-29 17:39 (:0)
webusr pts/1 2019-03-18 12:18 (132.77.255.145)
admin1 pts/0 2016-09-29 17:39 (:0)
[webusr@iomweb1 dream]$ who |wc -l
3[webusr@iomweb1 dream]$ [ `who |wc -l` -ge 1 ]
[webusr@iomweb1 dream]$ echo $? #标识上一条命令的执行结果
0
[webusr@iomweb1 dream]$
监控并发送邮件,主题“boot space warning”,查看邮件接收情况mail
[webusr@iomweb1 dream]$ cat test.sh
#!/bin/bash
#test.sh
bootspace=` df -Th|grep boot|awk \'{print $6}\'|cut -d \'%\' -f1`
if [ $bootspace -ge 50 ];then
echo "boot space greater than 50%" |mail -s \'boot space warning\' root@localhost
else
echo "boot space less than 50%"
fi
[webusr@iomweb1 dream]$ sh test.sh
boot space greater than 50%
这里使用grep、awk、cut,表示查看boot目录的空间使用率,以%分隔,返回第一部分
[webusr@iomweb1 dream]$ ls file1 menu.txt test.sh [webusr@iomweb1 dream]$ df -Th|grep boot/dev/sda1
ext4 190M 102M 74M 58% /boot [webusr@iomweb1 dream]$ df -Th|grep boot|awk \'{print $6}\'
58% [webusr@iomweb1 dream]$ df -Th|grep boot|awk \'{print $6}\'|cut -d \'%\' -f1
58 [webusr@iomweb1 dream]$
cut -d \':\' -f2 以:分隔,返回第二部分
[webusr@iomweb1 dream]$ ls -l
总用量 8
-rw-r-----. 1 webusr webgrp 0 3月 18 12:35 file1
-rw-r-----. 1 webusr webgrp 73 3月 14 15:34 menu.txt
-rwxr-x---. 1 webusr webgrp 90 3月 18 12:57 test.sh
[webusr@iomweb1 dream]$ ls -l|grep test|awk \'{print $8}\'|cut -d \':\' -f2
57
[webusr@iomweb1 dream]$
2)逻辑测试
-a 或 &&:逻辑与,“而且”的意思
-o或||:逻辑或,“或者”的意思
!=:逻辑否
[webusr@iomweb1 dream]$ [ -e /media/cdrom ] && echo "YES"
[webusr@iomweb1 dream]$ [ -e /bea/script ] && echo "YES"
YES
[webusr@iomweb1 dream]$
13、流程判断
1)if分支结构语法:
if [逻辑判断] ;then …… elsif [逻辑判断] then …… else …… fi
判断成绩等级:
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh score=91 if [ $score -lt 60 ] ;then echo \'<60\' elif [ $score -ge 60 ] && [ $score -lt 70 ] ;then echo \'60-70\' elif [ $score -ge 70 ] && [ $score -lt 80 ] ;then echo \'70-80\' elif [ $score -ge 80 ] && [ $score -lt 90 ] ;then echo \'80-90\' elif echo \'>90\' fi[webusr@iomweb1 dream]$ sh test.sh >90 [webusr@iomweb1 dream]$
2)case分支结构语法
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.shweek=`date +%w` case $week in 1) echo \'周一\' ;; 2) echo \'周二\' ;; 3) echo \'周三\' ;; *) echo "其他" ;; esac [webusr@iomweb1 dream]$ sh test.sh 其他 [webusr@iomweb1 dream]$
14、循环控制
while、for
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh num=3 while [ $num -gt 0 ] do tot=$(($tot+$num)) num=$(($num-1)) done echo $tot
[webusr@iomweb1 dream]$ sh test.sh 6 [webusr@iomweb1 dream]$
批量给user0-user10,修改密码。--stdin为标准输入。
#!/bin/bash #test.sh i=0 while [ $i -lt 10 ] do echo \'123\'|passwd --stdin user$i
i=$(($i+1)) done
while带if嵌套使用
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh i=0 while [ $i -lt 6 ] do if [ $((i%2)) -eq 0 ] then echo -e "\033[37;40m${i}\033[0m" else echo $i fi i=$(($i+1)) done [webusr@iomweb1 dream]$ sh test.sh 0 1 2 3 4 5 [webusr@iomweb1 dream]$
for in循环,由于是通过空格来识别的,所以可以通过读取文件内容的形式使用for in循环
#!/bin/bash #test.sh i=0
#for i in user1 user1 user3 for i in `cat user.txt` echo $i done
for in语句与awk配合使用
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh for i in ` cat /etc/passwd|awk -F: \'{print $1}\' ` do echo $i
echo $i >> user.txt done [webusr@iomweb1 dream]$ sh test.sh root bin daemon adm lp sync
15、循环把控和函数使用
#!/bin/bash #test.sh #批量新增用户并修改密码 for (( i = 0; i < 10; i++ )); do echo $i useradd user$i echo123 | passwd --stdin user$i done
break
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh for (( i = 0; i < 10; i++ )); do echo $i if [[ $i -eq 5 ]]; then break fi done [webusr@iomweb1 dream]$ sh test.sh 0 1 2 3 4 5 [webusr@iomweb1 dream]$
continue
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh for (( i = 0; i < 7; i++ )); do if [[ $i -eq 3 ]]; then echo continue fi echo $i done [webusr@iomweb1 dream]$ sh test.sh 0 1 2 4 5 6 [webusr@iomweb1 dream]$
练习:
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh read -p "Press some key,then press Return:" key case "$key" in [a-z]|[A-Z]) echo "It\'s a letter." ;; [0-9]) echo "It\'s a digit." ;; *) echo "It\'s function keys,Spacebar or others keys." esac[webusr@iomweb1 dream]$ sh test.sh Press some key,then press Return:7 It\'s a digit. [webusr@iomweb1 dream]$ sh test.sh Press some key,then press Return:o It\'s a letter. [webusr@iomweb1 dream]$ sh test.sh Press some key,then press Return:3p It\'s function keys,Spacebar or others keys. [webusr@iomweb1 dream]$
shift迁移语句:
用于迁移位置变量,讲$1-$9依次向左传递
1.例如,若当前脚本程序获得的位置变量如下:$1=file1、$2=file2、$3=file3、$4=file4
2.则执行依次shift命令后,各位置变量为:$1=file2、$2=file3、$3=file4
3.再次执行shift命令后,各位置变量为:$1=file3、$2=file4
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh tot=0 while [ $# -gt 0 ] do tot=$(($tot+$1)) shift done echo $tot [webusr@iomweb1 dream]$ sh test.sh 0 [webusr@iomweb1 dream]$ sh test.sh 10 20 30 60 [webusr@iomweb1 dream]$ sh test.sh 10 15 20 45 [webusr@iomweb1 dream]$
上面使用到了预定义变量,补充说明如下:
表示形式如下:
$#:命令行中位置参数的个数
$*:所有位置参数的内容
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
$0:当前执行的进程名
Shell函数应用
定义新的函数(function可以省略):
function 函数名{
命令序列
}
函数名(){
命令序列
}
调用已定义的函数:函数名
向函数内传递参数:参数1 参数2 …
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh function add(){ echo \'abcdefghijklmn\' } add add add [webusr@iomweb1 dream]$ sh test.sh abcdefghijklmn abcdefghijklmn abcdefghijklmn [webusr@iomweb1 dream]$
向函数传递1个参数
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh function add(){ num=$1 tot=0 for((i=1;i<=$num;i++)) do tot=$(($tot+$i)) done echo $tot } add 3 add 6 add 10 add 100 add 200 [webusr@iomweb1 dream]$ sh test.sh 6 21 55 5050 20100 [webusr@iomweb1 dream]$
向函数传递2个参数(数学运算,用两个小括号,或者用expr函数)
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh function add(){ #tot=$(($1+$2)) echo `expr $1 + $2` echo $tot } add 11 22
[webusr@iomweb1 dream]$ sh test.sh 33 [webusr@iomweb1 dream]$
六、Shell文件操作
16、Find查找命令详解
find . -name "*.txt" 在当前目录下找文件名以txt结尾的文件【当前目录可以不用写点“·”】
##在当前目录下查找txt结尾的文件
[webusr@iomweb1 dream]$ ls test.sh [webusr@iomweb1 dream]$ touch file1.txt file2.txt file3.txt [webusr@iomweb1 dream]$ ls file1.txt file2.txt file3.txt test.sh [webusr@iomweb1 dream]$ find . -name \'*.txt\' ./file2.txt ./file3.txt ./file1.txt
##在当前目录下查找file0-file4开头的文件 [webusr@iomweb1 dream]$ ls file1.txt file2.txt file3.txt file4.doc file5.xls file6.ppt test.sh [webusr@iomweb1 dream]$ find . -name \'file[0-4]*\' ./file4.doc ./file2.txt ./file3.txt ./file1.txt [webusr@iomweb1 dream]$
find . -name "[a-z]*" 在当前目录下找文件名以所有字母开头的文件
##查找以字母开头的文件 [webusr@iomweb1 dream]$ find . -name \'[a-z]*\' ./file4.doc ./file6.ppt ./file2.txt ./file5.xls ./file3.txt ./file1.txt ./test.sh [webusr@iomweb1 dream]$
find /etc -name "host*" 在/etc目录下找以host开头的文件
[webusr@iomweb1 dream]$ ls test.sh [webusr@iomweb1 dream]$ touch file1.txt file2.txt file3.txt [webusr@iomweb1 dream]$ ls file1.txt file2.txt file3.txt test.sh [webusr@iomweb1 dream]$ find . -name \'file*\' ./file2.txt ./file3.txt ./file1.txt [webusr@iomweb1 dream]$
find . -perm 755 在当前目录下找属性为755的文件
[webusr@iomweb1 dream]$ ls file1.txt file2.txt file3.txt file4.doc file5.xls file6.ppt test.sh [webusr@iomweb1 dream]$ find . -perm 755 [webusr@iomweb1 dream]$ chmod +755 *doc [webusr@iomweb1 dream]$ find . -perm 755 ./file4.doc [webusr@iomweb1 dream]$
find -user root 在当前目录下找属主为root的文件
##按照属主查找 [webusr@iomweb1 dream]$ ls -l 总用量 4 -rw-r-----. 1 webusr webgrp 0 3ÔÂ 22 19:11 file1.txt -rw-r-----. 1 webusr webgrp 0 3ÔÂ 22 19:09 file2.txt -rw-r-----. 1 webusr webgrp 0 3ÔÂ 22 19:09 file3.txt -rwxr-xr-x. 1 webusr webgrp 0 3ÔÂ 22 19:12 file4.doc -rw-r-----. 1 webusr webgrp 0 3ÔÂ 22 19:12 file5.xls -rw-r-----. 1 webusr webgrp 0 3ÔÂ 22 19:12 file6.ppt -rwxr-x---. 1 webusr webgrp 106 3ÔÂ 22 19:08 test.sh [webusr@iomweb1 dream]$ find -user webusr . ./file4.doc ./file6.ppt ./file2.txt ./file5.xls ./file3.txt ./file1.txt ./test.sh [webusr@iomweb1 dream]$
find /var -mtime -5 在/var下找更改时间为5天以内的文件
stat 目录 查看目录下文件的访问、更改、创建时间
[webusr@iomweb1 ~]$ ll 总用量 1177432 -rw-r--r--. 1 webusr webgrp 885513 3月 22 19:17 diskspace.log -rw-r--r--. 1 webusr webgrp 121 5月 15 2017 diskspace.txt -rw-r-----. 1 webusr webgrp 97388803 4月 18 2018 p27395085_1036_Generic.zip -rw-r-----. 1 webusr webgrp 38876542 4月 18 2018 p27419391_121300_Generic.zip -rw-r-----. 1 webusr webgrp 0 5月 25 2018 putcbssear.log -rw-r-----. 1 webusr webgrp 0 5月 25 2018 putcbssorder.log -rw-r-----. 1 webusr webgrp 0 2月 18 20:05 putcrmear.log -rw-r-----. 1 webusr webgrp 0 5月 25 2018 putopearear.log -rw-r-----. 1 webusr webgrp 0 5月 25 2018 putopearorder.log -rw-r--r--. 1 webusr webgrp 584 5月 15 2017 server_monitor.txt -rw-r-----. 1 webusr webgrp 42 5月 19 2016 startnode.sh -rw-r-----. 1 webusr webgrp 1068506707 4月 23 2018 wls1036_generic.jar drwxr-x---. 3 webusr webgrp 4096 12月 21 2016 xie [webusr@iomweb1 ~]$ clear [webusr@iomweb1 ~]$ cd /bea/script/iom/dream [webusr@iomweb1 dream]$ ll 总用量 4 -rw-r-----. 1 webusr webgrp 0 3月 22 19:11 file1.txt -rw-r-----. 1 webusr webgrp 0 3月 22 19:09 file2.txt -rw-r-----. 1 webusr webgrp 0 3月 22 19:09 file3.txt -rwxr-xr-x. 1 webusr webgrp 0 3月 22 19:12 file4.doc -rw-r-----. 1 webusr webgrp 0 3月 22 19:12 file5.xls -rw-r-----. 1 webusr webgrp 0 3月 22 19:12 file6.ppt -rwxr-x---. 1 webusr webgrp 106 3月 22 19:08 test.sh [webusr@iomweb1 dream]$ stat /bea/script/iom 文件:"/bea/script/iom" 大小:4096 块:8 IO 块:4096 目录 设备:fd03h/64771d Inode:1048583 硬链接:5 权限:(0775/drwxrwxr-x) Uid:( 502/weblogic) Gid:( 502/weblogic) 环境:unconfined_u:object_r:etc_runtime_t:s0 最近访问:2019-03-22 13:48:43.621853260 +0800 最近更改:2019-03-11 12:40:48.677791072 +0800 最近改动:2019-03-11 12:40:48.677791072 +0800 创建时间:- [webusr@iomweb1 dream]$ find /bea/script/iom -mtime +5 /bea/script/iom /bea/script/iom/wfsapp /bea/script/iom/wfsapp/process65 /bea/script/iom/wfsapp/process65/wfs.out /bea/script/iom/wfsapp/process65/wfs.pid /bea/script/iom/wfsapp/process65/wfs.sh /bea/script/iom/wfsapp/process65/runwfs.sh /bea/script/iom/monitor /bea/script/iom/monitor/weblogic_domain.sh /bea/script/iom/monitor/diskspace.txt /bea/script/iom/monitor/diskspace.sh
find /var -mtime +3 在/var下找更改时间在3天以前的文件
[webusr@iomweb1 dream]$ find /bea/script/iom -mtime -3 /bea/script/iom/dream /bea/script/iom/dream/file4.doc /bea/script/iom/dream/file6.ppt /bea/script/iom/dream/file2.txt /bea/script/iom/dream/file5.xls /bea/script/iom/dream/file3.txt /bea/script/iom/dream/file1.txt /bea/script/iom/dream/test.sh [webusr@iomweb1 dream]$
find /etc -type d 在/etc下找文件类型为d的目录文件
[webusr@iomweb1 dream]$ find /bea/script/iom -type d /bea/script/iom /bea/script/iom/wfsapp /bea/script/iom/wfsapp/process65 /bea/script/iom/wfsapp/process55 /bea/script/iom/dream /bea/script/iom/monitor [webusr@iomweb1 dream]$
find /etc -type l 在/etc下找文件类型为l的链接文件
[webusr@iomweb1 dream]$ find /bea/script -type l [webusr@iomweb1 dream]$
find . -size+1000000c 在当前目录下查找文件大小大于1M的文件,1M是1000000个字节
[webusr@iomweb1 script]$ ll -h /bea/script 总用量 8.0K drwxrwxr-x. 5 weblogic weblogic 4.0K 3月 11 12:40 iom drwxr-x---. 2 webusr webgrp 4.0K 8月 1 2016 singletask [webusr@iomweb1 script]$ find . -size +10000c ./iom/wfsapp/process65/wfs.out ./iom/wfsapp/process55/wfs.out
find . -perm 700 |xargs chmod 777 找出当前目录下的所有权限为700的文件,并把它权限重设为777
[webusr@iomweb1 dream]$ ll 总用量 16-rw-r-----. 1 webusr webgrp 0 3ÔÂ 25 18:17 file1.xls -rw-r-----. 1 webusr webgrp 0 3ÔÂ 25 18:17 file2.doc -rw-r-----. 1 webusr webgrp 0 3ÔÂ 25 18:17 file3.ppt -rwxr-x---. 1 webusr webgrp 103 3ÔÂ 25 18:10 test.sh [webusr@iomweb1 dream]$ find /bea/script/iom/dream -name \'file*\'|xargs chmod 777 [webusr@iomweb1 dream]$ ll 总用量 16-rwxrwxrwx. 1 webusr webgrp 0 3ÔÂ 25 18:17 file1.xls -rwxrwxrwx. 1 webusr webgrp 0 3ÔÂ 25 18:17 file2.doc -rwxrwxrwx. 1 webusr webgrp 0 3ÔÂ 25 18:17 file3.ppt -rwxr-x---. 1 webusr webgrp 103 3ÔÂ 25 18:10 test.sh [webusr@iomweb1 dream]$
fine . type f |xargs ls -l 找出文件并查看其详细信息
[webusr@iomweb1 dream]$ find /bea/script/iom/dream -name \'file*\'|xargs ls -l -rw-r-----. 1 webusr webgrp 0 3ÔÂ 25 18:17 /bea/script/iom/dream/file1.xls -rw-r-----. 1 webusr webgrp 0 3ÔÂ 25 18:17 /bea/script/iom/dream/file2.doc -rw-r-----. 1 webusr webgrp 0 3ÔÂ 25 18:17 /bea/script/iom/dream/file3.ppt [webusr@iomweb1 dream]$
xargs命令使用
##查找类型为目录的信息 [webusr@iomweb1 dream]$ find /bea/script/iom/dream -type d /bea/script/iom/dream /bea/script/iom/dream/a /bea/script/iom/dream/c /bea/script/iom/dream/b ##查找名字为file开头的文件 [webusr@iomweb1 dream]$ find /bea/script/iom/dream -name \'file*\' /bea/script/iom/dream/file4.doc /bea/script/iom/dream/file6.ppt /bea/script/iom/dream/file2.txt /bea/script/iom/dream/file5.xls /bea/script/iom/dream/file3.txt /bea/script/iom/dream/file1.txt ##xargs将前面的结果赋值给后面的命令 [webusr@iomweb1 dream]$ find /bea/script/iom/dream -name \'file*\'|xargs rm -rf [webusr@iomweb1 dream]$ find /bea/script/iom/dream -name \'file*\' [webusr@iomweb1 dream]$ ll 总用量 16 drwxr-x---. 2 webusr webgrp 4096 3?? 25 18:11 a drwxr-x---. 2 webusr webgrp 4096 3?? 25 18:11 b drwxr-x---. 2 webusr webgrp 4096 3?? 25 18:11 c -rwxr-x---. 1 webusr webgrp 103 3?? 25 18:10 test.sh [webusr@iomweb1 dream]$
17、Linux正则表达式详解
^linux 以linux开头的行
[webusr@iomweb1 dream]$ grep -E \'linux\' file linux is very much! Php is very linux much! phP is much linux [webusr@iomweb1 dream]$ grep -E \'^linux\' file linux is very much! [webusr@iomweb1 dream]$ grep -En \'^linux\' file 1:linux is very much! [webusr@iomweb1 dream]$
$php 以php结尾的行
[webusr@iomweb1 dream]$ grep -Eni \'linux$\' file 5:phP is much linux [webusr@iomweb1 dream]$
. 匹配任意单字符
[webusr@iomweb1 dream]$ grep -E \'linux\' file linux is very much! Php is very linux much! phP is much linux [webusr@iomweb1 dream]$ grep -E \'linux.\' file linux is very much! Php is very linux much! [webusr@iomweb1 dream]$ grep -Ei \'.linux\' file Php is very linux much! phP is much linux [webusr@iomweb1 dream]$
.+匹配任意多个字符
[webusr@iomweb1 dream]$ grep -E \'.+linux.+\' file Php is very linux much! [webusr@iomweb1 dream]$ grep -En \'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\' file 9:ip:192.168.0.1 [webusr@iomweb1 dream]$
.*匹配0个或者多个字符
[webusr@iomweb1 dream]$ grep -E \'.*linux.*\' file linux is very much! Php is very linux much! phP is much linux [webusr@iomweb1 dream]$
[0-9a-z] 匹配[]内任意一个字符
[webusr@iomweb1 dream]$ grep -En \'[0-9]\' file 7:my age is:30 9:ip:192.168.0.1 [webusr@iomweb1 dream]$ grep -En \'[0-9]+\' file 7:my age is:30 9:ip:192.168.0.1 [webusr@iomweb1 dream]$
(linux)+ 出现多次linux单词
[webusr@iomweb1 dream]$ grep -En \'(linux)+\' file 1:linux is very much! 5:Php is very linux much! 6:phP is much linux [webusr@iomweb1 dream]$
(web){2} web出现了2次以上
[webusr@iomweb1 dream]$ grep -En \'(very)+\' file 1:linux is very much! 2:java is very much! 3:php is very much? 9:mysql is veryveryvery much! much 10:Linux is much veryveryveryvery much! [webusr@iomweb1 dream]$ grep -En \'(very){3}\' file 9:mysql is veryveryvery much! much 10:Linux is much veryveryveryvery much! [webusr@iomweb1 dream]$ grep -En \'(very){2,3}\' file 9:mysql is veryveryvery much! much 10:Linux is much veryveryveryvery much! [webusr@iomweb1 dream]$
\ 只用来屏蔽一个元字符的特殊含义
[webusr@iomweb1 dream]$ grep -En \'[0-9]+.\' file 7:my age is:30 9:ip:192.168.0.1
[webusr@iomweb1 dream]$ grep -En \'[0-9]+\.\' file 9:ip:192.168.0.1
[webusr@iomweb1 dream]$ grep -En \'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\' file 9:ip:192.168.0.1 [webusr@iomweb1 dream]$
18、grep搜索命令详解
grep "li qq" * 在所有的文件中查找li qq文件
[webusr@iomweb1 dream]$ grep "linux" * file:linux is very much! file:Php is very linux much! file:phP is much linux [webusr@iomweb1 dream]$
grep -c "file" a 在a文件中有多少行匹配到file
[webusr@iomweb1 dream]$ grep -c "linux" file 3 [webusr@iomweb1 dream]$
grep -n "file" a 在a文件中有多少行匹配到file,同时显示行和行号
[webusr@iomweb1 dream]$ grep -n "linux" file 1:linux is very much! 4:Php is very linux much! 5:phP is much linux [webusr@iomweb1 dream]$
grep -i "file" a 在a文件中查找file,并不区分大小写
#匹配行号
[webusr@iomweb1 dream]$ grep -n \'linux\' file 1:linux is very much! 4:Php is very linux much! 5:phP is much linux #忽略大小写
[webusr@iomweb1 dream]$ grep -i \'linux\' file linux is very much! Php is very linux much! phP is much linux Linux is very much!
#忽略大小写且显示行号 [webusr@iomweb1 dream]$ grep -in \'linux\' file 1:linux is very much! 4:Php is very linux much! 5:phP is much linux 7:Linux is very much! [webusr@iomweb1 dream]$
grep -v "file" a 在a文件中过滤掉file所在的行【取反】
[webusr@iomweb1 dream]$ grep \'linux\' file linux is very much! Php is very linux much! phP is much linux [webusr@iomweb1 dream]$ grep -v \'linux\' file java is very much! php is very much! mysql is very much! Linux is very much! [webusr@iomweb1 dream]$ grep -vin \'linux\' file 2:java is very much! 3:php is very much! 6:mysql is very much! [webusr@iomweb1 dream]$
grep -E "2004:22:5[5-9]" a 在a文件中查找时间在2004:22:50->2004:22:59的所在行
这里的"-E"表示增强型grep,这时候就可以使用正则表达式
[webusr@iomweb1 dream]$ cat file 2004:22:32 login info 2004:22:50 user1 index.php 2004:22:52 user2 index.java 2004:22:55 user3 a.jsp 2004:22:59 user4 b.cpp [webusr@iomweb1 dream]$ grep -E "2004:22:5[5-9]" file 2004:22:55 user3 a.jsp 2004:22:59 user4 b.cpp [webusr@iomweb1 dream]$
grep -E "^[^210]" a 在a文件中查找不包含210的行
[webusr@iomweb1 dream]$ grep -Ein "linux" file 1:linux is very much! 5:Php is linux ery linux much! 6:phP is much linux 10:Linux is much veryveryveryvery much! [webusr@iomweb1 dream]$ grep -Ein "^[^linux]" file 2:java is very much! 3:php is very much? 5:Php is linux ery linux much! 6:phP is much linux 7:my age is:30 9:mysql is veryveryvery much! much [webusr@iomweb1 dream]$
grep -E "h*p" a 查找a文件中包含h和p的行
[webusr@iomweb1 dream]$ grep -E "P*p" file php is very much? Php is linux ery linux much! phP is much linux ip:192.168.0.1 [webusr@iomweb1 dream]$
grep -E "[5-8][6-9][0-3]" a 查找大于560小于893的行
[webusr@iomweb1 dream]$ grep -En "[5-8][6-9][0-3]" file 7:563 8:891 [webusr@iomweb1 dream]$
grep -E "4{2}" a 查找包含两个4的行
[webusr@iomweb1 dream]$ grep -En \'(very){2}\' file 4:veryveryvery 5:veryvery [webusr@iomweb1 dream]$ grep -En \'9{2}\' file 9:9999 [webusr@iomweb1 dream]$ grep -En \'(9){2}\' file 9:9999 [webusr@iomweb1 dream]$
grep -E "4{2,}" a 查找大于两个4的行
[webusr@iomweb1 dream]$ grep -En \'(very){2,}\' file 1:linux is veryveryyyyyy! 4:veryveryvery 5:veryvery [webusr@iomweb1 dream]$ grep -En \'9{2,}\' file 6:99123 7:999 8:9999 [webusr@iomweb1 dream]$ grep -En \'(9){2,}\' file 6:99123 7:999 8:9999 [webusr@iomweb1 dream]$
grep -E "4{2,4}" a 查找大于两个4小于4个4的行
[webusr@iomweb1 dream]$ grep -En \'(very){2,3}\' file 1:linux is veryveryyyyyy! 4:veryveryvery 5:veryvery [webusr@iomweb1 dream]$ grep -En \'(9){2,4}\' file 6:99123 7:999 8:9999 [webusr@iomweb1 dream]$ grep -En \'9{2,4}\' file 6:99123 7:999 8:9999 [webusr@iomweb1 dream]$
grep -E "^$" a 查找a文件中的空行
[webusr@iomweb1 dream]$ grep -En "^$" file 4: 7: [webusr@iomweb1 dream]$
grep "?" a 查找a文件中包含?的行
[webusr@iomweb1 dream]$ grep "?" file php is very much? [webusr@iomweb1 dream]$
grep -E "^d" a 查找a文件中以d开头的行
[webusr@iomweb1 dream]$ grep -E "^linux" file linux is very much! [webusr@iomweb1 dream]$
grep -E "^[^d]" a 查找a文件中不是以d开头的行
[webusr@iomweb1 dream]$ grep -E "^linux" file linux is very much! [webusr@iomweb1 dream]$ grep -Ein "^[^linux]" file 2:java is very much! 3:php is very much? 5:Php is very linux much! 6:phP is much linux 8:mysql is very much! [webusr@iomweb1 dream]$
grep -E增强grep,可以使用正则表达式,(/sbin/nologin) 用括号括起来,表示一个单元
[webusr@iomweb1 dream]$ cat /etc/passwd |grep -E \'(/sbin/nologin)$\' bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin pegasus:x:66:65:tog-pegasus OpenPegasus WBEM/CIM services:/var/lib/Pegasus:/sbin/nologin
19、Awk编辑工具使用
awk从文件中匹配信息
awk \'{print $0}\' access.log 查找出file文件中的每一列
[webusr@iomweb1 dream]$ awk \'{print $0}\' access.log |head -3 10.13.37.149 - - [15/六月/2016:10:21:24 +0800] "GET /favicon.ico HTTP/1.1" 404 1164 10.13.37.149 - - [15/六月/2016:11:32:08 +0800] "GET /favicon.ico HTTP/1.1" 404 1164 10.13.38.28 - - [15/六月/2016:13:41:55 +0800] "GET /favicon.ico HTTP/1.1" 404 1164
awk \'{print $1"\t"$7}\' access.log 查找出file文件中第1列和第7列
[webusr@iomweb1 dream]$ awk \'{print $1"\t"$7}\' access.log |head -3 10.13.37.149 /favicon.ico 10.13.37.149 /favicon.ico 10.13.38.28 /favicon.ico [webusr@iomweb1 dream]$
cat file|awk \'$0 !~/192.168.10.2/\'|grep "php"|wc -l 匹配192.168.10.2的ip地址的统计,!~为不匹配
##!~表示不匹配 [webusr@iomweb1 dream]$ cat file|awk \'$0 !~/192.168.10.2/\'|grep "php" 2004:22:50 user1 index.php [webusr@iomweb1 dream]$ cat file|awk \'$0 !~/192.168.10.2/\'|grep "php"|wc -l 1 ##~表示匹配 [webusr@iomweb1 dream]$ cat file|awk \'$0 ~/192.168.10.2/\'|grep "php" [webusr@iomweb1 dream]$ cat file|awk \'$0 ~/192.168.10.2/\'|grep "php"|wc -l 0 [webusr@iomweb1 dream]$
cut和awk用法对比
##cut用-d表示以分隔符分割,分隔符为冒号":",-f 1表示显示第一列 [webusr@iomweb1 dream]$ cat /etc/passwd | cut -d: -f 1 root bin daemon ##awk用F表示分割,这里分隔符为":",显示第一列 [webusr@iomweb1 dream]$ cat /etc/passwd|awk -F: \'{print $1}\' root bin daemon [webusr@iomweb1 dream]$ cat /etc/passwd | cut -d: -f 1,4 root:0 bin:1 daemon:2 [webusr@iomweb1 dream]$ cat /etc/passwd|awk -F: \'{print $1,$4}\' root 0 bin 1 daemon 2
awk的高级用法,配合head、tail使用
##head前5行
[webusr@iomweb1 dream]$ cat /etc/passwd |head -5|awk -F: \'{print "username:"$1" =>uid:"$3}\' username:root =>uid:0 username:bin =>uid:1 username:daemon =>uid:2 username:adm =>uid:3 username:lp =>uid:4 #tail后5行
[webusr@iomweb1 dream]$ cat /etc/passwd |tail -5|awk -F: \'{print "username:"$1" =>uid:"$3}\' username:weblogic =>uid:502 username:oscheck =>uid:202 username:bj-4a =>uid:40233 username:sisips =>uid:40234 username:iomdicp =>uid:40235 [webusr@iomweb1 dream]$
awk使用到循环中
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #test.sh for i in `cat /etc/passwd|head|awk -F: \'{print $1}\'` do echo $i done [webusr@iomweb1 dream]$ sh test.sh root bin daemon adm lp sync shutdown halt mail operator
awk配合匹配行和列
##NR在awk中表示行数,print后面不接信息,表示全部打印 [webusr@iomweb1 dream]$ df|awk \'{if (NR==3){print}}\' devtmpfs 32870860 0 32870860 0% /dev ##打印第一列 [webusr@iomweb1 dream]$ df|awk \'{if (NR==3){print $1}}\' devtmpfs ##$0表示打印全部信息 [webusr@iomweb1 dream]$ df|awk \'{if (NR==3){print $0}}\' devtmpfs 32870860 0 32870860 0% /dev ##输出第一行,第五列 [webusr@iomweb1 dream]$ df|awk \'{if (NR==2){print $5}}\' 54% ##输出第一行,第五列,将百分百转为数值 [webusr@iomweb1 dream]$ df|awk \'{if (NR==2){print int($5)}}\' 54 [webusr@iomweb1 dream]$
awk中行NR,和列NF
##awk中:NF表示列,NR表示行 [webusr@iomweb1 dream]$ df|awk \'END{print NF,NR}\' 6 16 [webusr@iomweb1 dream]$ df|awk \'END{print "col:"NF,",row:"NR}\' col:6 ,row:16 [webusr@iomweb1 dream]$ df|awk \'END{print "col:"NF",row:"NR}\' col:6,row:16 [webusr@iomweb1 dream]$
20、Sed工具、Sort排序、Uniq统计及Split文件分隔
1)Sed行定位的使用
awk应用于列定位、grep应用于行匹配,sed是最佳的行定位
使用nl显示行号
[webusr@iomweb1 dream]$ nl file 1 2004:22:32 login info 2 2004:22:50 user1 index.php 3 2004:22:52 user2 index.java 4 2004:22:55 user3 a.jsp 5 2004:22:59 user4 b.cpp [webusr@iomweb1 dream]$
sed -n \'2\'p file 只打印第二行,不打印其他行
[webusr@iomweb1 dream]$ nl file 1 2004:22:32 login info 2 2004:22:50 user1 index.php 3 2004:22:52 user2 index.java 4 2004:22:55 user3 a.jsp 5 2004:22:59 user4 b.cpp [webusr@iomweb1 dream]$ sed -n \'2\'p file 2004:22:50 user1 index.php [webusr@iomweb1 dream]$ cat file|sed -n \'2\'p 2004:22:50 user1 index.php [webusr@iomweb1 dream]$
sed -n \'1,4\'p file 打印从第1行到第4行的记录
[webusr@iomweb1 dream]$ nl file 1 2004:22:32 login info 2 2004:22:50 user1 index.php 3 2004:22:52 user2 index.java 4 2004:22:55 user3 a.jsp 5 2004:22:59 user4 b.cpp [webusr@iomweb1 dream]$ sed -n \'1,3\'p file 2004:22:32 login info 2004:22:50 user1 index.php 2004:22:52 user2 index.java [webusr@iomweb1 dream]$ cat file|sed -n \'1,3\'p 2004:22:32 login info 2004:22:50 user1 index.php 2004:22:52 user2 index.java [webusr@iomweb1 dream]$
sed -n \'/los/\'p file 打印匹配的los的行
[webusr@iomweb1 dream]$ nl file 1 2004:22:32 login info 2 2004:22:50 user1 index.php 3 2004:22:52 user2 index.java 4 2004:22:55 user3 a.jsp 5 2004:22:59 user4 b.cpp [webusr@iomweb1 dream]$ sed -n \'/user1/\'p file 2004:22:50 user1 index.php [webusr@iomweb1 dream]$
sed -n \'4,/los/\'p file 打印从第4行匹配到los的之间的所有行(如果/los/不存在,则直接匹配到最后)
[webusr@iomweb1 dream]$ nl file 1 2004:22:32 login info 2 2004:22:50 user1 index.php 3 2004:22:52 user2 index.java 4 2004:22:55 user3 a.jsp 5 2004:22:59 user4 b.cpp [webusr@iomweb1 dream]$ sed -n \'3,/user3/\'p file 2004:22:52 user2 index.java 2004:22:55 user3 a.jsp [webusr@iomweb1 dream]$ cat file|sed -n \'3,/user3/\'p 2004:22:52 user2 index.java 2004:22:55 user3 a.jsp [webusr@iomweb1 dream]$
sed \'1,2\'d file 把第1行和第2行全部删除(只是删除显示,并没有实际删除)
[webusr@iomweb1 dream]$ nl file 1 2004:22:32 login info 2 2004:22:50 user1 index.php 3 2004:22:52 user2 index.java 4 2004:22:55 user3 a.jsp 5 2004:22:59 user4 b.cpp [webusr@iomweb1 dream]$ sed \'1,2\'d file 2004:22:52 user2 index.java 2004:22:55 user3 a.jsp 2004:22:59 user4 b.cpp [webusr@iomweb1 dream]$ cat file|sed \'1,2\'d file 2004:22:52 user2 index.java 2004:22:55 user3 a.jsp 2004:22:59 user4 b.cpp [webusr@iomweb1 dream]$
从rbash开始匹配到最后
[webusr@iomweb1 dream]$ cat /etc/passwd |sed -n \'/rbash/,$\'p bj-4a:x:40233:4023::/home/bj-4a:/bin/rbash sisips:x:40234:4024:SDCSS_User:/opt/Symantec/sdcssagent/IPS:/bin/sh iomdicp:x:40235:40235::/home/iomdicp:/bin/bash [webusr@iomweb1 dream]$
与其他命令配合使用
[webusr@iomweb1 iom]$ df -m 文件系统 1M-块 已用 可用 已用% 挂载点 /dev/mapper/rootvg-root 9952 4996 4429 54% / devtmpfs 32101 0 32101 0% /dev tmpfs 32111 1 32110 1% /dev/shm tmpfs 32111 2379 29733 8% /run [webusr@iomweb1 iom]$ df -m|nl|sed -n \'2\'p 2 /dev/mapper/rootvg-root 9952 4996 4429 54% / [webusr@iomweb1 iom]$ df -m|nl|sed -n \'2\'p|awk \'{print $6}\' 54% [webusr@iomweb1 iom]$ df -m|nl|sed -n \'2\'p|awk \'{print int($6)}\' 54 [webusr@iomweb1 iom]$
2)uniq行定位的使用
uniq -c file打印紧挨的重复行出现的次数
[webusr@iomweb1 dream]$ cat file aaaa aaaa bbbb cccc vvvv zzzz zzzz [webusr@iomweb1 dream]$ uniq file ##去重查看 aaaa bbbb cccc vvvv zzzz [webusr@iomweb1 dream]$ uniq -c file ##统计紧挨着的重复次数 2 aaaa 1 bbbb 1 cccc 1 vvvv 2 zzzz [webusr@iomweb1 dream]$
uniq -d file只打印重复的行
[webusr@iomweb1 dream]$ cat file aaaa aaaa bbbb cccc vvvv zzzz zzzz [webusr@iomweb1 dream]$ uniq -d file aaaa zzzz [webusr@iomweb1 dream]$
awk \'{print $1}\' /var/log/httpd/access_log|sort|uniq -c把apache网站的所有访问ip全部统计出来,并打印出统计次数
统计文件中重复行数(包括间隔重复,即非紧邻着的重复)
[webusr@iomweb1 dream]$ cat file |sort|uniq -c #升序排序后,统计重复次数 2 aaaa 1 bbbb 1 cccc 1 vvvv 2 zzzz [webusr@iomweb1 dream]$ cat file |sort -r|uniq -c #降序排序后,统计重复次数 2 zzzz 1 vvvv 1 cccc 1 bbbb 2 aaaa [webusr@iomweb1 dream]$
[webusr@iomweb1 dream]$ nl file 1 aaaa 2 aaaa 3 bbbb 4 cccc 5 vvvv 6 zzzz 7 zzzz [webusr@iomweb1 dream]$ wc -l file 7 file [webusr@iomweb1 dream]$ uniq -c file 2 aaaa 1 bbbb 1 cccc 1 vvvv 2 zzzz [webusr@iomweb1 dream]$
3)Sort排序
sort file把文件按字母的升序进行排序
[webusr@iomweb1 dream]$ sort file aaaa aaaa bbbb cccc vvvv zzzz zzzz [webusr@iomweb1 dream]$
sort -r file 把文件按字母的降序进行排序
[webusr@iomweb1 dream]$ sort -r file zzzz zzzz vvvv cccc bbbb aaaa aaaa [webusr@iomweb1 dream]$
cat file|sort -t:k 1-r 为“:”分割后的第一列来进行倒叙排序
[webusr@iomweb1 dream]$ cat file |sort -k1 a b c d 5 b a d c 4 c a h b 3 d e f a 2 f o j s 1 [webusr@iomweb1 dream]$ cat file |sort -k1 -r f o j s 1 d e f a 2 c a h b 3 b a d c 4 a b c d 5 [webusr@iomweb1 dream]$ cat file |sort -k5 f o j s 1 d e f a 2 c a h b 3 b a d c 4 a b c d 5 [webusr@iomweb1 dream]$ cat file |sort -k5 -r a b c d 5 b a d c 4 c a h b 3 d e f a 2 f o j s 1 [webusr@iomweb1 dream]$
4)split行分割的使用
split -2 file spt 生成fileab,fileac,…,filkai等多个文件,把a文件每2行分割成一个文件,每个文件的前缀都是以file开头的
[webusr@iomweb1 dream]$ cat file a b c d 5 b a d c 4 d e f a 2 c a h b 3 f o j s 1 [webusr@iomweb1 dream]$ ll -rw-r-----. 1 webusr webgrp 375113 3ÔÂ 15 07:56 access.log -rw-r-----. 1 webusr webgrp 50 3ÔÂ 28 18:38 file -rw-r-----. 1 webusr webgrp 20 3ÔÂ 28 18:43 sptaa -rw-r-----. 1 webusr webgrp 20 3ÔÂ 28 18:43 sptab -rw-r-----. 1 webusr webgrp 10 3ÔÂ 28 18:43 sptac -rwxr-x---. 1 webusr webgrp 92 3ÔÂ 27 18:03 test.sh [webusr@iomweb1 dream]$ cat sptaa a b c d 5 b a d c 4 [webusr@iomweb1 dream]$ cat sptab d e f a 2 c a h b 3 [webusr@iomweb1 dream]$ cat sptac f o j s 1 [webusr@iomweb1 dream]$
七、Linux启动流程和服务脚本
21、简述Linux服务器启动流程
Linux启动流程:
1、bios找到磁盘上的mbr主引导扇区
2、进入grub界面选择相应的启动内核
3、读取kernel内核文件-/boot/initrd-*
4、读取init的景象文件-/boot/initrd-*
5、init去读取/etc/inittab
6、读取启动级别(id:3:initdefault)
7、读取/etc/rc.d/rc.sysinit,完成时钟设置,主机名的设置,分区表的挂载(/etc/fstab)
8、读取/etc/rc.d/rc脚本,通过该焦恩吸收3级别,然后启动/etc/rc.d/rc3.d下所有以S开头的服务,不启动该目录下以K开头的服务
9、读取/etc/rc.d/rc.local脚本
10、进入登录界面
运行级别:
0 关机
1 单用户
2 不支持nfs(网络文件系统)
3 字符界面
4 未被使用
5 图形界面
6 重启
更改系统运行级别:init 0|3|5|6
查看运行级别:runlevel
Rpm包软件:
1、服务脚本:/etc/rc.d/init.d/httpd
2、开启或关闭:service httpd start|stop
3、开机启动:chkconfig --level 3 httpd on
源代码软件:
1、服务脚本
/usr/local/apache2/bin/apachetl
2、开启
/usr/local/apaches/bin/apachetl start|stop
3、开机启动
vi /etc/rc.d/rc.local
/usr/local/apache2/bin/apachectl start
自定义脚本头部:
#!/bin/bash
#myshd
#chkconfig:2345 90 20
#descripption:myshd server daemon
服务脚本调试:
1、使用service启动myshd脚本:service myshd start
2、设置开机启动:chkconfig myshd on
改造apache服务脚本:
1、复制源代码服务脚本
cp /usr/local/apache2/bin/apachetl/etc/init.d/
2、修改脚本
#chkconfig:2345 90 20
#description:apachectl server daemon
3、启动测试:service apachectl start
4、开机启动:chkconfig apachectl on
22、详述Linux服务器启动流程
Linux系统启动流程:
一、初始化阶段
1、grub引导界面
2、识别硬件
3、初始化驱动
二、加载/etc/rc.d/rc.sysinit系统初始化脚本
4、进入欢迎界面
5、设置时钟
6、设置主机名
7、挂载文件系统
8、挂载光驱
9、进入3级别
10、启动虚拟内存
11、设置磁盘阵列
三、加载/etc/rc.d/rc进程管理脚本
12、设置防火墙
13、检测硬件变化
14、启动网络服务
15、启动3级别下允许启动的进程(比如sshd)
14、进入登录界面
15、进入系统
23、如何自定义服务脚本及如何制作标准rpm服务脚本
把服务脚本改写成标准rpm脚本:
#chkconfig:2345 90 20
#description:Mytest server daemon
通过service把自定义脚本进行开启和关闭
service mytest start|stop|restart
通过chkconfig把自定义脚本设置开机启动:
chkconfig mytest on
chkconfig mytest off
实例操作如下*********************
自定义服务脚本:
[webusr@iomweb1 dream]$ cat mytest #!/bin/bash #mytest case $1 in start) echo \'mytest starting!!!\' sleep 1 ;; stop) echo \'mytest stoping!!!\' sleep 1 ;; restart) echo \'mytest restartint!!!\' sleep 1 ;; *) echo \'start|stop|restart\' ;; esac [webusr@iomweb1 dream]$ sh mytest start mytest starting!!! [webusr@iomweb1 dream]$ sh mytest stop mytest stoping!!! [webusr@iomweb1 dream]$ sh mytest restart mytest restartint!!! [webusr@iomweb1 dream]$ sh mytest 123 start|stop|restart [webusr@iomweb1 dream]$
给脚本设置开机启动:
[webusr@iomweb1 dream]$ vi /etc/rc.d/rc.local #!/bin/bash # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES # # It is highly advisable to create own systemd services or udev rules # to run scripts during boot instead of using this file. # # In contrast to previous versions due to parallel execution during boot # this script will NOT be run after all other services. # # Please note that you must run \'chmod +x /etc/rc.d/rc.local\' to ensure # that this script will be executed during boot. touch /var/lock/subsys/local #下面是自定义的开机脚本 /mnt/mytest start [webusr@iomweb1 dream]$
脚本要设置chkconfig参数
[webusr@iomweb1 dream]$ vi #!/bin/bash #mytest #以下两行比不可少,通过chkconfig启动2345级别,开机优先级90(后),关机优先级20(先) #chkconfig:2345 90 20 #description:Mytest server daemon case $1 in start) echo \'mytest starting!!!\' sleep 1 ;; stop) echo \'mytest stoping!!!\' sleep 1 ;; restart) echo \'mytest restartint!!!\' sleep 1 ;; *) echo \'start|stop|restart\' ;; esac [webusr@iomweb1 dream]$
3级别下启动脚本,S表示启动,K表示杀掉,S99表示优先级99(高),S99后面跟脚本名
[webusr@iomweb1 rc.d]$ ls init.d rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local [webusr@iomweb1 rc.d]$ cd rc3.d [webusr@iomweb1 rc3.d]$ pwd /etc/rc.d/rc3.d [webusr@iomweb1 rc3.d]$ ls K19gcstartup S50isisd S66llt S95vras-vradmind K19unlockgcstartup S50vras-vradmind.sh S67gab S95vxrsyncd K50netconsole S50vxnm-vxnetd S68vxfen S97rhnsd K80vxdbdctrl S50vxrsyncd.sh S71amf S98gcstartup S00vxfs S50vxvm-reconfig S75xprtld S98lockgcstartup S10network S50vxvm-recover S76vxodm S99vcs S14vxvm-boot S65veki S80vxdcli S99vxfs_replication [webusr@iomweb1 rc3.d]$
设置链接
[webusr@iomweb1 rc3.d]chkconfig mytest on ##执行没有反应,因为没有建立链接 [webusr@iomweb1 rc3.d]chkconfig --list mytest ##建立链接 mytest 0:off 2:on 3:on 4:on 5:on 6:off [webusr@iomweb1 rc3.d]
八、Shell编写字符菜单管理
24、字符管理制作
菜单管理实例:
1、用户添加
2、用户删除
3、修改密码
4、查看硬盘空间
5、查看内存空间
6、退出菜单
脚本内容:
[webusr@iomweb1 dream]$ cat menu.sh #!/bin/bash #mebu.sh function menu(){ title="My Menu" url="www.baidu.com" time=`date +%y-%m-%d` cat << eof ####################################################### `echo -e "\033[32;40m$title\033[0m"` ######################################################## * 1)add a user * 2)set a password for user * 3)show file * 4)print disk space * 5)print mem space * 6)quit ######################################################## $url $time ######################################################## eof } menu [webusr@iomweb1 dream]$ cat index.sh #!/bin/bash #index.sh # . menu.sh clear sh menu.sh while true do read -p "please input a option:" option case $option in 1 ) ;; 2 ) ;; 3) ls -l ;; 4) df -m ;; 5) df -h ;; 6) break ;; esac done[webusr@iomweb1 dream]$
执行情况:
[webusr@iomweb1 dream]$ sh index.sh ####################################################### My Menu ######################################################## * 1)add a user * 2)set a password for user * 3)show file * 4)print disk space * 5)print mem space * 6)quit ######################################################## www.baidu.com 19-03-29 ######################################################## please input a option:3 总用量 392 -rwxr-x---. 1 webusr webgrp 375113 3月 15 07:56 access.log -rwxr-x---. 1 webusr webgrp 729 3月 29 14:31 dream.sh -rwxr-x---. 1 webusr webgrp 50 3月 28 18:38 file -rwxr-x---. 1 webusr webgrp 239 3月 29 16:08 index.sh -rwxr-x---. 1 webusr webgrp 597 3月 29 16:06 menu.sh -rwxr-x---. 1 webusr webgrp 229 3月 28 20:00 mytest -rwxr-x---. 1 webusr webgrp 228 3月 28 19:59 test.sh please input a option:6 [webusr@iomweb1 dream]$
25、字符菜单管理知识点详解
1)shell函数定义
function menu(){ echo "this is a func" }
2)shell函数使用
menu
3)cat命令的heredoc使用:相当于echo,且能按照原格式输出,可以包含执行语句和变量信息。
[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #func.sh name=user1 cat << eof aaaaaaaaaa${name} aaaaaaaaaa${name} aaaaaaaaaa${name} aaaaae`echo -e "\033[30;47m[$name]\033[0m"`aaaaa eof [webusr@iomweb1 dream]$ sh test.sh aaaaaaaaaauser1 aaaaaaaaaauser1 aaaaaaaaaauser1 aaaaae[user1]aaaaa [webusr@iomweb1 dream]$
4)字符界面下字体的颜色控制
echo -e "\033[30;47m test \033[0m"
5)shell如何包含文件
[webusr@iomweb1 dream]$ cat menu.sh #!/bin/bash #mebu.sh function menu(){ name=user1 cat << eof aaaaaaaaaa${name} aaaaaaaaaa${name} aaaaaaaaaa${name} aaaaae`echo -e "\033[30;47m[$name]\033[0m"`aaaaa eof }[webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #func.sh . menu.sh menu[webusr@iomweb1 dream]$
函数调用不好使,经过验证,用如下命令source:
[webusr@iomweb1 dream]$ cat menu.sh #!/bin/bash #mebu.sh function menu(){ name=user1 cat << eof aaaaaaaaaa${name} aaaaaaaaaa${name} aaaaaaaaaa${name} aaaaae`echo -e "\033[30;47m[$name]\033[0m"`aaaaa eof } [webusr@iomweb1 dream]$ cat test.sh #!/bin/bash #func.sh source ./menu.sh menu [webusr@iomweb1 dream]$ sh test.sh aaaaaaaaaauser1 aaaaaaaaaauser1 aaaaaaaaaauser1 aaaaae[user1]aaaaa [webusr@iomweb1 dream]$
6)while如何写一个死循环
while true do #执行代码 done
九、Shell编写邮件报警脚本
26、编写服务器监控脚本
1)、POSTFIX邮件服务器准备
postfix软件-发邮件-25
dovecot软件-发邮件-110
vi /etc/dovecot/dovecot.conf 1.修改protocols支持pop3和pop3s #Protocols we want to be serving: # Protocols we want to be serving. # imap imaps pop3 pop3s #protocols = imap pop3 lmtp protocols = imap imaps pop3 pop3s # Protocols we want to be serving. #protocols = imap pop3 lmtp 2.修改pop3和imaps在所在ipv4接口上监听110与143端口 imap_listen = * pop3_listen = *
发送邮件命令
echo "user1->user2" |mail user2@dream.com
收邮件:
2)、编写web服务器监控脚本
3)、编写mysql数据库监控脚本
4)、编写disk空间使用监控脚本
5)、编写mem空间使用监控脚本
27、邮件服务器测试
1
十、Shell信号捕捉和日志处理
28、脚本日志文件生成技术
1
29、脚本临时文件生成和使用
1
30、脚本信号捕捉技术
1
十一、Shell如何操作Mysql数据库
31、MySQL常用操作
1
32、Shell操作MySQL之增删改查
1
33、apache日志分隔及相关计划任务
1
34、apache日志统计之MySQL数据库
1
十二、Shell结合cgi实现web功能
35、ogi脚本和预定义变量
1
36、ogi脚本实例
1
37、ogi获取地址栏参数
1
38、ogi获取表单get数据
1
39、ogi获取表单post数据和指令执行
1
十三、Shell结合php实现web功能
40、PHP操作Shell函数
1
41、PHP提取操作Shell
1
42、PHP首页和用户查看功能
1
43、PHP系统模块开发
1
十四、Rsync智能网站备份
44、网站是能备份Shell脚本编写
1
45、Rspnc无口令远程传输
1
46、Linux多服务器环境准备
1
作业
1、按照条件查找日志,存储到新的临时目录中,并进行目录和文件的级联压缩
查找
find /cattsoft/naseu/EU-UTF/debug/log/proc -name \'MQInst*3-25*\'| xargs -i cp {} /cattsoft/naseu/EU-UTF/debug/log/tmpproc
压缩
gzip -r tmpproc
gzip tmpproc tmpproc.gz
2、通过配置文件实现对进程的监控
3、监控磁盘空间使用效率
4、访问mysql数据库处理结果集,统计接收总量,报竣总量,失败量及失败原因明细