1
2Description="Bash"
3
4Categories = {"script", "shell"}
5
6Identifiers=[[ [a-zA-Z_]\w*(?!\w*\/) ]]
7
8Keywords={
9  { Id=1,
10    List={"case", "in", "esac", "for", "do", "done", "function", "if", "then",
11        "fi", "elif", "else", "select", "time", "until", "while"},
12  },
13  { Id=2,
14    List={"source", "alias", "bind", "break", "builtin", "command", "continue",
15        "declare", "dirs", "disown", "enable", "export", "fc", "fg", "getopts",
16        "hash", "help", "history", "jobs",  "let", "local", "logout", "popd", "printf",
17        "pushd", "pwd", "read", "readonly", "return", "set",  "shift", "shopt",
18        "suspend", "test", "times", "trap", "type", "ulimit", "umask", "unalias",
19        "unset", "wait", "eval", "bg", "cd", "echo", "exec", "exit", "kill"},
20  },
21  { Id=3,
22    List={"ls", "cat", "tac", "rev", "cp", "mv", "rm", "rmdir", "chmod", "mkdir", "ls", "ll",
23        "chattr", "ln", "find", "xargs", "expr", "date", "zdump", "time", "touch", "at",
24        "batch", "cal", "sleep", "usleep", "hwclock", "clock", "sort", "tsort", "diff",
25        "patch", "diff3", "sdiff", "cmp", "comm", "uniq", "expand", "unexpand", "cat",
26        "paste", "join", "head", "tail", "grep", "egrep", "zgrep", "look", "sed", "awk",
27        "wc", "tr", "fold", "fmt", "ptx", "col", "column", "colrm", "nl", "pr",
28        "gettext", "iconv", "recode", "groff", "lex", "yacc", "tar", "shar", "ar",
29        "cpio", "gzip", "bzip2", "compress", "uncompress", "zip", "unzip", "sq", "file",
30        "which", "whereis", "whatis", "vdir", "shred", "locate", "slocate", "strings",
31        "basename", "dirname", "split", "sum", "cksum", "md5sum", "sha1sum", "uuencode",
32        "uudecode", "crypt", "make", "install", "more", "less", "host", "vrfy",
33        "nslookup", "dig", "traceroute", "ping", "whois", "finger", "ftp", "uucp",
34        "telnet", "rlogin", "rsh", "rcp", "ssh", "write", "mail", "vacation", "tput",
35        "reset", "clear", "script", "factor", "bc", "dc", "jot", "seq", "yes", "banner",
36        "printenv", "lp", "tee", "mkfifo", "pathchk", "dd", "od", "hexdump", "m4"},
37  },
38
39  -- fixes issue with expressions like ${SHELL="${CONFIG_SHELL-/bin/sh}"}
40  -- the [^\}]+ part fixes issue with "s#@PATH@#/opt/${pkgname}/bin/# ${pkgdir}/etc/profile.d/${pkgname}.sh"
41  { Id=4,
42    Regex=[[\$\{[^\}]+\$\{.+?\}.+?\}|\$\{.+?\}|\$\(.+?\) ]],
43  },
44  { Id=4,
45    Regex=[[ \$[\w\#]+ ]],
46  },
47  { Id=2,
48    Regex=[[ \-\-?[\w\-]+ ]],
49  },
50
51  --see OnStateChange
52  { Id=5,
53    Regex=[[ \*\[.*?\]\* ]],
54  }
55}
56
57-- hereDoc opening delimiter, see OnStateChange to handle end of string
58Strings={
59  Delimiter=[[<<[\-]?\s*["']?\s*[A-Za-z_]+["']?|"|`|']],
60}
61
62IgnoreCase=false
63
64Comments={
65  { Block=false,
66    Delimiter= { [[#]] },
67  },
68}
69
70Operators=[[\(|\)|\[|\]|\{|\}|\,|\;|\:|\&|<|>|\!|\=|\/|\*|\%|\+|\-|\|]]
71
72function OnStateChange(oldState, newState, token, kwClass)
73
74  if oldState==HL_STRING and token==hereDoc then
75    hereDoc = nil
76    return HL_STRING_END
77  end
78
79  if  (string.sub(token,1,1) =="$" )  and oldState==HL_STRING and newState==HL_KEYWORD then
80    return HL_INTERPOLATION
81  end
82
83  -- fix of code like case $1 in  *[\\\`\"\$]*)
84  if  kwClass==5 then
85    return HL_OPERATOR
86  end
87
88  if hereDoc~=nil then
89    return HL_STRING
90  end
91
92  --recognize hereDoc multine strings
93  if oldState==HL_STANDARD and newState==HL_STRING  then
94    hereDoc = string.match(token, "<<%-?%s*%'?([%-%a%d_]+)" )
95  end
96
97  return newState
98end
99