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)