根据选择执行不同目录中的脚本
功能和用法在脚本注释中:
#!/bin/sh
# ************************************************************
# 功能:
# 根据选择执行不同目录中的 ./run.sh 脚本。
#
# 说明:
# 我有许多以数字加下划线开头的目录,比如 01_aaa、02_bbb 等,这些目录
# 会动态添加、删除,每个目录下面都有一个 run.sh 脚本,我想方便的执行不同
# 目录下的 run.sh 脚本,又不想在终端输入太多内容,所以弄了这个脚本来简化
# 操作,执行效果如下:
#
# ==============================
# 01_aaa
# 02_bbb
# 03_ccc
# 04_ddd
# [ m = 菜单 q = 退出 ]
# ==============================
# 请选择要执行的目录:
#
# 输入 1、2、3 等就可以执行相应目录中的 run.sh 脚本了。
#
# 用法:
# ./该脚本.sh 01 # 执行并退出
# 或
# ./该脚本.sh 1 # 执行并退出
# 或
# ./该脚本.sh # 循环选择执行
# ************************************************************
# 全局变量
dirs= # 目录列表
dir= # 所选择的目录
sel=$1 # 用户输入的值
once=$1 # 是否只执行一次
# 如果未提供命令行参数,则列出菜单
[ ! "$sel" ] && sel=m
# 如果 $1 提供的是 m,则循环执行,而不是只执行一次
[ "$once" == "m" ] && once=
# 获取当前目录下所有以数字加下划线开头的目录
function get_dirs() {
# 在参数 * 展开的条目中查找以数字加下划线开头的目录并排序(结果含有换行符)
dirs="`find * -maxdepth 0 -type d -regex '^[0-9]+_.+' | sort`"
}
# 列出目录并等待用户选择
function show_dirs() {
# 每次显示菜单前都更新目录列表,以便列出新建的目录
get_dirs
# 列出目录
clear
echo "=============================="
echo "$dirs"
echo "[ m = 菜单 q = 退出 ]"
echo "=============================="
# 选择目录
echo -n "请选择要执行的目录:"
read sel
# 如果未输入任何内容,则继续显示菜单
[ ! "$sel" ] && sel=m
}
# 根据用户输入的内容筛选目录
function get_dir() {
# 每次选择目录前都更新目录列表,以便选择新建的目录(可能在未列出目录的情况下进行选择)
get_dirs
# 查找第一个匹配的目录(echo "$list" 要加引号,因为里面含有换行符)
dir=`echo "$dirs" | grep -m 1 -E '^0*'${sel}_`
}
# 运行所选目录中的 ./run.sh 脚本
function run_dir() {
# 显示所选的目录(如果目录不存在,则显示'无匹配目录')
clear
echo "------------------------------"
[ "$dir" ] && echo $dir || echo "无匹配目录:$sel"
echo "------------------------------"
# 进入所选的目录并执行 ./run.sh,然后退出目录
if [ -d "$dir" ]; then
cd "$dir"
./run.sh
cd ..
echo "------------------------------"
fi
# 保存旧的输入
oldsel=$sel
# 如果不是只运行一次,则暂停
if [ ! "$once" ]; then
# 请用户选择接下来要执行的目录
echo -n "执行完毕,请选择要执行的目录:"
read sel
# 如果未输入任何内容,则重复执行上次的选择
[ ! "$sel" ] && sel=$oldsel
fi
}
# 循环,直到用户输入 q
while true; do
# 如果输入的是 m 则列出目录供用户选择
while [ "$sel" == "m" ]; do show_dirs; done
# 如果输入的是 q 则退出循环
[ "$sel" == "q" ] && break
# 根据用户输入选择目录
get_dir
# 运行目录中的 ./run.sh
run_dir
# 如果只运行一次,则退出循环
[ "$once" ] && break
done