shell菜单模板 (数据库数据提取生成csv Redis初始化方案 调用python脚本)

shell菜单模板

提供了一个主菜单页面 调用不同任务类型 再返回主菜单的一种模板

显示任务主菜单

#!/bin/bash

#----------------------常量池开----------------------
CUR_PROJECT_DIR=$(cd `dirname $0`; pwd) 
#----------------------常量池闭----------------------

print_menu() {
    echo "----------------------------------"
    echo "  菜单题目 "
    echo "----------------------------------"
    echo "(1) 任务1-读取数据库数据导出csv文件"
    echo "(2) 任务2-redis相关操作"
    echo "(3) 任务3-调用python脚本进行解析csv文件"
    echo "(q) 退出"
    echo "----------------------------------"
}

choose() {
    while true; do
        echo -n "请输入选项: "
        read choice
        case ${choice} in
        1)
            /bin/bash ${CUR_PROJECT_DIR}/task_1.sh
            return 1
            ;;
        2)
            /bin/bash ${CUR_PROJECT_DIR}/task_2.sh
            return 1
            ;;
        q|Q|quit)
            return 0
            ;;
        *)
            echo "输入参数错误,请重新输入"
            ;;
        esac
    done
    return 0
}

main() {
    while true; do
        clear
        print_menu
        choose
        if [ $? -eq 0 ]; then
             break;
        fi
        read -r -n 1 -p "按任意键继续"  button
    done
}

main

子任务1菜单(以读取mysql数据生成csv文件为样例)

#!/bin/bash

#----------------------常量池开----------------------
CUR_PROJECT_DIR=$(cd `dirname $0`; pwd)
TMP_QUERY_RESULT_PATH=$CUR_PROJECT_DIR/data
#数据库常量
DB_NAME_PREFIX="testdb"
TABLE_NAME_PREFIX="test_table_"
HOST_IP=
PORT=
USER=
PWD=
AGENT_ID=
#文件常量
SEPARATOR=","
#----------------------常量池闭----------------------

#----------------------初始化-------------------------
mkdir -p ${TMP_QUERY_RESULT_PATH}
#----------------------初始化结束--------------------

print_task_1_menu() {
	echo "----------------------------------"
    echo "数据库数据抽取导出csv方案1"
    echo "----------------------------------"
    echo "(1) 开始"
    echo "(q) 退出"
    echo "----------------------------------"
}

task_1_choose() {
	while true; do
        read -p "请输入选项: " choice
        case ${choice} in
        1)
            select_taks_1
            if [ $? -eq 0 ]; then
               echo "任务执行失败,请检查error.out"
               return 0
            fi
            return 1
            ;;
        q|Q|quit)
            return 0
            ;;
        *)
            echo "输入参数错误"
            ;;
        esac
    done
}

select_task_1() {
	read -p "请输入查询条件1" parameter1
	read -p "请输入查询条件2" parameter2
	#对参数1进行校验是否为数字
	if expr $parameter1+ 0 &>/dev/null; then 
				select_all_db
				return $?
            else
                echo "非数字错误码输入"
                return 0
    fi
}

select_all_db() {
	echo  "开始数据提取"
	for db_index in $(seq -w 0 99)
	do
	echo "任务执行进度完成百分比: $db_index"
	db_name="${DB_NAME_PREFIX}${db_index}"
	select_one_db ${db_name}
	done
}

select_one_db() {
	for table_index in $(seq -w 0 99)
	do
	table_name="${TABLE_NAME_PREFIX}${table_index}"
	select_one_table $1 ${table_name}
	done
}

select_one_table() {
    sql = "select field1, field2, field3 FROM $1.$2 WHERE parameter1='${parameter1}' AND parameter2='${parameter2}"
	mysql -N -s -r --default-character-set=utf8 -h${HOST_IP} -P${PORT} -u{USER} -p${PWD} -e "${sql}'" 2>>error.out | awk '{print $1${SEPARATOR}$2${SEPARATOR}$3${SEPARATOR}$4${SEPARATOR}}' >> $TMP_QUERY_RESULT_PATH/result_.csv
	#注意mysql中date类型读取完是占2行 需要用$1" "$2进行连接,中间不能有分隔符
}

task_1_main() {
	while true; do
		clear
		print_task_1_menu
		task_1_choose
		if [ $? -eq 0 ]; then
             break;
        fi
		read -r -n 1 -p "按任意键继续"  button
    done
}

task_1_main

子任务2菜单(redis相关操作示例)

配置文件 config.sh


# redis客户端所在位置
REDIS_CLIENT=/app/Redis/redis-cli
REDIS_HOST=
REDIS_PWD=
REDIS_PORT=
REDIS_COMMAND="${REDIS_CLIENT} -c -p ${REDIS_PORT} -a ${REDIS_PWD} -h ${REDIS_HOST}"

主菜单 main_menu.sh

#!/bin/bash

#----------------------常量池开----------------------
CUR_PROJECT_DIR=$(cd `dirname $0`; pwd)

#----------------------常量池闭----------------------
# 导入其他配置文件
source ${CUR_PROJECT_DIR}/config.sh

print_tesk_2_menu() {
	echo "----------------------------------"
    echo "redis操作脚本"
    echo "----------------------------------"
    echo "(1) 数据查询"
    echo "(2) 数据更新"
    echo "(3) 初始化"
    echo "(q) 退出"
    echo "----------------------------------"
}

tesk_2_choose() {
	while true; do
        read -p "请输入选项: " choice
        case ${choice} in
        1)
            redis_task_1
            return 1
            ;;
        2)
            redis_task_2
            return 1
            ;;
        3)
            redis_task_3
            return 1
            ;;
        q|Q|quit)
            return 0
            ;;
        *)
            echo "输入参数错误"
            ;;
        esac
    done
}

redis_task_1() {
	$REDIS_COMMAND del key1
	echo `$REDIS_COMMAND hmget hashkey key1`
	echo $(REDIS_COMMAND hmget hashkey key2)
}

redis_task_2() {
	$REDIS_COMMAND del key1
	read -p "请输入初始化起始值" value1
	read -p "请输入最大值2" value2
	$REDIS_COMMAND hmset hashkey key1 value1
	$REDIS_COMMAND hmset hashkey key2 value2
	$REDIS_COMMAND rpush listkey value
}

redis_task_3() {
	channel_min=`$REDIS_COMMAND hget hashkey key1`
	channel_count=`$REDIS_COMMAND hget hashkey key2`
	channel_end=channel_min + channel_count
	for ((i=channel_min;i<chanel_end;i++)): do
	  $REDIS_COMMAND rpush listkey "{\"id\":${i}}"
	done
	return 0
}

task_2_main() {
	while true; do
		clear
		print_task_2_menu
		task_2_choose
		if [ $? -eq 0 ]; then
             break;
        fi
		read -r -n 1 -p "按任意键继续"  button
    done
}

task_2_main

子任务3菜单(调用python脚本解析csv文件)

#!/bin/bash

#----------------------常量池开----------------------
CUR_PROJECT_DIR=$(cd `dirname $0`; pwd)
TMP_QUERY_RESULT_PATH=$CUR_PROJECT_DIR/data
#----------------------常量池闭----------------------

print_task_3_menu() {
    echo "----------------------------------"
    echo "调用python执行任务"
    echo "----------------------------------"
    echo "(1) csv文件paython解析"
    echo "(q) 退出"
    echo "----------------------------------"
}

task_3_choose() {
	while true; do
        echo -n "请输入选项: "
        read choice
        case ${choice} in
        1)
            read -p "请输入要处理的文件名" file_name
	    	echo "开始处理${file_name}的文件"
            if [ -f "${TMP_QUERY_RESULT_PATH}/${file_name}.csv" ];then
				echo "找到文件"
				python task_3.py "${file_name}.csv"
            else
                echo "未能找到文件"
            fi
            return 1
            ;;
        q|Q|quit)
            return 0
            ;;
        *)
            echo "输入参数错误"
            ;;
        esac
    done
}

task_3_main() {
	while true; do
		clear
		print_task_3_menu
		task_3_choose
		if [ $? -eq 0 ]; then
             break;
        fi
    read -r -n 1 -p "按任意键继续"  button
    done
}

task_3_main

task_3.py

#!/usr/bin/python
#-*- coding:utf-8 -*-

import os
import csv
import codecs

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

CUR_PROJECT_DIR = os.path.dirname(os.path.realpath(__file__))
RESULT_PATH = CUR_PROJECT_DIR + '/' + 'result'
TMP_QUERY_RESULT_PATH=CUR_PROJECT_DIR + '/' + 'data'

def _analysis_data_file(file_name):
    print '开始解析文件%s'%(file_name)
    fiednames = ("o_row_1", "o_row_2", "o_row_3", "o_row_4")
    global RESULT_PATH 
    with codecs.open("%s/%s"%(RESULT_PATH, file_name), 'r', encoding = 'utf-8') as csvfile:
        rows = csv.DictReader(csvfile, fiednames, delimiter=',')
        for row in rows:
	    	#print row
            _deal_row(row)
            
def _deal_row(row):
	CHECK_DATA_FIED_NAMES=['row1','row2','row3']
	file_check_data_out = codecs.open('%s/result.csv'%(RESULT_PATH), 'w', encoding = 'utf-8')
	file_check_data_csv_write.writerow(CHECK_DATA_FIED_NAMES)
	result_list=[]
	result_list.append(row["o_row_1"])
	result_list.append(row["o_row_4"])
	result_list.append(row["o_row_2"])
	
############################################################
if __name__ == '__main__':
    if len(sys.argv) != 2:
	print '参数个数异常 入参 缺失文件名'
        sys.exit()
    file_name = sys.argv[1]
    _analysis_data_file(file_name)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值