一、函数
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 setkernel(){
#9.kernel set.
if [ grep kernel_flag /etc/sysctl.conf|wc -l
-lt 1 ]
then
cat >>/etc/sysctl.conf<
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
#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