# Encoding: UTF-8

{fileTypes: 
  ["sh",
   "ss",
   "bashrc",
   "bash_profile",
   "bash_login",
   "profile",
   "bash_logout",
   ".textmate_init"],
 firstLineMatch: "^#!.*\\b(bash|zsh|sh|tcsh)",
 foldingStartMarker: /\b(?<_1>if|case)\b|(?<_2>\{|\b(?<_3>do)\b)$/,
 foldingStopMarker: /^\s*(?<_1>\}|(?<_2>done|fi|esac)\b)/,
 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: /(?<_1>\(|(?=\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: 
    {patterns: 
      [{captures: {1 => {name: "punctuation.definition.comment.shell"}},
        match: /(?<!\$)(?<_1>#)(?!\{).*$\n?/,
        name: "comment.line.number-sign.shell"}]},
   :"compound-command" => 
    {patterns: 
      [{begin: /(?<_1>\[{2})/,
        captures: 
         {1 => {name: "punctuation.definition.logical-expression.shell"}},
        end: "(\\]{2})",
        name: "meta.scope.logical-expression.shell",
        patterns: [{include: "#logical-expression"}, {include: "$self"}]},
       {begin: /(?<_1>\({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: /(?<_1>\()/,
        captures: {1 => {name: "punctuation.definition.subshell.shell"}},
        end: "(\\))",
        name: "meta.scope.subshell.shell",
        patterns: [{include: "$self"}]},
       {begin: /(?<=\s|^)(?<_1>\{)(?=\s|$)/,
        captures: {1 => {name: "punctuation.definition.group.shell"}},
        end: "(?<=^|;)\\s*(\\})",
        name: "meta.scope.group.shell",
        patterns: [{include: "$self"}]}]},
   :"function-definition" => 
    {patterns: 
      [{begin: /\b(?<_1>function)\s+(?<_2>[^\s\\]+)(?:\s*(?<_3>\(\)))?/,
        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(?<_1>[^\s\\=]+)\s*(?<_2>\(\))/,
        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: /(?<_1><<)-(?<_2>"|'|)(?<_3>RUBY)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.no-indent.ruby.shell",
        patterns: [{include: "source.ruby"}]},
       {begin: /(?<_1><<)(?<_2>"|'|)(?<_3>RUBY)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.ruby.shell",
        patterns: [{include: "source.ruby"}]},
       {begin: /(?<_1><<)-(?<_2>"|'|)(?<_3>PYTHON)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.no-indent.python.shell",
        patterns: [{include: "source.python"}]},
       {begin: /(?<_1><<)(?<_2>"|'|)(?<_3>PYTHON)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.python.shell",
        patterns: [{include: "source.python"}]},
       {begin: /(?<_1><<)-(?<_2>"|'|)(?<_3>APPLESCRIPT)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.no-indent.applescript.shell",
        patterns: [{include: "source.applescript"}]},
       {begin: /(?<_1><<)(?<_2>"|'|)(?<_3>APPLESCRIPT)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.applescript.shell",
        patterns: [{include: "source.applescript"}]},
       {begin: /(?<_1><<)-(?<_2>"|'|)(?<_3>HTML)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.no-indent.html.shell",
        patterns: [{include: "text.html.basic"}]},
       {begin: /(?<_1><<)(?<_2>"|'|)(?<_3>HTML)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.html.shell",
        patterns: [{include: "text.html.basic"}]},
       {begin: /(?<_1><<)-(?<_2>"|'|)(?<_3>MARKDOWN)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.no-indent.markdown.shell",
        patterns: [{include: "text.html.markdown"}]},
       {begin: /(?<_1><<)(?<_2>"|'|)(?<_3>MARKDOWN)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.markdown.shell",
        patterns: [{include: "text.html.markdown"}]},
       {begin: /(?<_1><<)-(?<_2>"|'|)(?<_3>TEXTILE)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.no-indent.textile.shell",
        patterns: [{include: "text.html.textile"}]},
       {begin: /(?<_1><<)(?<_2>"|'|)(?<_3>TEXTILE)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.textile.shell",
        patterns: [{include: "text.html.textile"}]},
       {begin: /(?<_1><<)-(?<_2>"|'|)\\?(?<_3>\w+)\k<_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)$",
        endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}},
        name: "string.unquoted.heredoc.no-indent.shell"},
       {begin: /(?<_1><<)(?<_2>"|'|)\\?(?<_3>\w+)\k<_2>/,
        beginCaptures: 
         {1 => {name: "keyword.operator.heredoc.shell"},
          3 => {name: "keyword.control.heredoc-token.shell"}},
        captures: {0 => {name: "punctuation.definition.string.shell"}},
        end: "^(\\3)$",
        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: /(?<_1><<<)(?<_2>(?<_3>')[^']*(?<_4>'))/,
        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: /(?<_1><<<)(?<_2>(?<_3>")(?<_4>\\(?<_5>"|\\)|[^"])*(?<_6>"))/,
        name: "meta.herestring.shell"},
       {captures: 
         {1 => {name: "keyword.operator.herestring.shell"},
          2 => {name: "string.unquoted.herestring.shell"}},
        match: /(?<_1><<<)(?<_2>(?<_3>[^\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: /-(?<_1>nt|ot|ef|eq|ne|l[te]|g[te]|[a-hknoprstuwxzOGLSN])/,
        name: "keyword.operator.logical.shell"}]},
   loop: 
    {patterns: 
      [{begin: /\b(?<_1>for)\s+(?=\({2})/,
        captures: {1 => {name: "keyword.control.shell"}},
        end: "\\b(done)\\b",
        name: "meta.scope.for-loop.shell",
        patterns: [{include: "$self"}]},
       {begin: /\b(?<_1>for)\s+(?<_2>(?:[^\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(?<_1>while|until)\b/,
        captures: {1 => {name: "keyword.control.shell"}},
        end: "\\b(done)\\b",
        name: "meta.scope.while-loop.shell",
        patterns: [{include: "$self"}]},
       {begin: /\b(?<_1>select)\s+(?<_2>(?:[^\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(?<_1>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: /\b(?<_1>if)\b/,
        captures: {1 => {name: "keyword.control.shell"}},
        end: "\\b(fi)\\b",
        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: /(?<_1>[?*+@!])(?<_2>\()/,
        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(?<_1>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*(?<_1>>>|>|<)|\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: /\\(?<_1>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|local|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: /(?<_1>\$)[-*@#?$!0_]/,
        name: "variable.other.special.shell"},
       {captures: {1 => {name: "punctuation.definition.variable.shell"}},
        match: /(?<_1>\$)[1-9]/,
        name: "variable.other.positional.shell"},
       {captures: {1 => {name: "punctuation.definition.variable.shell"}},
        match: /(?<_1>\$)[a-zA-Z_][a-zA-Z0-9_]*/,
        name: "variable.other.normal.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: /(?<_1>\[)(?<_2>[^\]]+)(?<_3>\])/}]}]}},
 scopeName: "source.shell",
 uuid: "DDEEA3ED-6B1C-11D9-8B10-000D93589AF6"}
