脚本传参详解:打造高效智能的Bash脚本工具 📚

让 Bash 脚本“听懂”人话:交互友好 & 一键自动化兼得!

📚 导航目录


一、✨ 无参交互脚本

以下示例仅支持交互式菜单,每次都要敲键盘选 1/2,效率偏低。
👇 复制即可运行体验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
linux_git_menu() {
while true; do
clear
echo -e ">>> Git 管理"
echo -e "1. 推送更新"
echo -e "2. 拉取更新"
read -r -e -p "请输入你的选择: " choice
case $choice in
1) echo "✅ 执行推送更新..."; break ;;
2) echo "✅ 执行拉取更新..."; break ;;
*) echo "❌ 无效选择" ;;
esac
done
}
linux_git_menu

🔍 特点小结

  • ✅ 零学习成本,新手友好
  • ❌ 无法脚本化/定时任务
  • ❌ 多仓库批量操作痛苦

二、🔧 可传参脚本改造

只需 3 行核心改动,立刻获得“交互 + 传参”双模式:

改造点 代码 作用
① 接收参数 local fast_jump="$1" 函数内拿到外部参数
② 参数赋值 choice="$fast_jump" 跳过 read,直接进入分支
③ 防死循环 fast_jump="" 用完即弃,确保 while 只跑一圈

传参脚本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
linux_git_menu() {
+ local fast_jump="$1" # ① 接收外部参数
while true; do
+ [[ -z "$fast_jump" ]] && clear # 交互模式才清屏(不需要清屏可删除此行)
+ if [[ -z "$fast_jump" ]]; then
echo -e ">>> Git 管理"
echo -e "1. 推送更新"
echo -e "2. 拉取更新"
read -r -e -p "请输入你的选择: " choice
+ else
+ choice="$fast_jump" # ② 直接赋值
+ fast_jump="" # ③ 防止死循环
+ fi


case $choice in
1) echo "✅ 执行推送更新..."; break ;;
2) echo "✅ 执行拉取更新..."; break ;;
*) echo "❌ 无效选择" ;;
esac
done
}
- linux_git_menu
+ linux_git_menu "$1" # ④ 把脚本参数透传

🌟 改造后亮点

  • 支持数字 + 英文双通道:1push 均可
  • 旧交互体验 100% 保留,向下兼容
  • 可无缝接入 CI/CD、定时任务、批量脚本

三、📊 使用对比:一行命令 vs 多次交互

场景 旧脚本 新脚本(传参)
交互菜单 bash demo_old.sh bash demo_new.sh
一键推送 ❌ 不可行 bash demo_new.sh push
一键拉取 ❌ 不可行 bash demo_new.sh pull
批量操作 ❌ 手工逐个点 for r in repo/*; do m push; done

四、🚀 高效工具箱

把长命令浓缩成 1 个字母,手感飞起!

1
2
3
chmod +x /root/mobu_script.sh
# 推荐直接放到 $PATH 并去掉后缀,例:
sudo ln -s /root/mobu_script.sh /usr/local/bin/m

五、📄 mobu_script.sh 完整示例

子命令分发版,支持 m git pushm pullm help 等写法,拿来即用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/bin/bash

linux_git_menu() {
local fast_jump=${1:-}
while true; do
[[ -z "$fast_jump" ]] && clear
if [[ -z "$fast_jump" ]]; then
echo -e ">>> Git 管理"
echo -e "1. 推送更新 📤"
echo -e "2. 拉取更新 📥"
echo -e "0. 退出 🚪"
read -r -p "请输入你的选择: " choice
else
choice=$fast_jump
fast_jump=""
fi
case $choice in
1|push) git_push; break ;;
2|pull) git_pull; break ;;
0|q|quit|exit) echo "👋 再见"; return 0 ;;
*) echo "❌ 无效选择,请输入 1/push、2/pull 或 0/quit" ;;
esac
done
}

# 使用说明函数
m_info() {
echo "用法:"
echo "一键推送 m push"
echo "一键拉取 m pull"
echo "Git子命令 m git push | m git pull" # Git子命令
echo "帮助信息 m help | m --help| m -h"
}

# 主逻辑:参数分发
if [ $# -eq 0 ]; then
# 无参数:进入交互式菜单
linux_git_menu
else
case $1 in
git)
# 处理 git 子命令:m git push 或 m git pull
linux_git_menu "${@:2}" # ${@:2} 表示从第二个参数开始的所有参数
;;
push)
# 直接推送:m push
linux_git_menu "push"
;;
pull)
# 直接拉取:m pull
linux_git_menu "pull"
;;
help|--help|-h)
# 显示帮助信息
m_info
;;
*)
# 未知命令,显示帮助
echo "未知命令: $1"
m_info
;;
esac
fi

六、🎯 实际使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 交互式
$ m
>>> Git 管理
1. 推送更新 📤
2. 拉取更新 📥
请输入你的选择: 1
✅ 执行推送更新...

# 2. 一键推送
$ m push
✅ 已推送至 origin/main

# 3. Git 子命令
$ m git pull
✅ 已拉取最新代码

# 4. 查看帮助
$ m help
用法: ...

七、💡 总结与最佳实践

原则 落地技巧
向后兼容 新增功能不删旧交互,老用户零感知
代码复用 通用逻辑封装函数,减少重复
错误处理 无效参数给出 🚩 高亮提示 + 帮助文案
颜色输出 成功=绿色 ✅,错误=红色 ❌,警告=黄色 ⚠️
日志追踪 可追加 exec >>~/mobu.log 2>&1 记录全会话

🌈 一句话:让脚本既“好看”又“好用”,把重复劳动减到最低,把效率拉满!