脚本传参详解:打造高效智能的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" # ④ 把脚本参数透传
|
🌟 改造后亮点
- 支持数字 + 英文双通道:
1 或 push 均可
- 旧交互体验 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 push、m pull、m 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 记录全会话 |
🌈 一句话:让脚本既“好看”又“好用”,把重复劳动减到最低,把效率拉满!