shell中的循环 for循环、while循环、if else

 

一 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
    execute command1
    execute command2
    ...
    execute commandN
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,则会添加失败,自动退出。比如:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章