一、函数
1、什么是shell函数
把相同程序段定义成函数,可以减少整个程序的代码量,提升开发效率
增加程序的可读性,易读性,提升管理效率
可以失效程序功能模块化,使程序具备可移植性
其实linux系统里面近2000个命令可以说都是shell的函数
2、语法
function 名称() 复合命令块[重定向]
function 函数名 () { #function可以忽略不写 指令。。。 return n #和exit类似,return是退出函数 }
3、基础实践
1)开发一个建立两个简单函数并调用执行
[root@web1 scripts]# cat test21.sh #!/bin/bash boy(){ echo "i am boy" } function girl(){ echo "i am girl" } boy girl [root@web1 scripts]# ./test21.sh i am boy i am girl [root@web1 scripts]# cat test21-1.sh #!/bin/bash boy(){ echo "i am boy" } function girl(){ echo "i am girl" } boy girl boy1 [root@web1 scripts]# ./test21-1.sh i am boy i am girl ./test21-1.sh: line 10: boy1: command not found [root@web1 scripts]#
2)分离函数体和执行行数的脚本文件
[root@web1 scripts]# cat >>/etc/init.d/functions<<- EOF > boy(){ > echo "i am boy" > } > EOF [root@web1 scripts]# !tail tail -3 /etc/init.d/functions boy(){ echo "i am boy" } [root@web1 scripts]#
[root@web1 ~]# function boy1 { > echo "i am boy1" > }
[root@web1 scripts]# boy1
i am boy1
4、实现企业级URL检查脚本
经函数的传参换成脚本文件命令行传参,判断任意指定的url是否存在移除
1)实践脚本传参,检查web URL是否正常
[root@web1 scripts]# cat test23.sh #判断传参格式是否为1 #!/bin/bash if [ $# -en 1 ] #“$#”获取当前执行的脚本后面接的参数总个数 then echo $"usage:$0 url" exit 1 fi wget --spider -q -o /dev/null --tries=1 -T 5 $1 #T超时实践,这里的$1为脚本的参数 if [ $? -eq 0 ] #“$?”获取上一个指令的执行状态返回值,0成功,非零失败 then echo "$1 is yes" else echo "$1 is no" fi
2)将上述检测的功能写成函数,并将函数传参转换成脚本命令行传参,判断任意指定的URL是否存在异常
#!/bin/bash function usage(){ echo $"usage:$0 url" exit 1 } function check_url(){ #检测URL函数 wget --spider -q -o /dev/full --tries=1 -T 5 $1 #这里$1就是函数传参 if [ $? -eq 0 ] then echo "$1 is yes" else echo "$1 is no" fi } function main(){ #主函数 if [ $# -ne 1 ] #如果传入的是多个参数,则打印帮助函数,提示用户 then usage fi check_url $1
} #接收函数的传参,即把下文main结尾的$*传到这里 main $* #这里的$*就是把命令行接收的所有参数作为函数参数传给函数内部,是一种常用收发
运行结果
[root@web1 scripts]# sh test24.sh www.baidu.com www.baidu.com is yes [root@web1 scripts]# sh test24.sh www.baidu1.com www.baidu1.com is no [root@web1 scripts]#
3)将函数的传参转换层脚本文件命令行传参,判断任意指定的url是否存在异常,并以更专业的显示
#!/bin/sh . /etc/init.d/functions function usage(){ echo $"usage:$0 url" exit 1 } function check_url(){ wget --spider -q -o /dev/null --tries=1 -T 5 $1 if [ $? -eq 0 ] then action "$1 is yes." /bin/true #action 就是调用函数库的函数 else action "$1 is no." /bin/false fi } function main(){ if [ $# -ne 1 ] then usage fi check_url $1 } main $*
效果
[root@web1 scripts]# chmod +x test25.sh [root@web1 scripts]# ./test25.sh www.baidu.com www.baidu.com is yes. [ OK ] [root@web1 scripts]# ./test25.sh www.baidu1.com www.baidu1.com is no. [FAILED] [root@web1 scripts]#
5、利用shell函数开发一键优化系统脚本
centos6
#!/bin/bash # author:oldboy # qq:31333741 #set env export PATH=$PATH:/bin:/sbin:/usr/sbin # Require root to run this script. if [ "$UID" != "0" ]; then echo "Please run this script by root." exit 1 fi #define cmd var SERVICE=`which service` CHKCONFIG=`which chkconfig` function mod_yum(){ #modify yum path if [ -e /etc/yum.repos.d/CentOS-Base.repo ] then mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup&& wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo fi } function close_selinux(){ #1.close selinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config #grep SELINUX=disabled /etc/selinux/config setenforce 0 &>/dev/null #getenforce } function close_iptables(){ #2.close iptables /etc/init.d/iptables stop /etc/init.d/iptables stop chkconfig iptables off } function least_service(){ #3.least service startup chkconfig|awk '{print "chkconfig",$1,"off"}'|bash chkconfig|egrep "crond|sshd|network|rsyslog|sysstat"|awk '{print "chkconfig",$1,"on"}'|bash #export LANG=en #chkconfig --list|grep 3:on } function adduser(){ #4.add oldboy and sudo if [ `grep -w oldboy /etc/passwd|wc -l` -lt 1 ] then useradd oldboy echo 123456|passwd --stdin oldboy cp /etc/sudoers /etc/sudoers.ori echo "oldboy ALL=(ALL) NOPASSWD: ALL " >>/etc/sudoers tail -1 /etc/sudoers visudo -c &>/dev/null fi } function charset(){ #5.charset config cp /etc/sysconfig/i18n /etc/sysconfig/i18n.ori echo 'LANG="zh_CN.UTF-8"' >/etc/sysconfig/i18n source /etc/sysconfig/i18n #echo $LANG } function time_sync(){ #6.time sync. cron=/var/spool/cron/root if [ `grep -w "ntpdate" $cron|wc -l` -lt 1 ] then echo '#time sync by oldboy at 2010-2-1' >>$cron echo '*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' >>$cron crontab -l fi } function com_line_set(){ #7.command set. if [ `egrep "TMOUT|HISTSIZE|HISTFILESIZE" /etc/profile|wc -l` -ge 3 ] then echo 'export TMOUT=300' >>/etc/profile echo 'export HISTSIZE=5' >>/etc/profile echo 'export HISTFILESIZE=5' >>/etc/profile . /etc/profile fi } function open_file_set(){ #8.increase open file. if [ `grep 65535 /etc/security/limits.conf|wc -l` -lt 1 ] then echo '* - nofile 65535 ' >>/etc/security/limits.conf tail -1 /etc/security/limits.conf fi } function set_kernel(){ #9.kernel set. if [ `grep kernel_flag /etc/sysctl.conf|wc -l` -lt 1 ] then cat >>/etc/sysctl.conf<<EOF #kernel_flag net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_max_tw_buckets = 36000 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 net.core.somaxconn = 16384 net.core.netdev_max_backlog = 16384 net.ipv4.tcp_max_orphans = 16384 net.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_tcp_timeout_established = 180 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 EOF sysctl -p fi } function init_ssh(){ cp /etc/ssh/sshd_config /etc/ssh/sshd_config.`date +"%Y-%m-%d_%H-%M-%S"` #sed -i 's%#Port 22%Port 52113%' /etc/ssh/sshd_config sed -i 's%#PermitRootLogin yes%PermitRootLogin no%' /etc/ssh/sshd_config sed -i 's%#PermitEmptyPasswords no%PermitEmptyPasswords no%' /etc/ssh/sshd_config sed -i 's%#UseDNS yes%UseDNS no%' /etc/ssh/sshd_config /etc/init.d/sshd reload &>/dev/null } function update_linux(){ #10.upgrade linux. if [ `rpm -qa lrzsz nmap tree dos2unix nc|wc -l` -le 3 ] then yum install lrzsz nmap tree dos2unix nc -y #yum update -y fi } main(){ mod_yum close_selinux close_iptables least_service adduser charset time_sync com_line_set open_file_set set_kernel init_ssh update_linux } main
centos7
未更新
6、利用shell函数开发rsync服务启动脚本
#!/bin/sh if [ $# -ne 1 ] then echo $"usage:$0{start|stop|restart}" exit 1 fi if [ "$1" = "start" ] then rsync --daemon if [ `netstat -lntup|grep rsync|wc -l` -ge 1 ] then echo "rsyncd is started." exit 0 fi elif [ "$1" = "stop" ] then pkill rsync if [ `netstat -lntup|grep rsync|wc -l` -eq 0 ] then echo "rsyncd is stopped." exit 0 fi elif [ "$1" = "restart" ] then pkill rsync sleep 2 rsync --daemon else echo $"usage:$0{start|stop|restart}" exit 1 fi