文章首发于个人公号:阿拉平平
我们平时编写脚本时,可能会涉及与用户进行交互,比如要求输入一些信息或者勾选某些选项。要在脚本中实现交互类需求,多少有点麻烦。最近我在逛 GitHub 时,无意间发现了一个用于美化交互示脚本的工具,于是尝试了下。
项目介绍
Gum[1] 是一个基于 Golang 开发的脚本美化工具,它提供了许多现成的工具来帮助用户编写更好用的脚本。本文将介绍 Gum 的安装和使用方法。
下载安装
Gum 目前最新版本为 0.2.0,可以到 releases 下找到对应的安装包。以 rpm 包为例:
wget https://github.com/charmbracelet/gum/releases/download/v0.2.0/gum_0.2.0_linux_amd64.rpm
安装 rpm 包:
rpm -ivh gum_0.2.0_linux_amd64.rpm
检查 Gum 版本:
gum -v
gum version v0.2.0 (b7f04e0)
基本用法
本章将介绍 Gum 的基本用法,包含:
- 交互命令:介绍 Gum 中交互命令的用法和显示效果。
- 使用示例:选用交互命令,编写一个脚本。
交互命令
Input:提示输入一个简单的命令。
gum input --placeholder "Please input"
显示效果如下:
Write:提示输入多行文本。
gum write > test.txt
显示效果如下:
Filter:使用模糊查询来过滤一个列表。
cat test.txt | gum filter
显示效果如下:
Choose:从列表中选择多个选项。
# 单选
cat test.txt | gum choose
# 多选,限制数量
cat test.txt | gum choose --limit 2
# 多选,不限制数量
cat test.txt | gum choose --no-limit
显示效果如下:
Confirm:确认是否执行操作。
gum confirm && echo "confirm" || echo "cancel"
显示效果如下:
Spin:运行命令时显示一个 spinner。
gum spin --spinner dot --title "Testing..." -- sleep 2
显示效果如下:
示例
接下来,我打算借助 Gum 来编写一个脚本,这个脚本用于批量调整 K8s 集群中无状态应用(Deployment)的副本数。
编写之前,我们梳理下脚本的运行步骤:
- 获取 K8s 集群中的命名空间(Namespace)。
- 选择命名空间后,获取该空间下的 Deployment。
- 选择一个或多个 Deployment 后,询问要扩缩容的副本数。
- 询问是否进行扩缩容,确认后对其扩缩容。
在这个需求中,我们会用到:Filter,Choose,Input,Confirm。完整的脚本如下:
#!/bin/bash
NS=$(kubectl get ns -o custom-columns=NAME:.metadata.name --no-headers|gum filter)
DEPLOY=$(kubectl get deploy -n $NS -o custom-columns=NAME:.metadata.name --no-headers|gum choose --no-limit)
REPLICAS=$(gum input --placeholder="Please input replicas")
gum confirm "Scale deploy?" && kubectl scale deploy --replicas=$REPLICAS $DEPLOY -n $NS || echo "Scale cancelled!"
脚本运行的效果如下:
写在最后
通过 Gum,我们可以用很少的代码就实现一个美观的交互类脚本。当然,Gum 除了内置的交互类命令,还支持格式化展示文本、自定义样式。
References
[1] Gum: https://github.com/charmbracelet/gum
网友评论