一 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,則會添加失敗,自動退出。比如: