昨天完成了 expandPattern
用來把 pattern 轉換成檔名字串,譬如說 expandPattern("m??go")
會得到 "mango mongo"
,今天要用它來完成 Wildcard 功能
雖然昨天已經完成 expandPattern
可以用來展開 pattern,但真實的指令會長得像 ls -l m??go
,其中的 -l
是普通的參數而不是一個 pattern、m??go
才是要被展開的 pattern,所以只要針對需要展開的參數執行 expandPattern
就好,如下圖
要做到這件事情我們需要寫一個 expandWildcardInCmd
,意思是把指令中的 Wildcard 展開,而判斷某參數要不要展開的依據就是 參數有沒有包含 Wildcard 字元 *
或 ?
,有的話就展開,沒有的話就不理他
strings.Contains(str, substr string) bool
Contains
是用來判斷字串 str
裡面有沒有包含 substr
,看看下面這個小範例應該就懂了
strings.Contains("Larry is smart", "smart")) // True
strings.Contains("Larry is smart", "stupid")) // False
// 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
}
下 ls -l *.go
成功列出所有 Go 程式碼,而且現在你也知道 Wildcard 是怎麼被展開的了~~
今天寫的扣有點多,但概念上不算太難,只是處理的過程繁複了點,如果有什麼問題歡迎在下面留言,沒問題就明天見囉