如何实现两级交互式Bash脚本:文件夹与子文件夹选择
实现交互式两级目录选择的Bash脚本
核心思路
用Bash的select命令实现交互式菜单,结合目录遍历命令动态获取两级目录列表,最后用选中的路径执行后续操作。
完整脚本示例
#!/bin/bash # 第一级目录选择:动态获取apps/下的子文件夹 echo "请选择第一级目录:" # 用find命令获取apps下的直接子目录,排除apps本身,提取纯目录名 mapfile -t first_level_dirs < <(find apps -maxdepth 1 -type d ! -name 'apps' -printf "%f\n") # 无第一级目录时直接退出 if [ ${#first_level_dirs[@]} -eq 0 ]; then echo "错误:apps/下没有子文件夹" exit 1 fi # 生成交互式选择菜单 select first_dir in "${first_level_dirs[@]}" "取消"; do if [ "$first_dir" = "取消" ]; then echo "操作已取消" exit 0 elif [ -n "$first_dir" ]; then echo "已选择第一级目录:$first_dir" break else echo "无效选项,请重新输入" fi done # 第二级目录选择:动态获取选中第一级目录下的子文件夹 echo -e "\n请选择第二级目录:" mapfile -t second_level_dirs < <(find "apps/$first_dir" -maxdepth 1 -type d ! -name "$first_dir" -printf "%f\n") # 无第二级目录时直接退出 if [ ${#second_level_dirs[@]} -eq 0 ]; then echo "错误:apps/$first_dir/下没有子文件夹" exit 1 fi select second_dir in "${second_level_dirs[@]}" "取消"; do if [ "$second_dir" = "取消" ]; then echo "操作已取消" exit 0 elif [ -n "$second_dir" ]; then echo "已选择第二级目录:$second_dir" break else echo "无效选项,请重新输入" fi done # 执行后续操作:替换为你的实际业务逻辑 echo -e "\n开始执行后续操作,目标路径:apps/$first_dir/$second_dir" # 示例操作:列出目标目录内容 ls -la "apps/$first_dir/$second_dir"
关键细节说明
- 动态目录获取:用
find命令替代硬编码,-maxdepth 1确保只获取直接子目录,-printf "%f\n"提取纯目录名,避免空格或特殊字符导致的路径解析问题。 - 数组存储目录:用
mapfile -t将目录名存入数组,完美兼容带空格的目录名称(比如My Project这类名称)。 - 交互式菜单:
select命令自动生成带编号的选择菜单,用户只需输入编号即可完成选择;加入"取消"选项提升脚本易用性。 - 错误处理:检查目录是否存在,避免空菜单导致的脚本异常退出。
自定义修改点
- 将后续操作部分的
ls -la替换为你的实际业务逻辑,比如部署脚本、打包命令、文件同步等。 - 如果需要支持更多级目录选择,可将选择逻辑封装为函数,通过递归调用实现。
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

