package main import ( "os" "strconv" ) // 测试条件 func cmd_test(fields []string, stdin *os.File, stdout *os.File, stderr *os.File) { res := true // 测试结果 if len(fields) == 3 { // 2个参数,默认为测试文件 info, err := os.Stat(fields[2]) // 获取文件状态 if err != nil { res = false } else { switch fields[1] { case "-d": // 是否为目录文件 res = info.Mode().IsDir() case "-f": // 是否为普通文件 res = info.Mode().IsRegular() case "-s": // 是否大小不为0 res = info.Size() > 0 case "-r": // 是否可读 res = info.Mode()&0444 > 0 case "-w": // 是否可写 res = info.Mode()&0222 > 0 case "-x": // 是否可执行 res = info.Mode()&0111 > 0 default: res = false } } } else if len(fields) == 4 { // 3个参数,默认为测试数字 a, err := strconv.Atoi(os.ExpandEnv(fields[1])) // 字符串转数字 if err != nil { panic("test: integer expression expected: " + os.ExpandEnv(fields[1])) } b, err := strconv.Atoi(os.ExpandEnv(fields[3])) // 字符串转数字 if err != nil { panic("test: integer expression expected: " + os.ExpandEnv(fields[3])) } switch fields[2] { case "-eq": // 是否相等 res = a == b case "-ge": // 是否大于等于 res = a >= b case "-gt": // 是否大于 res = a > b case "-le": // 是否小于等于 res = a <= b case "-lt": // 是否小于 res = a < b case "-ne": // 是否不等于 res = a != b case "==": // 是否等于 res = a == b case "!=": // 是否不等于 res = a != b default: res = false } } if !res { // 如果条件为假,则退出状态不为0 panic("") } }