1、函数的作用
函数可以将一个专门的功能进行封装,用于解决一个特定的问题,并且可以通过传递不同的参数给某个函数,实现处理不同数据的能力。函数的参数跟脚本的参数比较类似。
2、函数的使用
函数名、参数、返回结果,其中函数名必须的,参数和返回结果可选,根据需要进行处理。
简单实例:
1、两数相加
vi function.sh
进入对function.sh编辑
# 定义一个函数
function add(){
let sum=$1+$2
echo $sum
}
# 调用add函数
add 100 200
之后sh function.sh
运行shell,输出300
总结:在上述示例中,在调用函数add 100 200时,类似于命令的参数传递,并且在函数体中也是使用$1,$2的取值方式,没有编程意义上所谓的形参和实参一说。
效果图如图所示:
对代码小小改动:
# 定义一个函数
function add(){
let sum=$1+$2
echo $sum # 函数的返回结果,注意,作用同return 0
}
# 调用add函数
result=`add 100 200` # 另一种写法: result=$(add 100 200)
echo "result的结果为:$result"
#要将函数的输出结果赋值给某个变量,使用反引号或$()
效果图:
小拓展:
几个特殊的关于括号的用法
1、(()) 双圆括号,用于运算,可以代替expr,也可以用于for循环条件((i=1;i<=100 ;i++))
2、${} 可以取特定参数或变量的值,比如${1},${username}
3、$() 可以代替反引号执行圆括号中的命令
4、$[] 用于整数运算,可以代替expr
2、for循环的小技巧
sum=0
# 默认情况下{1..100}的步长为1
#for i in {1..100}; do
#for i in {1..100..2}; do
for ((i=1; i<=100; i+=2)); do
let sum+=i
done
echo ${sum}
效果图:
sleep 5 //沉睡5秒
#每5秒钟向文本中输出一次时间
# for i in {1..10} ; do
while [ 1 -eq 1 ]; do
date "+%Y-%m-%d %H:%M:%S” >> /opt/ 1earn/date.txt
date "+%Y-%m-%d %H:%M:%S"
sleep 5
done
命令实例 | 作用 |
---|---|
crontab | 每个用户都可以有一个crontab文件来保存调度信息,通过该命令运行任意一个shell脚本或者命令 |
/varlspool/cron | 保存所有用户的crontab文件 |
/etc/cron.deny /etclcron.allow | 系统管理员可以通过cron.deny和cron.allow这两个文件来禁止或允许用户拥有自己的crontab文件(cron.allow需要自己新建) |
crontab的域 | * * * * * command 第1列 分钟 0~59 第2列 小时0~23(0表示子夜) 第3列 日 1~31 第4列 月1~12 第5列 星期 0~6 (0表示星期天) 第6列 要运行的命令 |
常用规则 | *:匹配任何值 */n:匹配每n个单位(从起始值算起的每n个单位) x: 匹配x x-y:匹配从x-y的值 x,y,z:只匹配x, y,z三个值 |
crontab [ -u user ] -e -l -r | -u 用户名 -e 编辑crontab文件 -l 列出crontab文件中的内容 -r 删除crontab文件 |
systemctl start/stop crond | 启动停止crond进程,如crond进程停止,则不会有任务被自动执行 |
不发送邮件 | 在crontab -e中编辑任务时,在第一行添加:MAILTO=“”,则不会发送邮件,可以通过/var/log/cron查看执行的日志 |
提示:编写定时任务时,确定好定时规则后,要执行的指令建议直接写在Shell脚本中,让Cron直接执行该脚本即可,尽量避免在定时规则文件中直接调用命令,比如
*/1 * * * * /opt/learn/crondate.sh
一定要确保Shell脚本是有执行权限的,并且在Cron文件中指定的是绝对路径。
[root@numberone ~]# yum install -y at//安装at
命令实例 | 作用 |
---|---|
at | 单次定时任务,yum install at -y; systemctl start atd; |
at 时间 | 指定某一特定时间去做某件事情 |
at HH:MM | at 16:00 |
at HH:MM YYYY-MM-DD | at 16:00 2009-10-11 |
at now + 5 minutes | 从现在开始的5分钟后 |
如何退出at编辑模式 | Ctrl + D |
atq | 查询现有任务 |
atrm id | 删除某个任务 |
command & | 后台运行,如有输出,则会输出到前台 |
nuhup command & | 后台运行,所有输出将会转存到nohup.out文件中 |
sleep n | 让Shell脚本暂停n秒 |
usleep n | 让Shell脚本暂停n纳秒,10的-9次方 |
time command | 计算某一个命令或者脚本运行时花的时间(精确到毫秒):如: time ls (ls这个命令所花的时间)time sh myshell.sh (运行myshell.sh这个脚本所花的时间) |
利用Crontab来判断Web服务器是否可用,如果不可用,则自动启动,并且将过程的操作写入到日志文件中。一个站点如果无法访问,可能的原因有两个:
(1) Web服务器没有正常启动:如何使用Shell进行判断?
法一:使用curl直接访问对应网页,如果成功,则$?为0,否则非O
法二:使用netstat -ant l grep :80
进行查询,如果端口被打开,则echo $?
为0,表示成功启动80端口
法三:也可以使用ps -ef
查询对应的进程
(2)防火墙没有允许80端口通过:让Shell执行firewall-cmd添加端口通过的命令即可。
firewakk-cmd --list-port l grep 80
完成上述特征的识别后,在Shell中编写脚本,并让Cron定时执行。
shell脚本如下:
curl http://192.168.112.188/dashboard/phpinfo.php > /dev/null
if [ $?-ne 0 ]; then
/opt/lampp/lampp start
echo“"检测到lampp没有启动,已经完成启动-" `date "+%Y-%m-%d %H:%M:%S"` > /opt/learn/site_check.log
fi
firewall-cmd --list-portl grep 80
if[ $? -ne 0 ]; then
firewall-cmd --add-port=80/tcp
echo "检测到80端口没有通过,已经完成添加-" `date "+%Y-%m-%d %H:%M:%S" > pt/learn/site_check.log
fi