cmd_tests.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package main
  2. import (
  3. "os"
  4. "strconv"
  5. )
  6. // 测试条件
  7. func cmd_test(fields []string, stdin *os.File, stdout *os.File, stderr *os.File) {
  8. res := true // 测试结果
  9. if len(fields) == 3 { // 2个参数,默认为测试文件
  10. info, err := os.Stat(fields[2]) // 获取文件状态
  11. if err != nil {
  12. res = false
  13. } else {
  14. switch fields[1] {
  15. case "-d": // 是否为目录文件
  16. res = info.Mode().IsDir()
  17. case "-f": // 是否为普通文件
  18. res = info.Mode().IsRegular()
  19. case "-s": // 是否大小不为0
  20. res = info.Size() > 0
  21. case "-r": // 是否可读
  22. res = info.Mode()&0444 > 0
  23. case "-w": // 是否可写
  24. res = info.Mode()&0222 > 0
  25. case "-x": // 是否可执行
  26. res = info.Mode()&0111 > 0
  27. default:
  28. res = false
  29. }
  30. }
  31. } else if len(fields) == 4 { // 3个参数,默认为测试数字
  32. a, err := strconv.Atoi(os.ExpandEnv(fields[1])) // 字符串转数字
  33. if err != nil {
  34. panic("test: integer expression expected: " + os.ExpandEnv(fields[1]))
  35. }
  36. b, err := strconv.Atoi(os.ExpandEnv(fields[3])) // 字符串转数字
  37. if err != nil {
  38. panic("test: integer expression expected: " + os.ExpandEnv(fields[3]))
  39. }
  40. switch fields[2] {
  41. case "-eq": // 是否相等
  42. res = a == b
  43. case "-ge": // 是否大于等于
  44. res = a >= b
  45. case "-gt": // 是否大于
  46. res = a > b
  47. case "-le": // 是否小于等于
  48. res = a <= b
  49. case "-lt": // 是否小于
  50. res = a < b
  51. case "-ne": // 是否不等于
  52. res = a != b
  53. case "==": // 是否等于
  54. res = a == b
  55. case "!=": // 是否不等于
  56. res = a != b
  57. default:
  58. res = false
  59. }
  60. }
  61. if !res { // 如果条件为假,则退出状态不为0
  62. panic("")
  63. }
  64. }