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

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