Gum 使用指南:編寫一個美觀的交互式腳本

文章首發於個人公號:阿拉平平

我們平時編寫腳本時,可能會涉及與用戶進行交互,比如要求輸入一些信息或者勾選某些選項。要在腳本中實現交互類需求,多少有點麻煩。最近我在逛 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 的基本用法,包含:

  1. 交互命令:介紹 Gum 中交互命令的用法和顯示效果。
  2. 使用示例:選用交互命令,編寫一個腳本。

交互命令

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)的副本數。

編寫之前,我們梳理下腳本的運行步驟:

  1. 獲取 K8s 集羣中的命名空間(Namespace)。
  2. 選擇命名空間後,獲取該空間下的 Deployment。
  3. 選擇一個或多個 Deployment 後,詢問要擴縮容的副本數。
  4. 詢問是否進行擴縮容,確認後對其擴縮容。

在這個需求中,我們會用到: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章