iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
1

前言

昨天前天已經寫好三個實用的 function,分別是 setAliasunsetAliasexpandAlias,今日目標是要用它們來完成 alias 跟 unalias 的功能~

實作

會用到的 function

  • strings.Trim

    Trim 可以用來把頭尾多餘的字元刪掉,譬如說 Trim("'ls -la'", "'") 就可以把 'ls -l' 頭尾的單引號刪掉,得到 ls -l 字串

alias

實作 alias 指令不會很難,但雙引號跟單引號有點多,請大家張大眼睛仔細看 ?

func executeInput(input string) error {
    // ...

    // 如果使用者輸入 alias 開頭的指令
    // 譬如說 alias gst='git status'
    // args = ["alias", "gst='git status'"]
    if args[0] == "alias" {
        // 把 args[1] 切成左右兩邊,變成 key 跟 value
        // kv = ["gst", "'git status'"]
        kv := strings.Split(args[1], "=")
        
        // 把 value 的單引號去掉取得真正的 value
        // key = "gst", val = "git status"
        key, val := kv[0], strings.Trim(kv[1], "'")
        setAlias(key, val)
        
        // 沒有錯誤發生
        return nil
    }

    // ...
}

unalias

unalias 的部分簡單一些,沒有單引號的問題,所以不需要用到 strings.Trim

func executeInput(input string) error {
    // ...

    // args = ["unalias", "gst"]
    if args[0] == "unalias" {
        // key = "gst"
        key := args[1]
        
        // unsetAlias("gst")
        unsetAlias(key)
        return nil
    }

    // ...
}

expandAlias

把使用者輸入的指令展開,直接用昨天寫好的 expandAlias 就可以了

func executeInput(input string) error {
    // ...

    // 把使用者的輸入根據 alias 進行 expandAlias
    // Ex:  "gst"   ->  "git status"
    // Ex: "ls -h"  ->  "ls -l -h"
    input = expandAlias(input)

    // ...
}

大功告成 ???

Demo

alias

git status 是我最常用的指令之一,把它縮寫成 gst 可以大幅提高效率

unalias

下了 unalias 之後就找不到 gst 了,因為他已經不在 Alias Table 中

小結

View commit on Github

今天寫的扣也滿多的,尤其很多單雙引號那邊真的是看到眼花撩亂,還好最後總算是完成了

對於程式碼有任何問題的話歡迎在下方提問,沒問題的話明天就要來說說 alias 的最後一部分:\command


上一篇
Day13-alias 指令別名(二)
下一篇
Day15-alias 指令別名(四)
系列文
Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言