fileTypes sh bash zsh bashrc bash_profile bash_login profile bash_logout .textmate_init firstLineMatch ^#!.*\b(bash|zsh|sh|tcsh)|^#\s*-\*-[^*]*mode:\s*shell-script[^*]*-\*- keyEquivalent ^~S name Shell Script (Bash) patterns include #comment include #pipeline include #list include #compound-command include #loop include #function-definition include #string include #variable include #interpolation include #heredoc include #herestring include #redirection include #pathname include #keyword include #support repository case-clause patterns begin (?=\S) end ;; endCaptures 0 name punctuation.terminator.case-clause.shell name meta.scope.case-clause.shell patterns begin (\(|(?=\S)) captures 0 name punctuation.definition.case-pattern.shell end \) name meta.scope.case-pattern.shell patterns match \| name punctuation.separator.pipe-sign.shell include #string include #variable include #interpolation include #pathname begin (?<=\)) end (?=;;) name meta.scope.case-clause-body.shell patterns include $self comment begin (^[ \t]+)?(?<!\S)(?=#)(?!#\{) beginCaptures 1 name punctuation.whitespace.comment.leading.shell end (?!\G) patterns begin # beginCaptures 0 name punctuation.definition.comment.shell end \n name comment.line.number-sign.shell compound-command patterns begin (\[{2}) captures 1 name punctuation.definition.logical-expression.shell end (\]{2}) name meta.scope.logical-expression.shell patterns include #logical-expression include $self begin (\({2}) beginCaptures 0 name punctuation.definition.string.begin.shell end (\){2}) endCaptures 0 name punctuation.definition.string.end.shell name string.other.math.shell patterns include #math begin (\() captures 1 name punctuation.definition.subshell.shell end (\)) name meta.scope.subshell.shell patterns include $self begin (?<=\s|^)(\{)(?=\s|$) captures 1 name punctuation.definition.group.shell end (?<=^|;)\s*(\}) name meta.scope.group.shell patterns include $self function-definition patterns begin \b(function)\s+([^\s\\]+)(?:\s*(\(\)))? beginCaptures 1 name storage.type.function.shell 2 name entity.name.function.shell 3 name punctuation.definition.arguments.shell end ;|&|$ endCaptures 0 name punctuation.definition.function.shell name meta.function.shell patterns include $self begin \b([^\s\\=]+)\s*(\(\)) beginCaptures 1 name entity.name.function.shell 2 name punctuation.definition.arguments.shell end ;|&|$ endCaptures 0 name punctuation.definition.function.shell name meta.function.shell patterns include $self heredoc patterns begin (<<)-("|'|)(RUBY)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName source.ruby.embedded.shell end ^\t*(RUBY)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.no-indent.ruby.shell patterns include source.ruby begin (<<)("|'|)(RUBY)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName source.ruby.embedded.shell end ^(RUBY)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.ruby.shell patterns include source.ruby begin (<<)-("|'|)(PYTHON)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName source.python.embedded.shell end ^\t*(PYTHON)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.no-indent.python.shell patterns include source.python begin (<<)("|'|)(PYTHON)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName source.python.embedded.shell end ^(PYTHON)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.python.shell patterns include source.python begin (<<)-("|'|)(APPLESCRIPT)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName source.applescript.embedded.shell end ^\t*(APPLESCRIPT)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.no-indent.applescript.shell patterns include source.applescript begin (<<)("|'|)(APPLESCRIPT)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName source.applescript.embedded.shell end ^(APPLESCRIPT)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.applescript.shell patterns include source.applescript begin (<<)-("|'|)(HTML)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName text.html.embedded.shell end ^\t*(HTML)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.no-indent.html.shell patterns include text.html.basic begin (<<)("|'|)(HTML)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName text.html.embedded.shell end ^(HTML)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.html.shell patterns include text.html.basic begin (<<)-("|'|)(MARKDOWN)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName text.html.markdown.embedded.shell end ^\t*(MARKDOWN)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.no-indent.markdown.shell patterns include text.html.markdown begin (<<)("|'|)(MARKDOWN)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName text.html.markdown.embedded.shell end ^(MARKDOWN)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.markdown.shell patterns include text.html.markdown begin (<<)-("|'|)(TEXTILE)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName text.html.textile.embedded.shell end ^\t*(TEXTILE)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.no-indent.textile.shell patterns include text.html.textile begin (<<)("|'|)(TEXTILE)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell contentName text.html.textile.embedded.shell end ^(TEXTILE)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.textile.shell patterns include text.html.textile begin (<<)-("|'|)\\?(\w+)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell end ^\t*(\3)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.no-indent.shell begin (<<)("|'|)\\?(\w+)\2 beginCaptures 1 name keyword.operator.heredoc.shell 3 name keyword.control.heredoc-token.shell captures 0 name punctuation.definition.string.shell end ^(\3)\b endCaptures 1 name keyword.control.heredoc-token.shell name string.unquoted.heredoc.shell herestring patterns captures 1 name keyword.operator.herestring.shell 2 name string.quoted.single.herestring.shell 3 name punctuation.definition.string.begin.shell 4 name punctuation.definition.string.end.shell match (<<<)((')[^']*(')) name meta.herestring.shell captures 1 name keyword.operator.herestring.shell 2 name string.quoted.double.herestring.shell 3 name punctuation.definition.string.begin.shell 6 name punctuation.definition.string.end.shell match (<<<)((")(\\("|\\)|[^"])*(")) name meta.herestring.shell captures 1 name keyword.operator.herestring.shell 2 name string.unquoted.herestring.shell match (<<<)(([^\s\\]|\\.)+) name meta.herestring.shell interpolation patterns begin \$\({2} beginCaptures 0 name punctuation.definition.string.begin.shell end \){2} endCaptures 0 name punctuation.definition.string.end.shell name string.other.math.shell patterns include #math begin ` beginCaptures 0 name punctuation.definition.string.begin.shell end ` endCaptures 0 name punctuation.definition.string.end.shell name string.interpolated.backtick.shell patterns match \\[`\\$] name constant.character.escape.shell include $self begin \$\( beginCaptures 0 name punctuation.definition.string.begin.shell end \) endCaptures 0 name punctuation.definition.string.end.shell name string.interpolated.dollar.shell patterns include $self keyword patterns match \b(?:if|then|else|elif|fi|for|in|do|done|select|case|continue|esac|while|until|return)\b name keyword.control.shell match (?<![-/])\b(?:export|declare|typeset|local|readonly)\b name storage.modifier.shell list patterns match ;|&&|&|\|\| name keyword.operator.list.shell logical-expression patterns comment do we want a special rule for ( expr )? match =[=~]?|!=?|<|>|&&|\|\| name keyword.operator.logical.shell match (?<!\S)-(nt|ot|ef|eq|ne|l[te]|g[te]|[a-hknoprstuwxzOGLSN]) name keyword.operator.logical.shell loop patterns begin \b(for)\s+(?=\({2}) captures 1 name keyword.control.shell end \b(done)\b name meta.scope.for-loop.shell patterns include $self begin \b(for)\s+((?:[^\s\\]|\\.)+)\b beginCaptures 1 name keyword.control.shell 2 name variable.other.loop.shell end \b(done)\b endCaptures 1 name keyword.control.shell name meta.scope.for-in-loop.shell patterns include $self begin \b(while|until)\b captures 1 name keyword.control.shell end \b(done)\b name meta.scope.while-loop.shell patterns include $self begin \b(select)\s+((?:[^\s\\]|\\.)+)\b beginCaptures 1 name keyword.control.shell 2 name variable.other.loop.shell end \b(done)\b endCaptures 1 name keyword.control.shell name meta.scope.select-block.shell patterns include $self begin \b(case)\b captures 1 name keyword.control.shell end \b(esac)\b name meta.scope.case-block.shell patterns begin \b(?:in)\b beginCaptures 1 name keyword.control.shell end (?=\b(?:esac)\b) name meta.scope.case-body.shell patterns include #comment include #case-clause include $self include $self begin (^|(?<=[&;|]))\s*(if)\b beginCaptures 2 name keyword.control.shell comment Restrict match to avoid matching in lines like `dd if=/dev/sda1 …` end \b(fi)\b endCaptures 1 name keyword.control.shell name meta.scope.if-block.shell patterns include $self math patterns include #variable match \+{1,2}|-{1,2}|!|~|\*{1,2}|/|%|<[<=]?|>[>=]?|==|!=|\^|\|{1,2}|&{1,2}|\?|\:|,|=|[*/%+\-&^|]=|<<=|>>= name keyword.operator.arithmetic.shell match 0[xX]\h+ name constant.numeric.hex.shell match 0\d+ name constant.numeric.octal.shell match \d{1,2}#[0-9a-zA-Z@_]+ name constant.numeric.other.shell match \d+ name constant.numeric.integer.shell pathname patterns match (?<=\s|:|=|^)~ name keyword.operator.tilde.shell match \*|\? name keyword.operator.glob.shell begin ([?*+@!])(\() beginCaptures 1 name keyword.operator.extglob.shell 2 name punctuation.definition.extglob.shell end (\)) endCaptures 1 name punctuation.definition.extglob.shell name meta.structure.extglob.shell patterns include $self pipeline patterns match \b(time)\b name keyword.other.shell match [|!] name keyword.operator.pipe.shell redirection patterns begin [><]\( beginCaptures 0 name punctuation.definition.string.begin.shell end \) endCaptures 0 name punctuation.definition.string.end.shell name string.interpolated.process-substitution.shell patterns include $self comment valid: &>word >&word >word [n]>&[n] [n]<word [n]>word [n]>>word [n]<&word (last one is duplicate) match &>|\d*>&\d*|\d*(>>|>|<)|\d*<&|\d*<> name keyword.operator.redirect.shell string patterns match \\. name constant.character.escape.shell begin ' beginCaptures 0 name punctuation.definition.string.begin.shell end ' endCaptures 0 name punctuation.definition.string.end.shell name string.quoted.single.shell begin \$?" beginCaptures 0 name punctuation.definition.string.begin.shell end " endCaptures 0 name punctuation.definition.string.end.shell name string.quoted.double.shell patterns match \\[\$`"\\\n] name constant.character.escape.shell include #variable include #interpolation begin \$' beginCaptures 0 name punctuation.definition.string.begin.shell end ' endCaptures 0 name punctuation.definition.string.end.shell name string.quoted.single.dollar.shell patterns match \\(a|b|e|f|n|r|t|v|\\|') name constant.character.escape.ansi-c.shell match \\[0-9]{3} name constant.character.escape.octal.shell match \\x[0-9a-fA-F]{2} name constant.character.escape.hex.shell match \\c. name constant.character.escape.control-char.shell support patterns match (?<=^|\s)(?::|\.)(?=\s|;|&|$) name support.function.builtin.shell match (?<![-/])\b(?:alias|bg|bind|break|builtin|caller|cd|command|compgen|complete|dirs|disown|echo|enable|eval|exec|exit|false|fc|fg|getopts|hash|help|history|jobs|kill|let|logout|popd|printf|pushd|pwd|read|readonly|set|shift|shopt|source|suspend|test|times|trap|true|type|ulimit|umask|unalias|unset|wait)\b name support.function.builtin.shell variable patterns captures 1 name punctuation.definition.variable.shell match (\$)[a-zA-Z_][a-zA-Z0-9_]* name variable.other.normal.shell captures 1 name punctuation.definition.variable.shell match (\$)[-*@#?$!0_] name variable.other.special.shell captures 1 name punctuation.definition.variable.shell match (\$)[1-9] name variable.other.positional.shell begin \$\{ captures 0 name punctuation.definition.variable.shell end \} name variable.other.bracket.shell patterns match !|:[-=?+]?|\*|@|#{1,2}|%{1,2}|/ name keyword.operator.expansion.shell captures 1 name punctuation.section.array.shell 3 name punctuation.section.array.shell match (\[)([^\]]+)(\]) include #string include #variable include #interpolation scopeName source.shell uuid DDEEA3ED-6B1C-11D9-8B10-000D93589AF6