iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
1

前言

昨天完成了 expandPattern 用來把 pattern 轉換成檔名字串,譬如說 expandPattern("m??go") 會得到 "mango mongo",今天要用它來完成 Wildcard 功能

實作

雖然昨天已經完成 expandPattern 可以用來展開 pattern,但真實的指令會長得像 ls -l m??go,其中的 -l 是普通的參數而不是一個 pattern、m??go 才是要被展開的 pattern,所以只要針對需要展開的參數執行 expandPattern 就好,如下圖

要做到這件事情我們需要寫一個 expandWildcardInCmd,意思是把指令中的 Wildcard 展開,而判斷某參數要不要展開的依據就是 參數有沒有包含 Wildcard 字元 *?,有的話就展開,沒有的話就不理他

會用到的 function

  • strings.Contains(str, substr string) bool

    Contains 是用來判斷字串 str 裡面有沒有包含 substr,看看下面這個小範例應該就懂了

    strings.Contains("Larry is smart", "smart"))    // True
    strings.Contains("Larry is smart", "stupid"))   // False
    

expandWildcardInCmd

// Usage: 
// expandWildcardInCmd("ls -l m??go") == "ls -l mango mongo"
//
func expandWildcardInCmd(input string) string {
    // 把字串切成好幾個參數
    // "ls -l m??go" -> ["ls", "-l", "m??go"]
    args := strings.Split(input, " ")
    
    // 把每個參數跑過一遍
    for i, arg := range args {
        // 如果參數有包含 * 或 ?,就用 expandPattern 進行展開
        // 如果沒有包含,就什麼都不做
        if strings.Contains(arg, "*") || strings.Contains(arg, "?") {
            args[i] = expandPattern(arg)
        }
        
        // "ls" -> "ls"
        // "-l" -> "-l"
        // "m??go" -> "mango mongo"
    }
    
    // 把 []string 組合起來
    // ["ls", "-l", "mango mongo"] -> "ls -l mango mongo"
    return strings.Join(args, " ")
}

接著在 executeInput 裡面使用 expandWildcardInCmd 就可以正確的把 Wildcard 字元展開了 ???

func executeInput(input string) error {
    // ...
    
    // "ls -l m??go"  ->  "ls -l mango mongo"
    input = expandWildcardInCmd(input)
    
    // execute command
}

Demo

ls -l *.go 成功列出所有 Go 程式碼,而且現在你也知道 Wildcard 是怎麼被展開的了~~

小結

View commit on Github

今天寫的扣有點多,但概念上不算太難,只是處理的過程繁複了點,如果有什麼問題歡迎在下面留言,沒問題就明天見囉


上一篇
Day17-wildcard 萬用字元(一)
下一篇
Day19-.goshrc 設定檔(一)
系列文
Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言