文章首發於個人公號:阿拉平平
我們平時編寫腳本時,可能會涉及與用戶進行交互,比如要求輸入一些信息或者勾選某些選項。要在腳本中實現交互類需求,多少有點麻煩。最近我在逛 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