如何编写可调用其他脚本的Bash主菜单脚本?
解决Bash主菜单调用外部脚本的问题
嘿,你已经把主菜单的架子搭得有模有样了!要在case分支里调用其他脚本其实超简单,下面给你详细说几种实现方法,还有优化后的完整代码示例。
调用外部脚本的几种方式
你可以根据自己的需求选下面任意一种:
- 直接运行脚本:如果脚本在当前目录,用
./脚本名.sh;如果脚本在系统PATH目录里(比如/usr/local/bin),直接写脚本名.sh就行;要是脚本在其他路径,就写完整绝对路径/home/user/scripts/脚本名.sh。记得给脚本加执行权限:chmod +x 脚本名.sh。 - 用Bash解释器调用:如果脚本没加执行权限或者开头没写
#!/bin/bash,可以用bash /路径/脚本名.sh来运行,这样不用改权限也能执行。 - Source脚本:用
source /路径/脚本名.sh或者. /路径/脚本名.sh,这种方式会在当前shell环境里执行脚本,适合需要和主菜单共享变量的场景,但要注意如果被调用的脚本里有exit命令,会直接退出主菜单哦。
优化后的完整菜单脚本
假设你的部门脚本分别是sistemas.sh、correctivo.sh、producto.sh、empresa.sh、cliente.sh,都放在主菜单脚本的同一目录下,修改后的代码如下:
#!/bin/bash # 定义主菜单函数,方便重复调用 show_menu() { clear echo "¡Bienvenido -----!" sleep 1 echo "¿A que departamento perteneces?" echo "1. Sistemas" echo "2. Correctivo" echo "3. Producto" echo "4. Empresa" echo "5. Cliente" echo "6. Salir" # 加个退出选项更友好 read -p "请输入选项编号: " depart } # 循环显示菜单,直到用户选择退出 while true; do show_menu case "$depart" in 1) echo "Seleccionaste sistemas" # 调用sistemas脚本,先检查是否存在且可执行 if [ -x ./sistemas.sh ]; then ./sistemas.sh else echo "错误:sistemas.sh不存在或无执行权限!" fi read -p "按任意键返回主菜单..." # 让用户看完结果再返回 ;; 2) echo "Seleccionaste correctivo" if [ -x ./correctivo.sh ]; then ./correctivo.sh else echo "错误:correctivo.sh不存在或无执行权限!" fi read -p "按任意键返回主菜单..." ;; 3) echo "Seleccionaste producto" if [ -x ./producto.sh ]; then ./producto.sh else echo "错误:producto.sh不存在或无执行权限!" fi read -p "按任意键返回主菜单..." ;; 4) echo "Seleccionaste empresa" if [ -x ./empresa.sh ]; then ./empresa.sh else echo "错误:empresa.sh不存在或无执行权限!" fi read -p "按任意键返回主菜单..." ;; 5) echo "Seleccionaste cliente" if [ -x ./cliente.sh ]; then ./cliente.sh else echo "错误:cliente.sh不存在或无执行权限!" fi read -p "按任意键返回主菜单..." ;; 6) echo "¡Adiós!" exit 0 ;; *) echo "选项无效,请输入1-6之间的数字!" read -p "按任意键返回主菜单..." ;; esac done
额外提示
- 如果你的部门脚本不在当前目录,记得把
./脚本名.sh改成实际的路径,比如/opt/scripts/sistemas.sh。 - 要是不需要检查脚本是否存在,直接写调用语句就行,但加个判断能避免报错时用户一脸懵。
- 循环菜单的设计能让用户不用每次都重新运行主脚本,体验更好~
内容的提问来源于stack exchange,提问作者Sayrer
相关产品推荐
相关产品推荐

