一 for循环
for循环一般格式为:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
写成一行为:
for var in item1 item2 ... itemN; do command1; command2... done;
或者下面这种类似java的写法::
for ((i=1;i<=10;i++))
执行体用do
command1
command2
...
commandN
done 包裹
循环10遍也可以写成
#!/bin/bash
for i in {1..10}
do
echo $i
sleep 1
done
举例1. 启动redis集群节点服务,我们可以写一个启动脚本 start-redis.sh
#!/bin/bash
for ((i=1;i<=3;i++))
do /usr/local/bin/redis-server /data/redis_data/700$i/redis.conf
done
echo "========= 启动服务完毕! ==========="
效果如下图:
举例2. 关闭redis集群节点服务,我们可以写一个stop-redis.sh
#!/bin/bash
IP="192.168.158.202"
for ((i=1;i<=3;i++))
do /usr/local/bin/redis-cli -c -h $IP -p 700$i shutdown
done
echo "============ redis服务关闭完毕!================"
效果如下图:
举例3:for循环也可以写成一行:
stop-redis.sh 文件内容改动如下:
#!/bin/bash
IP="192.168.158.202"
for ((i=1;i<=3;i++)); do /usr/local/bin/redis-cli -c -h $IP -p 700$i shutdown; done;echo "It's Ok!";
echo "================redis服务关闭完毕!===================="
效果如下图:
举例4:for循环的另一种写法:
start-redis.sh 文件内容改动如下:
#!/bin/bash
for i in 1 2 3
do /usr/local/bin/redis-server /data/redis_data/700$i/redis.conf
done
echo "===================启动服务完毕!======================="
效果如下图:
二 while循环
举例1:while 与 输入重定向 结合
使用 while循环,并使用 < 对输入做重定向,以 /tmp/id文件作为标准输入 统计各个城市 /weather/forecast?cityId=xxx 和 /weather/alert/mobile/cityId=xxx 两个请求url的请求情况,并将各个城市的请求情况写入指定的txt文件中 。我们可以写一个 tj.sh
#!/bin/bash
mkdir -p /tmp/tongji
while read i
do
cat /tmp/nginxlogs/access.log*|grep /weather/forecast?cityId=${i} | awk '{print $1,$4,$7,$9}' > /tmp/tongji/city_id${i}_forecast.txt
cat /tmp/nginxlogs/access.log*|grep /weather/alert/mobile?cityId=${i} | awk '{print $1,$4,$7,$9}' > /tmp/tongji/city_id${i}_alert.txt
done < /tmp/id
其中 /tmp/id 文件内容如下
[root@izbp1845cet96se1qmb5ekz ~]# cat /tmp/id
1000
1220
2243
2278
3052
[root@izbp1845cet96se1qmb5ekz ~]#
效果如下图:
三 if else
现有脚本 add.sh 内容如下:
#!/bin/bash
app=$1
if [ $# != 1 ];
then
echo exit
exit
fi
cat /etc/zabbix/zabbix_agentd.d/externalscripts/check_proc.py |grep "#CMDLINE"
if [ $? -eq 0 ];
then
sed -i "7i {\"{#CMDLINE}\":\"${app}\",\"{#SERVICE_NAME}\":\"${app}\"}," /etc/zabbix/zabbix_agentd.d/externalscripts/check_proc.py
else
sed -i "7i {\"{#CMDLINE}\":\"${app}\",\"{#SERVICE_NAME}\":\"${app}\"}" /etc/zabbix/zabbix_agentd.d/externalscripts/check_proc.py
fi
如图
其中/etc/zabbix/zabbix_agentd.d/externalscripts/check_proc.py 脚本内容如下:
#!/usr/bin/env python
#coding:utf-8
import json
total_dict={"data":[
{"{#CMDLINE}":"product-trace","{#SERVICE_NAME}":"product-trace"},
{"{#CMDLINE}":"loginLogger-provider","{#SERVICE_NAME}":"loginLogger-provider"}
]}
jsonStr = json.dumps(total_dict,sort_keys=True,indent=4,ensure_ascii=False)
#python3
#print(jsonStr)
#python2
print jsonStr
通过脚本 add.sh 向 /etc/zabbix/zabbix_agentd.d/externalscripts/check_proc.py 文件中添加新的服务的进程监控
[root@ice_python testdir]# bash add.sh storages.jar
{"{#CMDLINE}":"product-trace","{#SERVICE_NAME}":"product-trace"},
{"{#CMDLINE}":"loginLogger-provider","{#SERVICE_NAME}":"loginLogger-provider"}
[root@ice_python testdir]#
效果:
如果使用 bash add.sh xxx 时,参数不是1,则会添加失败,自动退出。比如: