iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 3
1
Software Development

Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單系列 第 3

Day03-開工囉

前言

今天是鐵人賽的第三天,總算是要開始寫扣囉~因為今年打算更專注在實作 Shell,而且 Go 很好學,所以不會像去年一樣再把 Go 語法講過一次,如果你對 Go 不太熟的話可以參考我去年的 Go 語法 IGo 語法 III,應該就能看懂底下的實作

Gosh

不知道各位有沒有聽過這句話「電腦科學領域中最難的兩件事:快取失效和命名」

There are only two hard things in Computer Science: cache invalidation and naming things.

但要開發一個 Shell 總得給它取個名字吧,因為是用 Go 寫的 Shell 所以乾脆就直接叫 Gosh,聽起來比 zsh 什麼的有氣勢多了。之後的程式碼也都會放在 Github 上 Larry850806/Gosh,歡迎大家 clone 下來編譯跑跑看

今日目標

因為 Shell 讀取指令是一行一行讀的,今天要做到最基本的逐行讀取指令並且 echo 出來

會用到的 function

  • bufio.NewReader

    bufio 是 Go 裡面專門在處理讀取跟寫入的 package,他的 bufio.NewReader 可以用來把輸入源(譬如說使用者輸入)轉成 bufio.Reader 型別,這個型別 支援很多進階的讀取操作

  • (bufio.Reader) ReadString

    bufio.Reader 這個型別的變數有一個 function 叫做 ReadString 可以用,它可以用來分段讀取,譬如說以換行字元 \n 做為分隔進行讀取,那就可以做到逐行讀取的功能

  • strings.TrimSpace

    strings 是專門用來處理字串的 package,其中的 strings.TrimSpace 可以用來去除字串頭尾多餘的空白

實作

func main() {
    // 把使用者輸入轉換成 bufio.Reader 型別
    stdin := bufio.NewReader(os.Stdin)

    for {
        // 簡單的 prompt
        fmt.Print("> ")

        // 逐行讀取使用者輸入,並且去除頭尾的空白
        input, _ := stdin.ReadString('\n')
        input = strings.TrimSpace(input)

        // 輸出
        fmt.Println(input)
    }
}

首先把使用者的輸入 os.Stdin 轉成 bufio.Reader 型別,然後用個無窮迴圈不斷讀取使用者輸入,並輸出一樣的內容

編譯並執行

小結

目前已經有點 Shell 的樣子了~其實沒有想像中難對吧,今天的 commit 放在 這裡,有任何問題歡迎在下方留言,沒問題的話明天就要來實作執行指令的部分囉

參考資料


上一篇
Day02-Shell 是什麼?
下一篇
Day04-Process & Standard IO
系列文
Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單30

尚未有邦友留言

立即登入留言