根据选择执行不同目录中的脚本

发布于:2025-03-20 ⋅ 阅读:(54) ⋅ 点赞:(0)

根据选择执行不同目录中的脚本

功能和用法在脚本注释中:

#!/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

网站公告

今日签到

点亮在社区的每一天
去签到